diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index cd180fd..83d492c 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -55,6 +55,9 @@
 
 LOCAL_STATIC_LIBRARIES := \
         libstagefright_aacdec \
+        libstagefright_amrnbdec \
+        libstagefright_amrnb_common \
+        libstagefright_amrwbdec \
         libstagefright_mp3dec
 
 endif
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 07508e7..093e2e0 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -20,6 +20,8 @@
 
 #if BUILD_WITH_FULL_STAGEFRIGHT
 #include "include/AACDecoder.h"
+#include "include/AMRNBDecoder.h"
+#include "include/AMRWBDecoder.h"
 #include "include/MP3Decoder.h"
 #endif
 
@@ -292,6 +294,10 @@
 #if BUILD_WITH_FULL_STAGEFRIGHT
     if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
         return new AACDecoder(source);
+    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) {
+        return new AMRNBDecoder(source);
+    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) {
+        return new AMRWBDecoder(source);
     } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
         return new MP3Decoder(source);
     }
diff --git a/media/libstagefright/codecs/amrnb/Android.mk b/media/libstagefright/codecs/amrnb/Android.mk
new file mode 100644
index 0000000..2e43120
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/Android.mk
@@ -0,0 +1,4 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/media/libstagefright/codecs/amrnb/common/Android.mk b/media/libstagefright/codecs/amrnb/common/Android.mk
new file mode 100644
index 0000000..b22be77
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/Android.mk
@@ -0,0 +1,74 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	src/add.cpp \
+ 	src/az_lsp.cpp \
+ 	src/bitno_tab.cpp \
+ 	src/bitreorder_tab.cpp \
+ 	src/bits2prm.cpp \
+ 	src/bytesused.cpp \
+ 	src/c2_9pf_tab.cpp \
+ 	src/copy.cpp \
+ 	src/div_32.cpp \
+ 	src/div_s.cpp \
+ 	src/extract_h.cpp \
+ 	src/extract_l.cpp \
+ 	src/gains_tbl.cpp \
+ 	src/gc_pred.cpp \
+ 	src/gmed_n.cpp \
+ 	src/grid_tbl.cpp \
+ 	src/gray_tbl.cpp \
+ 	src/int_lpc.cpp \
+ 	src/inv_sqrt.cpp \
+ 	src/inv_sqrt_tbl.cpp \
+ 	src/l_abs.cpp \
+ 	src/l_deposit_h.cpp \
+ 	src/l_deposit_l.cpp \
+ 	src/l_shr_r.cpp \
+ 	src/log2.cpp \
+ 	src/log2_norm.cpp \
+ 	src/log2_tbl.cpp \
+ 	src/lsfwt.cpp \
+ 	src/lsp.cpp \
+ 	src/lsp_az.cpp \
+ 	src/lsp_lsf.cpp \
+ 	src/lsp_lsf_tbl.cpp \
+ 	src/lsp_tab.cpp \
+ 	src/mult_r.cpp \
+ 	src/norm_l.cpp \
+ 	src/norm_s.cpp \
+ 	src/overflow_tbl.cpp \
+ 	src/ph_disp_tab.cpp \
+ 	src/pow2.cpp \
+ 	src/pow2_tbl.cpp \
+ 	src/pred_lt.cpp \
+ 	src/q_plsf.cpp \
+ 	src/q_plsf_3.cpp \
+ 	src/q_plsf_3_tbl.cpp \
+ 	src/q_plsf_5.cpp \
+ 	src/q_plsf_5_tbl.cpp \
+ 	src/qua_gain_tbl.cpp \
+ 	src/reorder.cpp \
+ 	src/residu.cpp \
+ 	src/round.cpp \
+ 	src/set_zero.cpp \
+ 	src/shr.cpp \
+ 	src/shr_r.cpp \
+ 	src/sqrt_l.cpp \
+ 	src/sqrt_l_tbl.cpp \
+ 	src/sub.cpp \
+ 	src/syn_filt.cpp \
+ 	src/vad1.cpp \
+ 	src/weight_a.cpp \
+ 	src/window_tab.cpp
+
+LOCAL_C_INCLUDES := \
+        $(LOCAL_PATH)/include
+
+LOCAL_CFLAGS := \
+        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF= -DOSCL_EXPORT_REF=
+
+LOCAL_MODULE := libstagefright_amrnb_common
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/amrnb/common/include/abs_s.h b/media/libstagefright/codecs/amrnb/common/include/abs_s.h
new file mode 100644
index 0000000..e92eaf4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/abs_s.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/abs_s.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for abs_s function.
+
+ Description: Updated template to make it build for Symbian.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the abs_s function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef ABS_S_H
+#define ABS_S_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 abs_s(Word16 var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* ABS_S_H */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/add.h b/media/libstagefright/codecs/amrnb/common/include/add.h
new file mode 100644
index 0000000..43daeca
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/add.h
@@ -0,0 +1,116 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/add.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Created separate header file for add function.
+
+ Description: Changed function prototype; pointer to  overflow flag is passed
+              in as a parameter.
+
+ Description: Updated copyright section.
+              Changed "overflow" to "pOverflow" in the function prototype.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                           Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the add function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef ADD_H
+#define ADD_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 add(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ADD_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/az_lsp.h b/media/libstagefright/codecs/amrnb/common/include/az_lsp.h
new file mode 100644
index 0000000..3e15ba3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/az_lsp.h
@@ -0,0 +1,120 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/az_lsp.h.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Changed function prototype; pointer to  overflow flag is passed
+              in as a parameter. Added extern declaration for grid_tbl[],
+              defined in grid_tbl.c
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                           Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the function Az_lsp()
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef AZ_LSP_H
+#define AZ_LSP_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define grid_points 60
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 grid[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Az_lsp(
+        Word16 a[],         /* (i)  : predictor coefficients (MP1)               */
+        Word16 lsp[],       /* (o)  : line spectral pairs (M)                    */
+        Word16 old_lsp[],   /* (i)  : old lsp[] (in case not found 10 roots) (M) */
+        Flag   *pOverflow   /* (i/o): overflow flag                              */
+    );
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _AZ_LSP_H */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/basic_op.h b/media/libstagefright/codecs/amrnb/common/include/basic_op.h
new file mode 100644
index 0000000..f6c80e2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/basic_op.h
@@ -0,0 +1,448 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./include/basic_op.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Revised basic_op.h since the basicop2.c functions were split
+          up into separate source and header files. This function was
+          retained because there are legacy GSM AMR C functions that still
+          include this file. This file now includes the various basicop2
+          functions' header files instead of defining the function
+          prototypes.
+
+ Description: Including header files with platform specific inline assembly
+              instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes all the basicop2.c functions' header files.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BASIC_OP_H
+#define BASIC_OP_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+#if defined(PV_ARM_V5)
+#include "basic_op_arm_v5.h"
+
+#elif defined(PV_ARM_GCC_V5)
+#include "basic_op_arm_gcc_v5.h"
+
+#else
+#include "basic_op_c_equivalent.h"
+
+#endif
+
+
+
+#include    "add.h"
+#include    "div_s.h"
+#include    "div_32.h"
+#include    "extract_h.h"
+#include    "extract_l.h"
+#include    "l_deposit_h.h"
+#include    "l_deposit_l.h"
+#include    "l_shr_r.h"
+#include    "mult_r.h"
+#include    "norm_l.h"
+#include    "norm_s.h"
+#include    "round.h"
+#include    "shr_r.h"
+#include    "sub.h"
+#include    "shr.h"
+#include    "l_abs.h"
+#include    "l_negate.h"
+#include    "l_extract.h"
+#include    "l_abs.h"
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: mac_32
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var3 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+        L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+        L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
+        L_var2_hi = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+        L_var2_lo = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit mac operation resulted in overflow
+
+     Returns:
+        L_var3 = 32-bit result of L_var3 + (L_var1 * L_var2)(Word32)
+
+    */
+    static inline Word32 Mac_32(Word32 L_var3,
+    Word16 L_var1_hi,
+    Word16 L_var1_lo,
+    Word16 L_var2_hi,
+    Word16 L_var2_lo,
+    Flag *pOverflow)
+    {
+        Word16  product;
+
+        L_var3 = L_mac(L_var3, L_var1_hi, L_var2_hi, pOverflow);
+
+        product = mult(L_var1_hi, L_var2_lo, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        product = mult(L_var1_lo, L_var2_hi, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        return (L_var3);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: mac_32_16
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var3 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+        L_var1_hi = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+        L_var1_lo = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
+        var2= 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit mac operation resulted in overflow
+
+     Returns:
+        L_var3 = 32-bit result of L_var3 + (L_var1 * var2)(Word32)
+    */
+
+    static inline Word32 Mac_32_16(Word32 L_var3,
+                                   Word16 L_var1_hi,
+                                   Word16 L_var1_lo,
+                                   Word16 var2,
+                                   Flag  *pOverflow)
+    {
+        Word16  product;
+
+        L_var3 = L_mac(L_var3, L_var1_hi, var2, pOverflow);
+
+        product = mult(L_var1_lo, var2, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        return (L_var3);
+    }
+
+
+    /*----------------------------------------------------------------------------
+         Function Name : negate
+
+         Negate var1 with saturation, saturate in the case where input is -32768:
+                      negate(var1) = sub(0,var1).
+
+         Inputs :
+          var1
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var1 <= 0x7fff.
+
+         Outputs :
+          none
+
+         Return Value :
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var_out <= 0x7fff.
+     ----------------------------------------------------------------------------*/
+
+    static inline Word16 negate(Word16 var1)
+    {
+        return (((var1 == MIN_16) ? MAX_16 : -var1));
+    }
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : shl
+
+         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.
+
+         Inputs :
+          var1
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var1 <= 0x7fff.
+
+          var2
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var1 <= 0x7fff.
+
+          pOverflow : pointer to overflow (Flag)
+
+         Return Value :
+          var_out
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var_out <= 0x7fff.
+     ----------------------------------------------------------------------------*/
+
+    static inline Word16 shl(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word16 var_out = 0;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        if (var2 < 0)
+        {
+            var2 = -var2;
+            if (var2 < 15)
+            {
+                var_out = var1 >> var2;
+            }
+
+        }
+        else
+        {
+            var_out = var1 << var2;
+            if (var_out >> var2 != var1)
+            {
+                var_out = (var1 >> 15) ^ MAX_16;
+            }
+        }
+        return (var_out);
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : L_shl
+
+         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.
+
+         Inputs :
+          L_var1   32 bit long signed integer (Word32) whose value falls in the
+                   range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+          var2
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range :  8000 <= var2 <= 7fff.
+
+          pOverflow : pointer to overflow (Flag)
+
+         Return Value :
+                   32 bit long signed integer (Word32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+    static inline Word32 L_shl(Word32 L_var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 L_var_out = 0;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        if (var2 > 0)
+        {
+            L_var_out = L_var1 << var2;
+            if (L_var_out >> var2 != L_var1)
+            {
+                L_var_out = (L_var1 >> 31) ^ MAX_32;
+            }
+        }
+        else
+        {
+            var2 = -var2;
+            if (var2 < 31)
+            {
+                L_var_out = L_var1 >> var2;
+            }
+
+        }
+
+        return (L_var_out);
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : L_shr
+
+         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.
+
+         Inputs :
+          L_var1   32 bit long signed integer (Word32) whose value falls in the
+                   range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+          var2
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range :  8000 <= var2 <= 7fff.
+
+          pOverflow : pointer to overflow (Flag)
+
+         Return Value :
+                   32 bit long signed integer (Word32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+    static inline Word32 L_shr(Word32 L_var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 L_var_out = 0;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        if (var2 > 0)
+        {
+            if (var2 < 31)
+            {
+                L_var_out = L_var1 >> var2;
+            }
+        }
+        else
+        {
+            var2 = -var2;
+
+            L_var_out = L_var1 << (var2) ;
+            if ((L_var_out >> (var2)) != L_var1)
+            {
+                L_var_out = (L_var1 >> 31) ^ MAX_32;
+            }
+
+        }
+
+        return (L_var_out);
+    }
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : abs_s
+
+          Absolute value of var1; abs_s(-32768) = 32767.
+
+         Inputs :
+          var1
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x8000 <= var1 <= 0x7fff.
+
+          pOverflow : pointer to overflow (Flag)
+
+         Outputs :
+          none
+
+         Return Value :
+                   16 bit short signed integer (Word16) whose value falls in the
+                   range : 0x0000 <= var_out <= 0x7fff.
+
+     ----------------------------------------------------------------------------*/
+
+    static inline Word16 abs_s(Word16 var1)
+    {
+
+        Word16 y = var1 - (var1 < 0);
+        y = y ^(y >> 15);
+        return (y);
+
+    }
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* BASIC_OP_H */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_gcc_v5.h b/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_gcc_v5.h
new file mode 100644
index 0000000..48f0bcb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_gcc_v5.h
@@ -0,0 +1,543 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+  Pathname: ./include/basic_op_arm_gcc_v5.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes all the GCC-ARM V5 basicop.c functions.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BASIC_OP_ARM_GCC_V5_H
+#define BASIC_OP_ARM_GCC_V5_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_add
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_sum = 32-bit sum of L_var1 and L_var2 (Word32)
+    */
+
+    __inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("qadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb)
+                            );
+        return (result);
+
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_sub
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_diff = 32-bit difference of L_var1 and L_var2 (Word32)
+    */
+    __inline Word32 L_sub(Word32 L_var1, Word32 L_var2, Flag *pOverflow)
+{
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("qsub %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb)
+                            );
+
+        return (result);
+    }
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mac
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 + (var1 * var2)(Word32)
+    */
+    static inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+{
+        register Word32 ra = L_var3;
+        register Word32 rb = var1;
+        register Word32 rc = var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(result)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(rc)
+                             : "r"(ra), "r"(result)
+                            );
+
+        return (rc);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        L_var2 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+
+    __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+{
+        register Word32 ra = var1;
+        register Word32 rb = var2;
+        Word32 result;
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product)
+                             : "r"(ra), "r"(rb)
+                            );
+
+        asm volatile("qadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(product), "r"(product)
+                            );
+
+        return(result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_msu
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 - (var1 * var2)
+    */
+    __inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+{
+        register Word32 ra = L_var3;
+        register Word32 rb = var1;
+        register Word32 rc = var2;
+        Word32 product;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("qdsub %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(product)
+                            );
+
+        return (result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant word of first input (Word16).
+        L_var1_lo = least significant word of first input (Word16).
+        L_var2_hi = most significant word of second input (Word16).
+        L_var2_lo = least significant word of second input (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit multiply operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+    static inline Word32 Mpy_32(Word16 L_var1_hi,
+                                Word16 L_var1_lo,
+                                Word16 L_var2_hi,
+                                Word16 L_var2_lo,
+                                Flag   *pOverflow)
+{
+        register Word32 product32;
+        register Word32 L_sum;
+        register Word32 L_product, result;
+        register Word32 ra = L_var1_hi;
+        register Word32 rb = L_var1_lo;
+        register Word32 rc = L_var2_hi;
+        register Word32 rd = L_var2_lo;
+
+
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(ra), "r"(rc)
+                            );
+        asm volatile("mov %0, #0"
+             : "=r"(result)
+                    );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_sum)
+                             : "r"(result), "r"(L_product)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product32)
+                             : "r"(ra), "r"(rd)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(ra)
+                             : "r"(product32)
+                            );
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(L_sum), "r"(ra)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product32)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(rb)
+                             : "r"(product32)
+                            );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_sum)
+                             : "r"(L_product), "r"(rb)
+                            );
+
+        return (L_sum);
+    }
+
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32_16
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant 16 bits of 32-bit input (Word16).
+        L_var1_lo = least significant 16 bits of 32-bit input (Word16).
+        var2  = 16-bit signed integer (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit product operation resulted in overflow
+
+     Returns:
+        product = 32-bit product of the 32-bit L_var1 and 16-bit var1 (Word32)
+    */
+    static inline Word32 Mpy_32_16(Word16 L_var1_hi,
+                                   Word16 L_var1_lo,
+                                   Word16 var2,
+                                   Flag *pOverflow)
+{
+
+        register Word32 ra = L_var1_hi;
+        register Word32 rb = L_var1_lo;
+        register Word32 rc = var2;
+        Word32 result, L_product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(ra), "r"(rc)
+                            );
+        asm volatile("mov %0, #0"
+             : "=r"(result)
+                    );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(result), "r"(L_product)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(result)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(ra)
+                             : "r"(result)
+                            );
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(L_product), "r"(ra)
+                            );
+
+        return (result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the add operation resulted in overflow
+
+     Returns:
+        product = 16-bit limited product of var1 and var2 (Word16)
+    */
+    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+{
+        register Word32 ra = var1;
+        register Word32 rb = var2;
+        Word32 product;
+        Word32 temp;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile(
+            "smulbb %0, %1, %2"
+    : "=r"(temp)
+                    : "r"(ra), "r"(rb)
+                );
+        asm volatile(
+            "qadd %0, %1, %2\n\t"
+            "mov %0, %0, asr #16"
+    : "=&r*i"(product)
+                    : "r"(temp), "r"(temp)
+                );
+
+        return ((Word16) product);
+    }
+
+    __inline Word32 amrnb_fxp_mac_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+{
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        register Word32 rc = L_var3;
+        Word32 result;
+
+        asm volatile("smlabb %0, %1, %2, %3"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb), "r"(rc)
+                            );
+        return (result);
+    }
+
+    __inline Word32 amrnb_fxp_msu_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+{
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        register Word32 rc = L_var3;
+        Word32 result;
+
+        asm volatile("rsb %0, %1, #0"
+             : "=r"(ra)
+                             : "r"(ra)
+                            );
+
+        asm volatile("smlabb %0, %1, %2, %3"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb), "r"(rc)
+                            );
+        return (result);
+    }
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BASIC_OP_ARM_GCC_V5_H */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_v5.h b/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_v5.h
new file mode 100644
index 0000000..c939356
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/basic_op_arm_v5.h
@@ -0,0 +1,440 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./include/basic_op_arm_v5.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes all the ARM-V5 based basicop.c functions.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BASIC_OP_ARM_V5_H
+#define BASIC_OP_ARM_V5_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_add
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_sum = 32-bit sum of L_var1 and L_var2 (Word32)
+    */
+
+    __inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+        __asm
+        {
+            QADD result, L_var1, L_var2
+        }
+        return(result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_sub
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_diff = 32-bit difference of L_var1 and L_var2 (Word32)
+    */
+    __inline Word32 L_sub(Word32 L_var1, Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            QSUB result, L_var1, L_var2
+        }
+
+        return(result);
+
+    }
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mac
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 + (var1 * var2)(Word32)
+    */
+    __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 L_sum;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm {SMULBB result, var1, var2}
+        __asm {QDADD L_sum, L_var3, result}
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        L_var2 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+    __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            QADD   result, product, product
+        }
+
+        return (result);
+    }
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_msu
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 - (var1 * var2)
+    */
+    __inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 product;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            QDSUB  result, L_var3, product
+        }
+
+        return (result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant word of first input (Word16).
+        L_var1_lo = least significant word of first input (Word16).
+        L_var2_hi = most significant word of second input (Word16).
+        L_var2_lo = least significant word of second input (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit multiply operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+    __inline Word32 Mpy_32(Word16 L_var1_hi, Word16 L_var1_lo, Word16 L_var2_hi,
+                           Word16 L_var2_lo, Flag   *pOverflow)
+
+    {
+
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 product32;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB L_product, L_var1_hi, L_var2_hi
+            QDADD L_product, 0, L_product
+            SMULBB product32, L_var1_hi, L_var2_lo
+        }
+        product32 >>= 15;
+        __asm
+        {
+            QDADD L_sum, L_product, product32
+        }
+        L_product = L_sum;
+        __asm
+        {
+            SMULBB product32, L_var1_lo, L_var2_hi
+        }
+        product32 >>= 15;
+        __asm
+        {
+            QDADD L_sum, L_product, product32
+        }
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32_16
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant 16 bits of 32-bit input (Word16).
+        L_var1_lo = least significant 16 bits of 32-bit input (Word16).
+        var2  = 16-bit signed integer (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit product operation resulted in overflow
+
+     Returns:
+        product = 32-bit product of the 32-bit L_var1 and 16-bit var1 (Word32)
+    */
+    __inline Word32 Mpy_32_16(Word16 L_var1_hi,
+                              Word16 L_var1_lo,
+                              Word16 var2,
+                              Flag *pOverflow)
+    {
+
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm {SMULBB L_product, L_var1_hi, var2}
+        __asm {QDADD L_product, 0, L_product}
+        __asm {SMULBB result, L_var1_lo, var2}
+        result >>= 15;
+        __asm {QDADD L_sum, L_product, result}
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the add operation resulted in overflow
+
+     Returns:
+        product = 16-bit limited product of var1 and var2 (Word16)
+    */
+    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            MOV    product, product, ASR #15
+            CMP    product, 0x7FFF
+            MOVGE  product, 0x7FFF
+        }
+
+        return ((Word16) product);
+    }
+
+    __inline Word32 amrnb_fxp_mac_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+    {
+        Word32 result;
+        __asm
+        {
+            smlabb result, L_var1, L_var2, L_var3
+        }
+        return result;
+    }
+
+    __inline Word32 amrnb_fxp_msu_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+    {
+        Word32 result;
+        __asm
+        {
+            rsb L_var1, L_var1, #0
+            smlabb result, L_var1, L_var2, L_var3
+        }
+        return result;
+    }
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BASIC_OP_ARM_V5_H */
diff --git a/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h b/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h
new file mode 100644
index 0000000..35638e3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/basic_op_c_equivalent.h
@@ -0,0 +1,505 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./include/basic_op_c_equivalent.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes all the C-Equivalent basicop.c functions.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BASIC_OP_C_EQUIVALENT_H
+#define BASIC_OP_C_EQUIVALENT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_add
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_sum = 32-bit sum of L_var1 and L_var2 (Word32)
+    */
+    static inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 L_sum;
+
+        L_sum = L_var1 + L_var2;
+
+        if ((L_var1 ^ L_var2) >= 0)
+        {
+            if ((L_sum ^ L_var1) < 0)
+            {
+                L_sum = (L_var1 < 0) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_sub
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        L_var2 = 32 bit long signed integer (Word32) whose value falls
+                 in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_diff = 32-bit difference of L_var1 and L_var2 (Word32)
+    */
+    static inline Word32 L_sub(register Word32 L_var1, register Word32 L_var2,
+                               register Flag *pOverflow)
+    {
+        Word32 L_diff;
+
+        L_diff = L_var1 - L_var2;
+
+        if ((L_var1 ^ L_var2) < 0)
+        {
+            if ((L_diff ^ L_var1) & MIN_32)
+            {
+                L_diff = (L_var1 < 0L) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+
+        return (L_diff);
+    }
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mac
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 + (var1 * var2)(Word32)
+    */
+    __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 L_sum;
+        result = (Word32) var1 * var2;
+        if (result != (Word32) 0x40000000L)
+        {
+            L_sum = (result << 1) + L_var3;
+
+            /* Check if L_sum and L_var_3 share the same sign */
+            if ((L_var3 ^ result) > 0)
+            {
+                if ((L_sum ^ L_var3) < 0)
+                {
+                    L_sum = (L_var3 < 0) ? MIN_32 : MAX_32;
+                    *pOverflow = 1;
+                }
+            }
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_sum = MAX_32;
+        }
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        L_var2 = 16 bit short signed integer (Word16) whose value falls in
+               the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit add operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+    static inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 L_product;
+
+        L_product = (Word32) var1 * var2;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;          /* Multiply by 2 */
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_product = MAX_32;
+        }
+
+        return (L_product);
+    }
+
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: L_msu
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit operation resulted in overflow
+
+     Returns:
+        result = 32-bit result of L_var3 - (var1 * var2)
+    */
+
+    static inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        result = L_mult(var1, var2, pOverflow);
+        result = L_sub(L_var3, result, pOverflow);
+
+        return (result);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant word of first input (Word16).
+        L_var1_lo = least significant word of first input (Word16).
+        L_var2_hi = most significant word of second input (Word16).
+        L_var2_lo = least significant word of second input (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit multiply operation resulted in overflow
+
+     Returns:
+        L_product = 32-bit product of L_var1 and L_var2 (Word32)
+    */
+    __inline Word32 Mpy_32(Word16 L_var1_hi,
+                           Word16 L_var1_lo,
+                           Word16 L_var2_hi,
+                           Word16 L_var2_lo,
+                           Flag   *pOverflow)
+    {
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 product32;
+
+        OSCL_UNUSED_ARG(pOverflow);
+        L_product = (Word32) L_var1_hi * L_var2_hi;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;
+        }
+        else
+        {
+            L_product = MAX_32;
+        }
+
+        /* result = mult (L_var1_hi, L_var2_lo, pOverflow); */
+        product32 = ((Word32) L_var1_hi * L_var2_lo) >> 15;
+
+        /* L_product = L_mac (L_product, result, 1, pOverflow); */
+        L_sum = L_product + (product32 << 1);
+
+        if ((L_product ^ product32) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+            }
+        }
+
+        L_product = L_sum;
+
+        /* result = mult (L_var1_lo, L_var2_hi, pOverflow); */
+        product32 = ((Word32) L_var1_lo * L_var2_hi) >> 15;
+
+        /* L_product = L_mac (L_product, result, 1, pOverflow); */
+        L_sum = L_product + (product32 << 1);
+
+        if ((L_product ^ product32) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+            }
+        }
+        return (L_sum);
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: Mpy_32_16
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     Inputs:
+        L_var1_hi = most significant 16 bits of 32-bit input (Word16).
+        L_var1_lo = least significant 16 bits of 32-bit input (Word16).
+        var2  = 16-bit signed integer (Word16).
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the 32 bit product operation resulted in overflow
+
+     Returns:
+        product = 32-bit product of the 32-bit L_var1 and 16-bit var1 (Word32)
+    */
+
+    __inline Word32 Mpy_32_16(Word16 L_var1_hi,
+                              Word16 L_var1_lo,
+                              Word16 var2,
+                              Flag *pOverflow)
+    {
+
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 result;
+        L_product = (Word32) L_var1_hi * var2;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_product = MAX_32;
+        }
+
+        result = ((Word32)L_var1_lo * var2) >> 15;
+
+        L_sum  =  L_product + (result << 1);
+
+        if ((L_product ^ result) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+        return (L_sum);
+
+    }
+
+    /*
+    ------------------------------------------------------------------------------
+     FUNCTION NAME: mult
+    ------------------------------------------------------------------------------
+     INPUT AND OUTPUT DEFINITIONS
+
+     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 <= var2 <= 0x0000 7fff.
+
+        pOverflow = pointer to overflow (Flag)
+
+     Outputs:
+        pOverflow -> 1 if the add operation resulted in overflow
+
+     Returns:
+        product = 16-bit limited product of var1 and var2 (Word16)
+    */
+    static inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 product;
+
+        product = ((Word32) var1 * var2) >> 15;
+
+        /* Saturate result (if necessary). */
+        /* var1 * var2 >0x00007fff is the only case */
+        /* that saturation occurs. */
+
+        if (product > 0x00007fffL)
+        {
+            *pOverflow = 1;
+            product = (Word32) MAX_16;
+        }
+
+
+        /* Return the product as a 16 bit value by type casting Word32 to Word16 */
+
+        return ((Word16) product);
+    }
+
+
+    static inline Word32 amrnb_fxp_mac_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+    {
+        Word32 result;
+
+        result = L_var3 + L_var1 * L_var2;
+
+        return result;
+    }
+
+    static inline Word32 amrnb_fxp_msu_16_by_16bb(Word32 L_var1, Word32 L_var2, Word32 L_var3)
+    {
+        Word32 result;
+
+        result = L_var3 - L_var1 * L_var2;
+
+        return result;
+    }
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* BASIC_OP_C_EQUIVALENT_H */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/basicop_malloc.h b/media/libstagefright/codecs/amrnb/common/include/basicop_malloc.h
new file mode 100644
index 0000000..363d148
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/basicop_malloc.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/basicop_malloc.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains constant definitions and external references to the stores
+ used by any arithmetic function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BASICOP_MALLOC_H
+#define BASICOP_MALLOC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define MAX_32 (Word32)0x7fffffffL
+#define MIN_32 (Word32)0x80000000L
+
+#define MAX_16 (Word16)0x7fff
+#define MIN_16 (Word16)0x8000
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern  Flag Overflow;
+    extern  Flag Carry;
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/bitno_tab.h b/media/libstagefright/codecs/amrnb/common/include/bitno_tab.h
new file mode 100644
index 0000000..a170750
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/bitno_tab.h
@@ -0,0 +1,146 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+  Pathname: .audio/gsm-amr/c/include/bitno_tab.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Define "const Word16 *bitno[N_MODES]" as "const Word16 *const
+                      bitno[N_MODES]"
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares a tables in bitno_tab.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BITNO_TAB_H
+#define BITNO_TAB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define BIT_0      0
+#define BIT_1      1
+
+#define PRMNO_MR475 17
+#define PRMNO_MR515 19
+#define PRMNO_MR59  19
+#define PRMNO_MR67  19
+#define PRMNO_MR74  19
+#define PRMNO_MR795 23
+#define PRMNO_MR102 39
+#define PRMNO_MR122 57
+#define PRMNO_MRDTX 5
+
+    /* number of parameters to first subframe */
+#define PRMNOFSF_MR475 7
+#define PRMNOFSF_MR515 7
+#define PRMNOFSF_MR59  7
+#define PRMNOFSF_MR67  7
+#define PRMNOFSF_MR74  7
+#define PRMNOFSF_MR795 8
+#define PRMNOFSF_MR102 12
+#define PRMNOFSF_MR122 18
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 prmno[];
+    extern const Word16 prmnofsf[];
+    extern const Word16 bitno_MR475[];
+    extern const Word16 bitno_MR515[];
+    extern const Word16 bitno_MR59[];
+    extern const Word16 bitno_MR67[];
+    extern const Word16 bitno_MR74[];
+    extern const Word16 bitno_MR95[];
+    extern const Word16 bitno_MR102[];
+    extern const Word16 bitno_MR122[];
+    extern const Word16 bitno_MRDTX[];
+    extern const Word16 *const bitno[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/bitreorder_tab.h b/media/libstagefright/codecs/amrnb/common/include/bitreorder_tab.h
new file mode 100644
index 0000000..bfcb4cf
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/bitreorder_tab.h
@@ -0,0 +1,125 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/bitreorder.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Define "const Word16 *reorderBits[NUM_MODES-1]" as
+              "const Word16 *const reorderBits[NUM_MODES-1]".
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares a tables in bitreorder.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BITREORDER_H
+#define BITREORDER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 numOfBits[];
+    extern const Word16 reorderBits_MR475[];
+    extern const Word16 reorderBits_MR515[];
+    extern const Word16 reorderBits_MR59[];
+    extern const Word16 reorderBits_MR67[];
+    extern const Word16 reorderBits_MR74[];
+    extern const Word16 reorderBits_MR795[];
+    extern const Word16 reorderBits_MR102[];
+    extern const Word16 reorderBits_MR122[];
+
+    extern const Word16 *const reorderBits[];
+    extern const Word16 numCompressedBytes[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/bits2prm.h b/media/libstagefright/codecs/amrnb/common/include/bits2prm.h
new file mode 100644
index 0000000..6a11bb4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/bits2prm.h
@@ -0,0 +1,91 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+*****************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+*****************************************************************************
+*
+*      File             : bits2prm.h
+*      Purpose          : Retrieves the vector of encoder parameters from
+*                       : the received serial bits in a frame.
+*
+*****************************************************************************
+*/
+#ifndef bits2prm_h
+#define bits2prm_h "$Id $"
+
+/*
+*****************************************************************************
+*                         INCLUDE FILES
+*****************************************************************************
+*/
+#include "typedef.h"
+#include "mode.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    *****************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    *****************************************************************************
+    */
+
+    /*
+    *****************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    *****************************************************************************
+    */
+    /*
+    **************************************************************************
+    *
+    *  Function    : Bits2prm
+    *  Purpose     : Retrieves the vector of encoder parameters from
+    *                the received serial bits in a frame.
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    OSCL_IMPORT_REF void Bits2prm(
+        enum Mode mode,
+        Word16 bits[],   /* input : serial bits, (244 + bfi)               */
+        Word16 prm[]     /* output: analysis parameters, (57+1 parameters) */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/bytesused.h b/media/libstagefright/codecs/amrnb/common/include/bytesused.h
new file mode 100644
index 0000000..934efbe
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/bytesused.h
@@ -0,0 +1,109 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/BytesUsed.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares a table BytesUsed.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BYTESUSED_H
+#define BYTESUSED_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const short BytesUsed[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/cnst.h b/media/libstagefright/codecs/amrnb/common/include/cnst.h
new file mode 100644
index 0000000..b648eb7
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/cnst.h
@@ -0,0 +1,129 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ INCLUDE DESCRIPTION
+
+ This file contains the Speech code (encoder, decoder, and postfilter)
+ constant parameters.
+
+ NOTE: This file must be synchronized with /gsm-amr/asm/include/cnst.inc file.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef _CNST_H_
+#define _CNST_H_
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define L_TOTAL      320       /* Total size of speech buffer.             */
+#define L_WINDOW     240       /* Window size in LP analysis               */
+#define L_FRAME      160       /* Frame size                               */
+#define L_FRAME_BY2  80        /* Frame size divided by 2                  */
+#define L_SUBFR      40        /* Subframe size                            */
+#define L_CODE       40        /* codevector length                        */
+#define NB_TRACK     5         /* number of tracks                         */
+#define STEP         5         /* codebook step size                       */
+#define NB_TRACK_MR102  4      /* number of tracks mode mr102              */
+#define STEP_MR102      4      /* codebook step size mode mr102            */
+#define M            10        /* Order of LP filter                       */
+#define MP1          (M+1)     /* Order of LP filter + 1                   */
+#define LSF_GAP      205       /* Minimum distance between LSF after quan- */
+    /* tization; 50 Hz = 205                    */
+#define LSP_PRED_FAC_MR122 21299 /* MR122 LSP prediction factor (0.65 Q15) */
+#define AZ_SIZE       (4*M+4)  /* Size of array of LP filters in 4 subfr.s */
+#define PIT_MIN_MR122 18       /* Minimum pitch lag (MR122 mode)           */
+#define PIT_MIN       20       /* Minimum pitch lag (all other modes)      */
+#define PIT_MAX       143      /* Maximum pitch lag                        */
+#define L_INTERPOL    (10+1)   /* Length of filter for interpolation       */
+#define L_INTER_SRCH  4        /* Length of filter for CL LTP search       */
+    /* interpolation                            */
+
+#define MU       26214         /* Factor for tilt compensation filter 0.8  */
+#define AGC_FAC  29491         /* Factor for automatic gain control 0.9    */
+
+#define L_NEXT       40        /* Overhead in LP analysis                  */
+#define SHARPMAX  13017        /* Maximum value of pitch sharpening        */
+#define SHARPMIN  0            /* Minimum value of pitch sharpening        */
+
+
+#define MAX_PRM_SIZE    57     /* max. num. of params                      */
+#define MAX_SERIAL_SIZE 244    /* max. num. of serial bits                 */
+
+#define GP_CLIP   15565        /* Pitch gain clipping = 0.95               */
+#define N_FRAME   7            /* old pitch gains in average calculation   */
+
+#define EHF_MASK 0x0008        /* encoder homing frame pattern             */
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _CNST_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/cnst_vad.h b/media/libstagefright/codecs/amrnb/common/include/cnst_vad.h
new file mode 100644
index 0000000..6877a1b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/cnst_vad.h
@@ -0,0 +1,133 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+**-------------------------------------------------------------------------**
+**                                                                         **
+**     GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001       **
+**                               R99   Version 3.2.0                       **
+**                               REL-4 Version 4.0.0                       **
+**                                                                         **
+**-------------------------------------------------------------------------**
+********************************************************************************
+*
+*      File             : cnst_vad.h
+*      Purpose          : Constants and definitions for VAD
+*
+********************************************************************************
+*/
+#ifndef cnst_vad_h
+#define cnst_vad_h "$Id $"
+
+#define FRAME_LEN 160    /* Length (samples) of the input frame          */
+#define COMPLEN 9        /* Number of sub-bands used by VAD              */
+#define INV_COMPLEN 3641 /* 1.0/COMPLEN*2^15                             */
+#define LOOKAHEAD 40     /* length of the lookahead used by speech coder */
+
+#define UNITY 512        /* Scaling used with SNR calculation            */
+#define UNIRSHFT 6       /* = log2(MAX_16/UNITY)                         */
+
+#define TONE_THR (Word16)(0.65*MAX_16) /* Threshold for tone detection   */
+
+/* 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 VAD_THR_HIGH 1260 /* Highest threshold                 */
+#define VAD_THR_LOW  720  /* Lowest threshold                  */
+#define VAD_P1 0          /* Noise level for highest threshold */
+#define VAD_P2 6300       /* Noise level for lowest threshold  */
+#define VAD_SLOPE (Word16)(MAX_16*(float)(VAD_THR_LOW-VAD_THR_HIGH)/(float)(VAD_P2-VAD_P1))
+
+/* Parameters for background spectrum recovery function */
+#define STAT_COUNT 20         /* threshold of stationary detection counter         */
+#define STAT_COUNT_BY_2 10    /* threshold of stationary detection counter         */
+#define CAD_MIN_STAT_COUNT 5  /* 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 16000       /* maximum */
+#define NOISE_INIT 150        /* initial */
+
+/* Constants for VAD hangover addition */
+#define HANG_NOISE_THR 100
+#define BURST_LEN_HIGH_NOISE 4
+#define HANG_LEN_HIGH_NOISE 7
+#define BURST_LEN_LOW_NOISE 5
+#define HANG_LEN_LOW_NOISE 4
+
+/* Thresholds for signal power */
+#define VAD_POW_LOW (Word32)15000     /* If input power is lower,                    */
+/*     VAD is set to 0                         */
+#define POW_PITCH_THR (Word32)343040  /* If input power is lower, pitch              */
+/*     detection is ignored                    */
+
+#define POW_COMPLEX_THR (Word32)15000 /* If input power is lower, complex            */
+/* flags  value for previous frame  is un-set  */
+
+
+/* Constants for the filter bank */
+#define LEVEL_SHIFT 0      /* scaling                                  */
+#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 */
+
+/* Constants for pitch detection */
+#define LTHRESH 4
+#define NTHRESH 4
+
+/* Constants for complex signal VAD  */
+#define CVAD_THRESH_ADAPT_HIGH  (Word16)(0.6 * MAX_16) /* threshold for adapt stopping high    */
+#define CVAD_THRESH_ADAPT_LOW  (Word16)(0.5 * MAX_16)  /* threshold for adapt stopping low     */
+#define CVAD_THRESH_IN_NOISE  (Word16)(0.65 * MAX_16)  /* threshold going into speech on       */
+/* a short term basis                   */
+
+#define CVAD_THRESH_HANG  (Word16)(0.70 * MAX_16)      /* threshold                            */
+#define CVAD_HANG_LIMIT  (Word16)(100)                 /* 2 second estimation time             */
+#define CVAD_HANG_LENGTH  (Word16)(250)                /* 5 second hangover                    */
+
+#define CVAD_LOWPOW_RESET (Word16) (0.40 * MAX_16)     /* init in low power segment            */
+#define CVAD_MIN_CORR (Word16) (0.40 * MAX_16)         /* lowest adaptation value              */
+
+#define CVAD_BURST 20                                  /* speech burst length for speech reset */
+#define CVAD_ADAPT_SLOW (Word16)(( 1.0 - 0.98) * MAX_16)        /* threshold for slow adaption */
+#define CVAD_ADAPT_FAST (Word16)((1.0 - 0.92) * MAX_16)         /* threshold for fast adaption */
+#define CVAD_ADAPT_REALLY_FAST (Word16)((1.0 - 0.80) * MAX_16)  /* threshold for really fast   */
+/* adaption                    */
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/copy.h b/media/libstagefright/codecs/amrnb/common/include/copy.h
new file mode 100644
index 0000000..b539ebb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/copy.h
@@ -0,0 +1,88 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*      File             : copy.h
+*      Purpose          : Copy vector x[] to y[]
+*
+********************************************************************************
+*/
+#ifndef copy_h
+#define copy_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : Copy
+    *  Purpose     : Copy vector x[] to y[], vector length L
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void Copy(
+        const Word16 x[],  /* i : input vector (L)    */
+        Word16 y[],        /* o : output vector (L)   */
+        Word16 L           /* i : vector length       */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/d_gain_c.h b/media/libstagefright/codecs/amrnb/common/include/d_gain_c.h
new file mode 100644
index 0000000..70868f4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/d_gain_c.h
@@ -0,0 +1,125 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/include/d_gain_c.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File          : d_gain_c.h
+      Purpose       : Decode the fixed codebook gain using the received index.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _D_GAIN_C_H_
+#define _D_GAIN_C_H_
+#define d_gain_c_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "mode.h"
+#include "gc_pred.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    /*
+     *  Function    : d_gain_code
+     *  Purpose     : Decode the fixed codebook gain using the received index.
+     *  Description : The received index gives the gain correction factor
+     *                gamma. The quantized gain is given by   g_q = g0 * gamma
+     *                where g0 is the predicted gain. To find g0, 4th order
+     *                MA prediction is applied to the mean-removed innovation
+     *                energy in dB.
+     *  Returns     : void
+     */
+    void d_gain_code(
+        gc_predState *pred_state, /* i/o : MA predictor state               */
+        enum Mode mode,           /* i   : AMR mode                         */
+        Word16 index,             /* i   : received quantization index      */
+        Word16 code[],            /* i   : innovation codevector            */
+        Word16 *gain_code,        /* o   : decoded innovation gain          */
+        Flag   *pOverflow
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _D_GAIN_C_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/d_gain_p.h b/media/libstagefright/codecs/amrnb/common/include/d_gain_p.h
new file mode 100644
index 0000000..fec072b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/d_gain_p.h
@@ -0,0 +1,80 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : d_gain_p.h
+*      Purpose          : Decodes the pitch gain using the received index.
+*
+********************************************************************************
+*/
+#ifndef d_gain_p_h
+#define d_gain_p_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "mode.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : d_gain_pitch
+    *  Purpose     : Decodes the pitch gain using the received index.
+    *  Description : In case of no frame erasure, the gain is obtained
+    *                from the quantization table at the given index;
+    *                otherwise, a downscaled past gain is used.
+    *  Returns     : Quantized pitch gain
+    *
+    **************************************************************************
+    */
+    Word16 d_gain_pitch(       /* return value: gain (Q14)                */
+        enum Mode mode,        /* i : AMR mode                            */
+        Word16 index           /* i   : index of quantization             */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/d_plsf.h b/media/libstagefright/codecs/amrnb/common/include/d_plsf.h
new file mode 100644
index 0000000..0e5ca9a
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/d_plsf.h
@@ -0,0 +1,199 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/d_plsf.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the d_plsf_3.c and d_plsf_5.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef d_plsf_h
+#define d_plsf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 past_r_q[M];   /* Past quantized prediction error, Q15 */
+        Word16 past_lsf_q[M]; /* Past dequantized lsfs,           Q15 */
+    } D_plsfState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : D_plsf_reset
+    *  Purpose     : Resets state memory
+    *  Returns     : 0 on success
+    *
+    **************************************************************************
+    */
+    Word16 D_plsf_reset(D_plsfState *st);
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : D_plsf_exit
+    *  Purpose     : The memory used for state memory is freed
+    *  Description : Stores NULL in *st
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void D_plsf_exit(D_plsfState **st);
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : D_plsf_5
+    *  Purpose     : Decodes the 2 sets of LSP parameters in a frame
+    *                using the received quantization indices.
+    *  Description : The two sets of LSFs are quantized using split by
+    *                5 matrix quantization (split-MQ) with 1st order MA
+    *                prediction.
+    *                See "q_plsf_5.c" for more details about the
+    *                quantization procedure
+    *  Returns     : 0
+    *
+    **************************************************************************
+    */
+    void D_plsf_5(
+        D_plsfState *st,  /* i/o: State variables                            */
+        Word16 bfi,       /* i  : bad frame indicator (set to 1 if a bad
+                              frame is received)                         */
+        Word16 *indice,   /* i  : quantization indices of 5 submatrices, Q0  */
+        Word16 *lsp1_q,   /* o  : quantized 1st LSP vector (M)           Q15 */
+        Word16 *lsp2_q,   /* o  : quantized 2nd LSP vector (M)           Q15 */
+        Flag  *pOverflow  /* o : Flag set when overflow occurs               */
+    );
+
+    /*************************************************************************
+     *
+     *  FUNCTION:   D_plsf_3()
+     *
+     *  PURPOSE: Decodes the LSP parameters using the received quantization
+     *           indices.1st order MA prediction and split by 3 matrix
+     *           quantization (split-MQ)
+     *
+     *************************************************************************/
+
+    void D_plsf_3(
+        D_plsfState *st,  /* i/o: State struct                               */
+        enum Mode mode,   /* i  : coder mode                                 */
+        Word16 bfi,       /* i  : bad frame indicator (set to 1 if a         */
+        /*      bad frame is received)                     */
+        Word16 * indice,  /* i  : quantization indices of 3 submatrices, Q0  */
+        Word16 * lsp1_q,  /* o  : quantized 1st LSP vector,              Q15 */
+        Flag  *pOverflow  /* o : Flag set when overflow occurs               */
+    );
+
+    /*************************************************************************
+     *
+     *  FUNCTION:   Init_D_plsf_3()
+     *
+     *  PURPOSE: Set the past_r_q[M] vector to one of the eight
+     *           past_rq_init vectors.
+     *
+     *************************************************************************/
+    void Init_D_plsf_3(D_plsfState *st,  /* i/o: State struct                */
+                       Word16 index      /* i  : past_rq_init[] index [0, 7] */
+                      );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _Q_PLSF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/div_32.h b/media/libstagefright/codecs/amrnb/common/include/div_32.h
new file mode 100644
index 0000000..28b726b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/div_32.h
@@ -0,0 +1,116 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/div_32.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Div_32 function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DIV_32_H
+#define DIV_32_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include        "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 Div_32(Word32 L_num,
+    Word16 L_denom_hi,
+    Word16 L_denom_lo,
+    Flag   *pOverflow) ;
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DIV_32_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/div_s.h b/media/libstagefright/codecs/amrnb/common/include/div_s.h
new file mode 100644
index 0000000..e8421db
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/div_s.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/div_s.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for div_s function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the div_s function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DIV_S_H
+#define DIV_S_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 div_s(Word16 var1, Word16 var2);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/dtx_common_def.h b/media/libstagefright/codecs/amrnb/common/include/dtx_common_def.h
new file mode 100644
index 0000000..c29b9e1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/dtx_common_def.h
@@ -0,0 +1,103 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/dtx_common_def.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+    File             : dtx_common_def.h
+    Purpose          : DTX definitions common to encoder and decoder
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DTX_COMMON_DEF_H
+#define DTX_COMMON_DEF_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define DTX_MAX_EMPTY_THRESH 50
+#define DTX_HIST_SIZE 8
+#define DTX_ELAPSED_FRAMES_THRESH (24 + 7 -1)
+#define DTX_HANG_CONST 7             /* yields eight frames of SP HANGOVER  */
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* DTX_COMMON_DEF_H */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/extract_h.h b/media/libstagefright/codecs/amrnb/common/include/extract_h.h
new file mode 100644
index 0000000..34a623f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/extract_h.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/extract_h.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for extract_h function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the extract_h function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef EXTRACT_H_H
+#define EXTRACT_H_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 extract_h(Word32 L_var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/extract_l.h b/media/libstagefright/codecs/amrnb/common/include/extract_l.h
new file mode 100644
index 0000000..ed7460d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/extract_l.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/extract_l.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for extract_l function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the extract_l function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef EXTRACT_L_H
+#define EXTRACT_L_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 extract_l(Word32 L_var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/frame.h b/media/libstagefright/codecs/amrnb/common/include/frame.h
new file mode 100644
index 0000000..1d0c6c1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/frame.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+*****************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+*****************************************************************************
+*
+*      File             : frame.h
+*      Purpose          : Declaration of received and transmitted frame types
+*
+*****************************************************************************
+*/
+#ifndef frame_h
+#define frame_h "$Id $"
+
+/*
+*****************************************************************************
+*                         INCLUDE FILES
+*****************************************************************************
+*/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    *****************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    *****************************************************************************
+    * Note: The order of the TX and RX_Type identifiers has been chosen in
+    *       the way below to be compatible to an earlier version of the
+    *       AMR-NB C reference program.
+    *****************************************************************************
+    */
+
+    enum RXFrameType { RX_SPEECH_GOOD = 0,
+        RX_SPEECH_DEGRADED,
+        RX_ONSET,
+        RX_SPEECH_BAD,
+        RX_SID_FIRST,
+        RX_SID_UPDATE,
+        RX_SID_BAD,
+        RX_NO_DATA,
+        RX_N_FRAMETYPES     /* number of frame types */
+    };
+
+    enum TXFrameType { TX_SPEECH_GOOD = 0,
+                       TX_SID_FIRST,
+                       TX_SID_UPDATE,
+                       TX_NO_DATA,
+                       TX_SPEECH_DEGRADED,
+                       TX_SPEECH_BAD,
+                       TX_SID_BAD,
+                       TX_ONSET,
+                       TX_N_FRAMETYPES     /* number of frame types */
+                     };
+
+
+    /* Channel decoded frame type */
+    enum CHDECFrameType { CHDEC_SID_FIRST = 0,
+                          CHDEC_SID_FIRST_INCOMPLETE,
+                          CHDEC_SID_UPDATE_INCOMPLETE,
+                          CHDEC_SID_UPDATE,
+                          CHDEC_SPEECH,
+                          CHDEC_SPEECH_ONSET,
+                          CHDEC_ESCAPE_MARKER,
+                          CHDEC_ESCAPE_DATA,
+                          CHDEC_NO_DATA
+                        };
+
+    /* Channel decoded frame quality */
+    enum CHDECFrameQuality { CHDEC_GOOD = 0,
+                             CHDEC_PROBABLY_DEGRADED,
+                             CHDEC_PROBABLY_BAD,
+                             CHDEC_BAD
+                           };
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/frame_type_3gpp.h b/media/libstagefright/codecs/amrnb/common/include/frame_type_3gpp.h
new file mode 100644
index 0000000..0620367
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/frame_type_3gpp.h
@@ -0,0 +1,123 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/include/frame_type_3gpp.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated to new PV C header template.
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the definition of the 3GPP frame types.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FRAME_TYPE_3GPP_H
+#define FRAME_TYPE_3GPP_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    enum Frame_Type_3GPP
+    {
+        AMR_475 = 0,
+        AMR_515,
+        AMR_59,
+        AMR_67,
+        AMR_74,
+        AMR_795,
+        AMR_102,
+        AMR_122,
+        AMR_SID,
+        GSM_EFR_SID,
+        TDMA_EFR_SID,
+        PDC_EFR_SID,
+        FOR_FUTURE_USE1,
+        FOR_FUTURE_USE2,
+        FOR_FUTURE_USE3,
+        AMR_NO_DATA
+    };
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* _FRAME_TYPE_3GPP_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/gc_pred.h b/media/libstagefright/codecs/amrnb/common/include/gc_pred.h
new file mode 100644
index 0000000..b82603c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/gc_pred.h
@@ -0,0 +1,176 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/include/gc_pred.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : gc_pred.h
+      Purpose          : codebook gain MA prediction
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _GC_PRED_H_
+#define _GC_PRED_H_
+#define gc_pred_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "mode.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 past_qua_en[4];         /* normal MA predictor memory,         Q10 */
+        /* (contains 20*log10(qua_err))            */
+        Word16 past_qua_en_MR122[4];   /* MA predictor memory for MR122 mode, Q10 */
+        /* (contains log2(qua_err))                */
+    } gc_predState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    Word16 gc_pred_reset(gc_predState *st);
+    /* reset of codebook gain MA predictor state (i.e. set state memory to zero)
+       returns 0 on success
+     */
+    void gc_pred_exit(gc_predState **st);
+    /* de-initialize codebook gain MA predictor state (i.e. free state struct)
+       stores NULL in *st
+     */
+
+    void
+    gc_pred_copy(
+        gc_predState *st_src,  /* i : State struct                           */
+        gc_predState *st_dest  /* o : State struct                           */
+    );
+
+    /*
+     * FUNCTION:  gc_pred()
+     * PURPOSE: MA prediction of the innovation energy
+     *          (in dB/(20*log10(2))) with mean  removed).
+     */
+    void gc_pred(
+        gc_predState *st,   /* i/o: State struct                           */
+        enum Mode mode,     /* i  : AMR mode                               */
+        Word16 *code,       /* i  : innovative codebook vector (L_SUBFR)   */
+        /*      MR122: Q12, other modes: Q13           */
+        Word16 *exp_gcode0, /* o  : exponent of predicted gain factor, Q0  */
+        Word16 *frac_gcode0,/* o  : fraction of predicted gain factor  Q15 */
+        Word16 *exp_en,     /* o  : exponent of innovation energy,     Q0  */
+        /*      (only calculated for MR795)            */
+        Word16 *frac_en,    /* o  : fraction of innovation energy,     Q15 */
+        /*      (only calculated for MR795)            */
+        Flag   *pOverflow
+    );
+
+    /*
+     * FUNCTION:  gc_pred_update()
+     * PURPOSE: update MA predictor with last quantized energy
+     */
+    void gc_pred_update(
+        gc_predState *st,      /* i/o: State struct                     */
+        Word16 qua_ener_MR122, /* i  : quantized energy for update, Q10 */
+        /*      (log2(qua_err))                  */
+        Word16 qua_ener        /* i  : quantized energy for update, Q10 */
+        /*      (20*log10(qua_err))              */
+    );
+
+    /*
+     * FUNCTION:  gc_pred_average_limited()
+     * PURPOSE: get average of MA predictor state values (with a lower limit)
+     *          [used in error concealment]
+     */
+    void gc_pred_average_limited(
+        gc_predState *st,       /* i: State struct                    */
+        Word16 *ener_avg_MR122, /* o: averaged quantized energy,  Q10 */
+        /*    (log2(qua_err))                 */
+        Word16 *ener_avg,       /* o: averaged quantized energy,  Q10 */
+        /*    (20*log10(qua_err))             */
+        Flag   *pOverflow
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _GC_PRED_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/gmed_n.h b/media/libstagefright/codecs/amrnb/common/include/gmed_n.h
new file mode 100644
index 0000000..1c4ede2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/gmed_n.h
@@ -0,0 +1,80 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : gmed_n.h
+*      Purpose          : calculates N-point median.
+*
+********************************************************************************
+*/
+#ifndef gmed_n_h
+#define gmed_n_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    Word16 gmed_n(    /* o : index of the median value (0...N-1)      */
+        Word16 ind[], /* i : Past gain values                         */
+        Word16 n      /* i : The number of gains; this routine        */
+        /*     is only valid for a odd number of gains  */
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/gsm_amr_typedefs.h b/media/libstagefright/codecs/amrnb/common/include/gsm_amr_typedefs.h
new file mode 100644
index 0000000..4abcbbd
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/gsm_amr_typedefs.h
@@ -0,0 +1,133 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: codecs/audio/gsm_amr/gsm_two_way/c/include/gsm_amr_typedefs.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Removed unused defintions and corrected ifdef, that depended on
+              incorrect typedef
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the definition of the amr codec types.
+
+------------------------------------------------------------------------------
+*/
+#ifndef GSM_AMR_TYPEDEFS_H
+#define GSM_AMR_TYPEDEFS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include <stdint.h>
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+typedef int8_t        Word8;
+typedef uint8_t       UWord8;
+
+
+/*----------------------------------------------------------------------------
+; Define 16 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+typedef int16_t       Word16;
+typedef uint16_t      UWord16;
+
+/*----------------------------------------------------------------------------
+; Define 32 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+typedef int32_t       Word32;
+typedef uint32_t      UWord32;
+
+
+/*----------------------------------------------------------------------------
+; Define boolean type
+----------------------------------------------------------------------------*/
+typedef int     Bool;
+
+#ifndef FALSE
+#define FALSE       0
+#endif
+
+#ifndef TRUE
+#define TRUE        1
+#endif
+
+#ifndef OFF
+#define OFF     0
+#endif
+
+#ifndef ON
+#define ON      1
+#endif
+
+#ifndef NO
+#define NO      0
+#endif
+
+#ifndef YES
+#define YES     1
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS     0
+#endif
+
+#ifndef  NULL
+#define  NULL       0
+#endif
+
+typedef int32_t     Flag;
+
+#endif   /*  GSM_AMR_TYPEDEFS_H */
diff --git a/media/libstagefright/codecs/amrnb/common/include/int_lpc.h b/media/libstagefright/codecs/amrnb/common/include/int_lpc.h
new file mode 100644
index 0000000..e95e6ca
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/int_lpc.h
@@ -0,0 +1,212 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/lsp_avg.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsp_avg.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef int_lpc_h
+#define int_lpc_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : Int_lpc_1and3
+    *  Purpose     : Interpolates the LSPs and converts to LPC parameters
+    *                to get a different LP filter in each subframe.
+    *  Description : The 20 ms speech frame is divided into 4 subframes.
+    *                The LSPs are quantized and transmitted at the 2nd and
+    *                4th subframes (twice per frame) and interpolated at the
+    *                1st and 3rd subframe.
+    *
+    *                      |------|------|------|------|
+    *                         sf1    sf2    sf3    sf4
+    *                   F0            Fm            F1
+    *
+    *                 sf1:   1/2 Fm + 1/2 F0         sf3:   1/2 F1 + 1/2 Fm
+    *                 sf2:       Fm                  sf4:       F1
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void Int_lpc_1and3(
+        Word16 lsp_old[],  /* i : LSP vector at the 4th subfr. of past frame (M) */
+        Word16 lsp_mid[],  /* i : LSP vector at the 2nd subfr. of
+                              present frame (M)                              */
+        Word16 lsp_new[],  /* i : LSP vector at the 4th subfr. of
+                              present frame (M)                              */
+        Word16 Az[],       /* o : interpolated LP parameters in all subfr.
+                              (AZ_SIZE)                                      */
+        Flag   *pOverflow
+    );
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : Int_lpc_1and3_2
+    *  Purpose     : Interpolation of the LPC parameters. Same as the Int_lpc
+    *                function but we do not recompute Az() for subframe 2 and
+    *                4 because it is already available.
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void Int_lpc_1and3_2(
+        Word16 lsp_old[],  /* i : LSP vector at the 4th subfr. of past frame (M) */
+        Word16 lsp_mid[],  /* i : LSP vector at the 2nd subframe of
+                             present frame (M)                                  */
+        Word16 lsp_new[],  /* i : LSP vector at the 4th subframe of
+                             present frame (M)                                  */
+        Word16 Az[],       /* o :interpolated LP parameters
+                             in subframes 1 and 3 (AZ_SIZE)                     */
+        Flag   *pOverflow
+    );
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : Int_lpc_1to3
+    *  Purpose     : Interpolates the LSPs and converts to LPC parameters
+    *                to get a different LP filter in each subframe.
+    *  Description : The 20 ms speech frame is divided into 4 subframes.
+    *                The LSPs are quantized and transmitted at the 4th
+    *                subframes (once per frame) and interpolated at the
+    *                1st, 2nd and 3rd subframe.
+    *
+    *                      |------|------|------|------|
+    *                         sf1    sf2    sf3    sf4
+    *                   F0                          F1
+    *
+    *                 sf1:   3/4 F0 + 1/4 F1         sf3:   1/4 F0 + 3/4 F1
+    *                 sf2:   1/2 F0 + 1/2 F1         sf4:       F1
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void Int_lpc_1to3(
+        Word16 lsp_old[], /* i : LSP vector at the 4th SF of past frame (M)      */
+        Word16 lsp_new[], /* i : LSP vector at the 4th SF of present frame (M)   */
+        Word16 Az[],      /* o : interpolated LP parameters in all SFs (AZ_SIZE) */
+        Flag   *pOverflow
+    );
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : Int_lpc_1to3_2
+    *  Purpose     : Interpolation of the LPC parameters. Same as the Int_lpc
+    *                function but we do not recompute Az() for subframe 4
+    *                because it is already available.
+    *  Returns     : void
+    *
+    **************************************************************************
+    */
+    void Int_lpc_1to3_2(
+        Word16 lsp_old[],  /* i : LSP vector at the 4th SF of past frame (M) */
+        Word16 lsp_new[],  /* i : LSP vector at the 4th SF present frame (M) */
+        Word16 Az[],       /* o :interpolated LP parameters in SFs 1, 2, 3
+                             (AZ_SIZE)                                   */
+        Flag   *pOverflow
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INT_LPC_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/int_lsf.h b/media/libstagefright/codecs/amrnb/common/include/int_lsf.h
new file mode 100644
index 0000000..4e02ae6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/int_lsf.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/int_lsf.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the int_lsf function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef int_lsf_h
+#define int_lsf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Int_lsf(
+        Word16 lsf_old[], /* i : LSF vector at the 4th SF of past frame         */
+        Word16 lsf_new[], /* i : LSF vector at the 4th SF of present frame      */
+        Word16 i_subfr,   /* i : Current sf (equal to 0,40,80 or 120)           */
+        Word16 lsf_out[], /* o : interpolated LSF parameters for current sf     */
+        Flag  *pOverflow  /* o : flag set if overflow occurs                    */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INT_LSF_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/inv_sqrt.h b/media/libstagefright/codecs/amrnb/common/include/inv_sqrt.h
new file mode 100644
index 0000000..4fb2b11
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/inv_sqrt.h
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/inv_sqrt.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Added an extern declaration for inv_sqrt_tbl[], now defined in
+              the file inv_sqrt_tbl.c
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                           Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the inv_sqrt() function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef INV_SQRT_H
+#define INV_SQRT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 inv_sqrt_tbl[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 Inv_sqrt(        /* (o) : output value   */
+        Word32 L_x,         /* (i) : input value    */
+        Flag   *pOverflow  /* (i) : pointer to overflow flag */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _INV_SQRT_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_abs.h b/media/libstagefright/codecs/amrnb/common/include/l_abs.h
new file mode 100644
index 0000000..db57b82
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_abs.h
@@ -0,0 +1,111 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/l_abs.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_abs function.
+
+ Description: Moved _cplusplus #ifdef after Include section..
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_abs function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_ABS_H
+#define L_ABS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_abs(Word32 L_var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_add.h b/media/libstagefright/codecs/amrnb/common/include/l_add.h
new file mode 100644
index 0000000..136b914
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_add.h
@@ -0,0 +1,171 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_add.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_add function.
+
+ Description: Changed function prototype declaration. A pointer to the overflow
+              flag is being passed in as a parameter instead of using global
+              data.
+
+ Description: Updated template. Changed paramter name from overflow to
+              pOverflow
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Providing support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_add function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_ADD_H
+#define L_ADD_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+        __asm
+        {
+            QADD result, L_var1, L_var2
+        }
+        return(result);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    __inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("qadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb)
+                            );
+        return (result);
+
+    }
+
+#else /* C EQUIVALENT */
+
+
+    static inline Word32 L_add(register Word32 L_var1, register Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 L_sum;
+
+        L_sum = L_var1 + L_var2;
+
+        if ((L_var1 ^ L_var2) >= 0)
+        {
+            if ((L_sum ^ L_var1) < 0)
+            {
+                L_sum = (L_var1 < 0) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+
+        return (L_sum);
+    }
+
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_ADD_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_add_c.h b/media/libstagefright/codecs/amrnb/common/include/l_add_c.h
new file mode 100644
index 0000000..3585a3c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_add_c.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_add_c.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_add_c function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag and carry flag is passed into the
+              function. Updated template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_add_c function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_ADD_C_H
+#define L_ADD_C_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_add_c(Word32 L_var1, Word32 L_var2, Flag *pOverflow, Flag *pCarry);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_ADD_C_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_comp.h b/media/libstagefright/codecs/amrnb/common/include/l_comp.h
new file mode 100644
index 0000000..02a4bb7
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_comp.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/l_comp.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Passing in pOverflow for EPOC changes.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_comp function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_COMP_H
+#define L_COMP_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include        "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_Comp(Word16 hi, Word16 lo, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_deposit_h.h b/media/libstagefright/codecs/amrnb/common/include/l_deposit_h.h
new file mode 100644
index 0000000..e58bc5f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_deposit_h.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/l_deposit_h.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_deposit_h function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_deposit_h function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_DEPOSIT_H_H
+#define L_DEPOSIT_H_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_deposit_h(Word16 var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_deposit_l.h b/media/libstagefright/codecs/amrnb/common/include/l_deposit_l.h
new file mode 100644
index 0000000..09fabfd
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_deposit_l.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/l_deposit_l.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_deposit_l function.
+
+ Description: Updated template to make it build for Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_deposit_l function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_DEPOSIT_L_H
+#define L_DEPOSIT_L_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_deposit_l(Word16 var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_extract.h b/media/libstagefright/codecs/amrnb/common/include/l_extract.h
new file mode 100644
index 0000000..fdbe351
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_extract.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_extract.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_extract function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_EXTRACT_H
+#define L_EXTRACT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include        "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void L_Extract(Word32 L_var,
+    Word16 *pL_var_hi,
+    Word16 *pL_var_lo,
+    Flag   *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_EXTRACT_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_mac.h b/media/libstagefright/codecs/amrnb/common/include/l_mac.h
new file mode 100644
index 0000000..b4af3aa
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_mac.h
@@ -0,0 +1,183 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/l_mac.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_mac function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: 1. Updated the function to include ARM and Linux-ARM assembly
+                 instructions.
+              2. Added OSCL_UNUSED_ARG(pOverflow) to remove compiler warnings.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_mac function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_MAC_H
+#define L_MAC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 L_sum;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm {SMULBB result, var1, var2}
+        __asm {QDADD L_sum, L_var3, result}
+        return (L_sum);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    static inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 ra = L_var3;
+        register Word32 rb = var1;
+        register Word32 rc = var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(result)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(rc)
+                             : "r"(ra), "r"(result)
+                            );
+
+        return (rc);
+    }
+
+#else /* C_EQUIVALENT */
+
+    __inline Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 L_sum;
+        result = (Word32) var1 * var2;
+        if (result != (Word32) 0x40000000L)
+        {
+            L_sum = (result << 1) + L_var3;
+
+            /* Check if L_sum and L_var_3 share the same sign */
+            if ((L_var3 ^ result) > 0)
+            {
+                if ((L_sum ^ L_var3) < 0)
+                {
+                    L_sum = (L_var3 < 0) ? MIN_32 : MAX_32;
+                    *pOverflow = 1;
+                }
+            }
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_sum = MAX_32;
+        }
+        return (L_sum);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_MAC_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_msu.h b/media/libstagefright/codecs/amrnb/common/include/l_msu.h
new file mode 100644
index 0000000..3bafb00
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_msu.h
@@ -0,0 +1,171 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/l_msu.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_msu function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Providing support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_msu function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_MSU_H
+#define L_MSU_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+#include    "l_mult.h"
+#include    "l_sub.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 product;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            QDSUB  result, L_var3, product
+        }
+
+        return (result);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    __inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 ra = L_var3;
+        register Word32 rb = var1;
+        register Word32 rc = var2;
+        Word32 product;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("qdsub %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(product)
+                            );
+
+        return (result);
+    }
+
+#else /* C EQUIVALENT */
+
+    static inline Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        result = L_mult(var1, var2, pOverflow);
+        result = L_sub(L_var3, result, pOverflow);
+
+        return (result);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_MSU_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_mult.h b/media/libstagefright/codecs/amrnb/common/include/l_mult.h
new file mode 100644
index 0000000..061df60
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_mult.h
@@ -0,0 +1,178 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_mult.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_mult function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Providing support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_mult function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_MULT_H
+#define L_MULT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 result;
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            QADD   result, product, product
+        }
+
+        return (result);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    __inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 ra = var1;
+        register Word32 rb = var2;
+        Word32 result;
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product)
+                             : "r"(ra), "r"(rb)
+                            );
+
+        asm volatile("qadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(product), "r"(product)
+                            );
+
+        return(result);
+    }
+
+#else /* C EQUIVALENT */
+
+    static inline Word32 L_mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 L_product;
+
+        L_product = (Word32) var1 * var2;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;          /* Multiply by 2 */
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_product = MAX_32;
+        }
+
+        return (L_product);
+    }
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_MULT_H */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_negate.h b/media/libstagefright/codecs/amrnb/common/include/l_negate.h
new file mode 100644
index 0000000..11e14a8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_negate.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/l_negate.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_negate function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_negate function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_NEGATE_H
+#define L_NEGATE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_negate(Word32 L_var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_shl.h b/media/libstagefright/codecs/amrnb/common/include/l_shl.h
new file mode 100644
index 0000000..7b9fdb1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_shl.h
@@ -0,0 +1,116 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_shl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_shl function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_shl function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_SHL_H
+#define L_SHL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_shl(Word32 L_var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_SHL_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_shr.h b/media/libstagefright/codecs/amrnb/common/include/l_shr.h
new file mode 100644
index 0000000..ef22073
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_shr.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/l_shr.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_shr function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_shr function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_SHR_H
+#define L_SHR_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_shr(Word32 L_var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_SHR_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_shr_r.h b/media/libstagefright/codecs/amrnb/common/include/l_shr_r.h
new file mode 100644
index 0000000..1a1661f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_shr_r.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_shr_r.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_shr_r function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_shr_r function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_SHR_R_H
+#define L_SHR_R_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word32 L_shr_r(Word32 L_var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_SHR_R_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/l_sub.h b/media/libstagefright/codecs/amrnb/common/include/l_sub.h
new file mode 100644
index 0000000..97d7538
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/l_sub.h
@@ -0,0 +1,173 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/l_sub.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for L_sub function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Providing support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the L_sub function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef L_SUB_H
+#define L_SUB_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 L_sub(Word32 L_var1, Word32 L_var2, Flag *pOverflow)
+    {
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            QSUB result, L_var1, L_var2
+        }
+
+        return(result);
+
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    __inline Word32 L_sub(Word32 L_var1, Word32 L_var2, Flag *pOverflow)
+    {
+        register Word32 ra = L_var1;
+        register Word32 rb = L_var2;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("qsub %0, %1, %2"
+             : "=r"(result)
+                             : "r"(ra), "r"(rb)
+                            );
+
+        return (result);
+    }
+
+#else /* C EQUIVALENT */
+
+    static inline Word32 L_sub(register Word32 L_var1, register Word32 L_var2,
+                               register Flag *pOverflow)
+    {
+        Word32 L_diff;
+
+        L_diff = L_var1 - L_var2;
+
+        if ((L_var1 ^ L_var2) < 0)
+        {
+            if ((L_diff ^ L_var1) & MIN_32)
+            {
+                L_diff = (L_var1 < 0L) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+
+        return (L_diff);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _L_SUB_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/log2.h b/media/libstagefright/codecs/amrnb/common/include/log2.h
new file mode 100644
index 0000000..e589b2f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/log2.h
@@ -0,0 +1,120 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/log2.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. Deleted function
+          prototype for Log2_norm and put it in its own header file.
+          Added log2_norm.h in Include section for legacy files.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section..
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the function prototype definition for Log2 function.
+
+------------------------------------------------------------------------------
+*/
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LOG2_H
+#define LOG2_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+#include    "log2_norm.h"           /* Used by legacy files */
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Log2(
+        Word32 L_x,         /* (i) : input value                                */
+        Word16 *pExponent,  /* (o) : Integer part of Log2.   (range: 0<=val<=30)*/
+        Word16 *pFraction,  /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+        Flag   *pOverflow   /* (i/o) : overflow flag                            */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LOG2_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/log2_norm.h b/media/libstagefright/codecs/amrnb/common/include/log2_norm.h
new file mode 100644
index 0000000..b104a69
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/log2_norm.h
@@ -0,0 +1,119 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/log2_norm.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for Log2_norm function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template. Added extern declaration for log2_tbl[]
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the prototype declaration for Log2_norm function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LOG2_NORM_H
+#define LOG2_NORM_H
+
+#define log2_h "$Id $"              /* Used by legacy code */
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 log2_tbl[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    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)  */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LOG2_NORM_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/lsfwt.h b/media/libstagefright/codecs/amrnb/common/include/lsfwt.h
new file mode 100644
index 0000000..d9a1f80
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/lsfwt.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/lsfwt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsfwt.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef lsfwt_h
+#define lsfwt_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Lsf_wt(
+        Word16 *lsf,          /* input : LSF vector                    */
+        Word16 *wf,           /* output: square of weighting factors   */
+        Flag   * pOverflow);  /* o : Flag set when overflow occurs     */
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LSF_WT_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/lsp.h b/media/libstagefright/codecs/amrnb/common/include/lsp.h
new file mode 100644
index 0000000..26a4b34
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/lsp.h
@@ -0,0 +1,186 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/lsp.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsp.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef lsp_h
+#define lsp_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "q_plsf.h"
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+
+        /* Past LSPs */
+        Word16 lsp_old[M];
+        Word16 lsp_old_q[M];
+
+        /* Quantization state */
+        Q_plsfState *qSt;
+
+    } lspState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    /*
+    **************************************************************************
+    *
+    *  Function    : lsp_init
+    *  Purpose     : Allocates memory and initializes state variables
+    *  Description : Stores pointer to filter status struct in *st. This
+    *                pointer has to be passed to lsp in each call.
+    *  Returns     : 0 on success
+    *
+    **************************************************************************
+    */
+    Word16 lsp_init(lspState **st);
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : lsp_reset
+    *  Purpose     : Resets state memory
+    *  Returns     : 0 on success
+    *
+    **************************************************************************
+    */
+    Word16 lsp_reset(lspState *st);
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : lsp_exit
+    *  Purpose     : The memory used for state memory is freed
+    *  Description : Stores NULL in *st
+    *
+    **************************************************************************
+    */
+    void lsp_exit(lspState **st);
+
+    /*
+    **************************************************************************
+    *
+    *  Function    : lsp
+    *  Purpose     : Conversion from LP coefficients to LSPs.
+    *                Quantization of LSPs.
+    *  Description : Generates 2 sets of LSPs from 2 sets of
+    *                LP coefficients for mode 12.2. For the other
+    *                modes 1 set of LSPs is generated from 1 set of
+    *                LP coefficients. These LSPs are quantized with
+    *                Matrix/Vector quantization (depending on the mode)
+    *                and interpolated for the subframes not yet having
+    *                their own LSPs.
+    *
+    **************************************************************************
+    */
+    void lsp(lspState *st,       /* i/o : State struct                            */
+             enum Mode req_mode, /* i   : requested coder mode                    */
+             enum Mode used_mode,/* i   : used coder mode                         */
+             Word16 az[],        /* i/o : interpolated LP parameters Q12          */
+             Word16 azQ[],       /* o   : quantization interpol. LP parameters Q12*/
+             Word16 lsp_new[],   /* o   : new lsp vector                          */
+             Word16 **anap,      /* o   : analysis parameters                     */
+             Flag   *pOverflow   /* o   : Flag set when overflow occurs           */
+            );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LSP_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/lsp_az.h b/media/libstagefright/codecs/amrnb/common/include/lsp_az.h
new file mode 100644
index 0000000..ae81507
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/lsp_az.h
@@ -0,0 +1,111 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/lsp_az.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsp_az function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LSP_AZ_H
+#define LSP_AZ_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Lsp_Az(
+        Word16 lsp[],        /* (i)  : line spectral frequencies            */
+        Word16 a[],          /* (o)  : predictor coefficients (order = 10)  */
+        Flag  *pOverflow     /* (o)  : overflow flag                        */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LSP_AZ_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/lsp_lsf.h b/media/libstagefright/codecs/amrnb/common/include/lsp_lsf.h
new file mode 100644
index 0000000..186b4d3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/lsp_lsf.h
@@ -0,0 +1,121 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/lsp_lsf.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsp_lsf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef lsp_lsf_h
+#define lsp_lsf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void Lsf_lsp(
+        Word16 lsf[],      /* (i)    : lsf[m] normalized (range: 0.0<=val<=0.5) */
+        Word16 lsp[],      /* (o)    : lsp[m] (range: -1<=val<1)                */
+        Word16 m,          /* (i)    : LPC order                                */
+        Flag  *pOverflow   /* (o)    : Flag set when overflow occurs            */
+    );
+    void Lsp_lsf(
+        Word16 lsp[],      /* (i)    : lsp[m] (range: -1<=val<1)                */
+        Word16 lsf[],      /* (o)    : lsf[m] normalized (range: 0.0<=val<=0.5) */
+        Word16 m,          /* (i)    : LPC order                                */
+        Flag  *pOverflow   /* (o)    : Flag set when overflow occurs            */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LSP_LSF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/lsp_tab.h b/media/libstagefright/codecs/amrnb/common/include/lsp_tab.h
new file mode 100644
index 0000000..01b3317
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/lsp_tab.h
@@ -0,0 +1,111 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/lsp_tab.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares a table lsp_init_data.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LSP_TAB_H
+#define LSP_TAB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 lsp_init_data[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/mac_32.h b/media/libstagefright/codecs/amrnb/common/include/mac_32.h
new file mode 100644
index 0000000..9e9ebe1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mac_32.h
@@ -0,0 +1,150 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/mac_32.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Inlined the functions from mac_32.cpp. A performance improvement
+              change.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Mac_32 and Mac_32_16 functions
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MAC_32_H
+#define MAC_32_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    static inline Word32 Mac_32(Word32 L_var3,
+    Word16 L_var1_hi,
+    Word16 L_var1_lo,
+    Word16 L_var2_hi,
+    Word16 L_var2_lo,
+    Flag *pOverflow)
+    {
+        Word16  product;
+
+        L_var3 = L_mac(L_var3, L_var1_hi, L_var2_hi, pOverflow);
+
+        product = mult(L_var1_hi, L_var2_lo, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        product = mult(L_var1_lo, L_var2_hi, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        return (L_var3);
+    }
+
+    static inline Word32 Mac_32_16(Word32 L_var3,
+                                   Word16 L_var1_hi,
+                                   Word16 L_var1_lo,
+                                   Word16 var2,
+                                   Flag  *pOverflow)
+    {
+        Word16  product;
+
+        L_var3 = L_mac(L_var3, L_var1_hi, var2, pOverflow);
+
+        product = mult(L_var1_lo, var2, pOverflow);
+        L_var3 = L_mac(L_var3, product, 1, pOverflow);
+
+        return (L_var3);
+    }
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MAC_32_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/mode.h b/media/libstagefright/codecs/amrnb/common/include/mode.h
new file mode 100644
index 0000000..75f86cb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mode.h
@@ -0,0 +1,82 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : mode.h
+*      Purpose          : Declaration of mode type
+*
+********************************************************************************
+*/
+#ifndef mode_h
+#define mode_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+    enum Mode { MR475 = 0,
+        MR515,
+        MR59,
+        MR67,
+        MR74,
+        MR795,
+        MR102,
+        MR122,
+
+        MRDTX,
+
+        N_MODES     /* number of (SPC) modes */
+
+    };
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/mpy_32.h b/media/libstagefright/codecs/amrnb/common/include/mpy_32.h
new file mode 100644
index 0000000..03f36b2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mpy_32.h
@@ -0,0 +1,272 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/mpy_32.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Updated the function to include ARM and Linux-ARM assembly
+              instructions.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Mpy_32 function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MPY_32_H
+#define MPY_32_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 Mpy_32(Word16 L_var1_hi,
+    Word16 L_var1_lo,
+    Word16 L_var2_hi,
+    Word16 L_var2_lo,
+    Flag   *pOverflow)
+
+    {
+        /*----------------------------------------------------------------------------
+        ; Define all local variables
+        ----------------------------------------------------------------------------*/
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 product32;
+
+        OSCL_UNUSED_ARG(pOverflow);
+        /*----------------------------------------------------------------------------
+        ; Function body here
+        ----------------------------------------------------------------------------*/
+        /* L_product = L_mult (L_var1_hi, L_var2_hi, pOverflow);*/
+
+        __asm {SMULBB L_product, L_var1_hi, L_var2_hi}
+        __asm {QDADD L_product, 0, L_product}
+        __asm {SMULBB product32, L_var1_hi, L_var2_lo}
+        product32 >>= 15;
+        __asm {QDADD L_sum, L_product, product32}
+        L_product = L_sum;
+        __asm {SMULBB product32, L_var1_lo, L_var2_hi}
+        product32 >>= 15;
+        __asm {QDADD L_sum, L_product, product32}
+        return (L_sum);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    static inline Word32 Mpy_32(Word16 L_var1_hi,
+                                Word16 L_var1_lo,
+                                Word16 L_var2_hi,
+                                Word16 L_var2_lo,
+                                Flag   *pOverflow)
+    {
+        register Word32 product32;
+        register Word32 L_sum;
+        register Word32 L_product, result;
+        register Word32 ra = L_var1_hi;
+        register Word32 rb = L_var1_lo;
+        register Word32 rc = L_var2_hi;
+        register Word32 rd = L_var2_lo;
+
+
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(ra), "r"(rc)
+                            );
+        asm volatile("mov %0, #0"
+             : "=r"(result)
+                    );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_sum)
+                             : "r"(result), "r"(L_product)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product32)
+                             : "r"(ra), "r"(rd)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(ra)
+                             : "r"(product32)
+                            );
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(L_sum), "r"(ra)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product32)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(rb)
+                             : "r"(product32)
+                            );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_sum)
+                             : "r"(L_product), "r"(rb)
+                            );
+
+        return (L_sum);
+    }
+
+#else /* C_EQUIVALENT */
+
+    __inline Word32 Mpy_32(Word16 L_var1_hi,
+                           Word16 L_var1_lo,
+                           Word16 L_var2_hi,
+                           Word16 L_var2_lo,
+                           Flag   *pOverflow)
+    {
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 product32;
+
+        OSCL_UNUSED_ARG(pOverflow);
+        L_product = (Word32) L_var1_hi * L_var2_hi;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;
+        }
+        else
+        {
+            L_product = MAX_32;
+        }
+
+        /* result = mult (L_var1_hi, L_var2_lo, pOverflow); */
+        product32 = ((Word32) L_var1_hi * L_var2_lo) >> 15;
+
+        /* L_product = L_mac (L_product, result, 1, pOverflow); */
+        L_sum = L_product + (product32 << 1);
+
+        if ((L_product ^ product32) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+            }
+        }
+
+        L_product = L_sum;
+
+        /* result = mult (L_var1_lo, L_var2_hi, pOverflow); */
+        product32 = ((Word32) L_var1_lo * L_var2_hi) >> 15;
+
+        /* L_product = L_mac (L_product, result, 1, pOverflow); */
+        L_sum = L_product + (product32 << 1);
+
+        if ((L_product ^ product32) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+            }
+        }
+
+        /*----------------------------------------------------------------------------
+        ; Return nothing or data or data pointer
+        ----------------------------------------------------------------------------*/
+        return (L_sum);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MPY_32_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/mpy_32_16.h b/media/libstagefright/codecs/amrnb/common/include/mpy_32_16.h
new file mode 100644
index 0000000..7eaa741
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mpy_32_16.h
@@ -0,0 +1,206 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+  Filename: /audio/gsm_amr/c/include/mpy_32_16.h
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Mpy_32_16 function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MPY_32_16_H
+#define MPY_32_16_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
+
+    __inline Word32 Mpy_32_16(Word16 L_var1_hi,
+    Word16 L_var1_lo,
+    Word16 var2,
+    Flag *pOverflow)
+    {
+
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 result;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm {SMULBB L_product, L_var1_hi, var2}
+        __asm {QDADD L_product, 0, L_product}
+        __asm {SMULBB result, L_var1_lo, var2}
+        result >>= 15;
+        __asm {QDADD L_sum, L_product, result}
+        return (L_sum);
+    }
+
+#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
+
+    static inline Word32 Mpy_32_16(Word16 L_var1_hi,
+                                   Word16 L_var1_lo,
+                                   Word16 var2,
+                                   Flag *pOverflow)
+    {
+
+        register Word32 ra = L_var1_hi;
+        register Word32 rb = L_var1_lo;
+        register Word32 rc = var2;
+        Word32 result, L_product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(ra), "r"(rc)
+                            );
+        asm volatile("mov %0, #0"
+             : "=r"(result)
+                    );
+
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(L_product)
+                             : "r"(result), "r"(L_product)
+                            );
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(result)
+                             : "r"(rb), "r"(rc)
+                            );
+
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(ra)
+                             : "r"(result)
+                            );
+        asm volatile("qdadd %0, %1, %2"
+             : "=r"(result)
+                             : "r"(L_product), "r"(ra)
+                            );
+
+        return (result);
+    }
+
+#else /* C_EQUIVALENT */
+    __inline Word32 Mpy_32_16(Word16 L_var1_hi,
+                              Word16 L_var1_lo,
+                              Word16 var2,
+                              Flag *pOverflow)
+    {
+
+        Word32 L_product;
+        Word32 L_sum;
+        Word32 result;
+        L_product = (Word32) L_var1_hi * var2;
+
+        if (L_product != (Word32) 0x40000000L)
+        {
+            L_product <<= 1;
+        }
+        else
+        {
+            *pOverflow = 1;
+            L_product = MAX_32;
+        }
+
+        result = ((Word32)L_var1_lo * var2) >> 15;
+
+        L_sum  =  L_product + (result << 1);
+
+        if ((L_product ^ result) > 0)
+        {
+            if ((L_sum ^ L_product) < 0)
+            {
+                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
+                *pOverflow = 1;
+            }
+        }
+        return (L_sum);
+
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _MPY_32_16_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/mult.h b/media/libstagefright/codecs/amrnb/common/include/mult.h
new file mode 100644
index 0000000..6927eba
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mult.h
@@ -0,0 +1,190 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/mult.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for mult function.
+
+ Description: Changed prototype of the mult() function. Instead of using global
+              a pointer to overflow flag is now passed into the function.
+
+ Description: Updated copyright information.
+              Updated variable name from "overflow" to "pOverflow" to match
+              with original function declaration.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Providing support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the mult function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef MULT_H
+#define MULT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if defined(PV_ARM_V5)
+
+    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        Word32 product;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        __asm
+        {
+            SMULBB product, var1, var2
+            MOV    product, product, ASR #15
+            CMP    product, 0x7FFF
+            MOVGE  product, 0x7FFF
+        }
+
+        return ((Word16) product);
+    }
+
+#elif defined(PV_ARM_GCC_V5)
+
+    __inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 ra = var1;
+        register Word32 rb = var2;
+        Word32 product;
+        Word32 temp = 0x7FFF;
+
+        OSCL_UNUSED_ARG(pOverflow);
+
+        asm volatile("smulbb %0, %1, %2"
+             : "=r"(product)
+                             : "r"(ra), "r"(rb)
+                            );
+        asm volatile("mov %0, %1, ASR #15"
+             : "=r"(product)
+                             : "r"(product)
+                            );
+        asm volatile("cmp %0, %1"
+             : "=r"(product)
+                             : "r"(temp)
+                            );
+        asm volatile("movge %0, %1"
+             : "=r"(product)
+                             : "r"(temp)
+                            );
+
+        return ((Word16) product);
+    }
+
+#else /* C EQUIVALENT */
+
+    static inline Word16 mult(Word16 var1, Word16 var2, Flag *pOverflow)
+    {
+        register Word32 product;
+
+        product = ((Word32) var1 * var2) >> 15;
+
+        /* Saturate result (if necessary). */
+        /* var1 * var2 >0x00007fff is the only case */
+        /* that saturation occurs. */
+
+        if (product > 0x00007fffL)
+        {
+            *pOverflow = 1;
+            product = (Word32) MAX_16;
+        }
+
+
+        /* Return the product as a 16 bit value by type casting Word32 to Word16 */
+
+        return ((Word16) product);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _MULT_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/mult_r.h b/media/libstagefright/codecs/amrnb/common/include/mult_r.h
new file mode 100644
index 0000000..d7a1857
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/mult_r.h
@@ -0,0 +1,121 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/mult_r.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for mult_r function.
+
+ Description: Changed prototype of the mult() function. Instead of using global
+              data, a pointer to overflow flag is now passed into the function.
+
+ Description: Made the following based on P2/P3 review
+              1) Changed the parameter name from "overflow" to "pOverflow"
+              in the function prototype declaration.
+              2) Updated template
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the mult_r function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef MULT_R__H
+#define MULT_R__H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 mult_r(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* _MULT_R_H_ */
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/n_proc.h b/media/libstagefright/codecs/amrnb/common/include/n_proc.h
new file mode 100644
index 0000000..e5738c1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/n_proc.h
@@ -0,0 +1,31 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/* $Id $ */
+
+void proc_head(char *mes);
diff --git a/media/libstagefright/codecs/amrnb/common/include/negate.h b/media/libstagefright/codecs/amrnb/common/include/negate.h
new file mode 100644
index 0000000..f67569e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/negate.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/include/negate.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for negate function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the negate function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef NEGATE_H
+#define NEGATE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 negate(register Word16 var1);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/norm_l.h b/media/libstagefright/codecs/amrnb/common/include/norm_l.h
new file mode 100644
index 0000000..533b105
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/norm_l.h
@@ -0,0 +1,153 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/include/norm_l.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for norm_l function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Support for ARM and Linux-ARM assembly.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the norm_l function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef NORM_L_H
+#define NORM_L_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) )
+
+    /* C EQUIVALENT */
+    Word16 norm_l(Word32 L_var1);
+
+#elif defined(PV_ARM_V5)
+
+    __inline Word16 norm_l(Word32 L_var1)
+    {
+        register Word32 var_out = 0;
+
+        __asm
+        {
+            CMP    L_var1, #0
+            EORNE  L_var1, L_var1, L_var1, LSL #1
+            CLZNE  var_out, L_var1
+        }
+
+        return ((Word16)var_out);
+    }
+
+#elif defined(PV_ARM_GCC_V5)
+
+    static inline Word16 norm_l(Word32 L_var1)
+    {
+        register Word32 var_out = 0;
+        register Word32 ra = L_var1;
+        if (L_var1)
+        {
+            ra ^= (ra << 1);
+            asm volatile(
+                "clz %0, %1"
+    : "=r"(var_out)
+                        : "r"(ra)
+                    );
+        }
+        return (var_out);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/norm_s.h b/media/libstagefright/codecs/amrnb/common/include/norm_s.h
new file mode 100644
index 0000000..2e37a9f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/norm_s.h
@@ -0,0 +1,153 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/include/norm_s.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for norm_s function.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the norm_s function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef NORM_S_H
+#define NORM_S_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+#if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) )
+
+    /* C EQUIVALENT */
+
+    Word16 norm_s(Word16 var1);
+
+#elif defined(PV_ARM_V5)
+
+    __inline Word16  norm_s(Word16 var)
+    {
+        register Word32 var_out = 0;
+        Word32 var1 = var << 16;
+
+        __asm
+        {
+            CMP    var1, #0
+            EORNE  var1, var1, var1, LSL #1
+            CLZNE  var_out, var1
+        }
+
+        return ((Word16)var_out);
+    }
+
+#elif defined(PV_ARM_GCC_V5)
+
+    static inline Word16 norm_s(Word16 var1)
+    {
+        register Word32 var_out = 0;
+        register Word32 ra = var1 << 16;
+        if (ra)
+        {
+            ra ^= (ra << 1);
+            asm volatile(
+                "clz %0, %1"
+    : "=r"(var_out)
+                        : "r"(ra)
+                    );
+        }
+        return (var_out);
+    }
+
+#endif
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/oper_32b.h b/media/libstagefright/codecs/amrnb/common/include/oper_32b.h
new file mode 100644
index 0000000..ec3fcfb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/oper_32b.h
@@ -0,0 +1,102 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/include/oper_32b.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Deleted inclusion of files that were not part of the original
+          oper_32b.h file.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes all the oper_32b.c functions' header files.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef OPER_32B_H
+#define OPER_32B_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include        "typedef.h"
+
+#include        "div_32.h"
+#include        "l_comp.h"
+#include        "l_extract.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/p_ol_wgh.h b/media/libstagefright/codecs/amrnb/common/include/p_ol_wgh.h
new file mode 100644
index 0000000..6c277da
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/p_ol_wgh.h
@@ -0,0 +1,144 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/include/p_ol_wgh.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+       File             : p_ol_wgh.h
+       Purpose          : Compute the open loop pitch lag with weighting.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef P_OL_WGH_H
+#define P_OL_WGH_H "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "mode.h"
+#include "vad.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 corrweight[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /* state variable */
+
+    typedef struct
+    {
+        Word16 old_T0_med;
+        Word16 ada_w;
+        Word16 wght_flg;
+    } pitchOLWghtState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    Word16 p_ol_wgh_init(pitchOLWghtState **st);
+    /* initialize one instance of the pre processing state.
+       Stores pointer to filter status struct in *st. This pointer has to
+       be passed to p_ol_wgh in each call.
+       returns 0 on success
+     */
+
+    Word16 p_ol_wgh_reset(pitchOLWghtState *st);
+    /* reset of pre processing state (i.e. set state memory to zero)
+       returns 0 on success
+     */
+
+    void p_ol_wgh_exit(pitchOLWghtState **st);
+    /* de-initialize pre processing state (i.e. free status struct)
+       stores NULL in *st
+     */
+
+    Word16 Pitch_ol_wgh(      /* o   : open loop pitch lag                            */
+        pitchOLWghtState *st, /* i/o : State struct                                   */
+        vadState *vadSt,      /* i/o : VAD state struct                               */
+        Word16 signal[],      /* i   : signal used to compute the open loop pitch     */
+        /*       signal[-pit_max] to signal[-1] should be known */
+        Word16 pit_min,       /* i   : minimum pitch lag                              */
+        Word16 pit_max,       /* i   : maximum pitch lag                              */
+        Word16 L_frame,       /* i   : length of frame to compute pitch               */
+        Word16 old_lags[],    /* i   : history with old stored Cl lags                */
+        Word16 ol_gain_flg[], /* i   : OL gain flag                                   */
+        Word16 idx,           /* i   : index                                          */
+        Flag dtx,             /* i   : dtx flag; use dtx=1, do not use dtx=0          */
+        Flag   *pOverflow     /* o   : overflow flag                                  */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _P_OL_WGH_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/pow2.h b/media/libstagefright/codecs/amrnb/common/include/pow2.h
new file mode 100644
index 0000000..c96fbdd
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/pow2.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/log2_norm.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template. Added extern declaration for pow2_tbl[]
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the prototype declaration for Pow2() function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef POW2_H
+#define POW2_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 pow2_tbl[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word32 Pow2(            /* (o)  : result       (range: 0<=val<=0x7fffffff) */
+        Word16 exponent,    /* (i)  : Integer part.      (range: 0<=val<=30)   */
+        Word16 fraction,    /* (i)  : Fractional part.  (range: 0.0<=val<1.0)  */
+        Flag *pOverflow     /* (i/o) : overflow flag                           */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _POW2_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/pred_lt.h b/media/libstagefright/codecs/amrnb/common/include/pred_lt.h
new file mode 100644
index 0000000..a2bfed2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/pred_lt.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/pred_lt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the pred_lt function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef pred_lt_h
+#define pred_lt_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Pred_lt_3or6(
+        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 flag3,     /* input : if set, upsampling rate = 3 (6 otherwise)  */
+        Flag  *pOverflow  /* output: if set, overflow occurred in this function */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* PRED_LT_H */
diff --git a/media/libstagefright/codecs/amrnb/common/include/pvgsmamr.h b/media/libstagefright/codecs/amrnb/common/include/pvgsmamr.h
new file mode 100644
index 0000000..b697524
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/pvgsmamr.h
@@ -0,0 +1,63 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+#ifndef __PVGSMAMR_H
+#define __PVGSMAMR_H
+
+
+// includes
+#include <e32std.h>
+#include <e32base.h>
+
+#include "sp_dec.h"
+#include "pvglobals.h"
+
+
+// PVGsmDecoder AO
+class CPVGsmDecoder : public CBase
+{
+    public:
+        IMPORT_C static CPVGsmDecoder* NewL(void);
+        IMPORT_C ~CPVGsmDecoder();
+        IMPORT_C TInt StartL(void);
+
+        // only port the API's used in PVPlayer 2.0
+        IMPORT_C TInt DecodeFrame(enum Mode mode, unsigned char* compressedBlock, unsigned char* audioBuffer);
+        IMPORT_C TInt InitDecoder(void);
+        IMPORT_C void ExitDecoder(void);
+
+    private:
+        CPVGsmDecoder();
+        void ConstructL(void);
+
+        Speech_Decode_FrameState* decState;
+        enum RXFrameType rx_type;
+        struct globalDataStruct *gds;
+};
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/q_plsf.h b/media/libstagefright/codecs/amrnb/common/include/q_plsf.h
new file mode 100644
index 0000000..431272a
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/q_plsf.h
@@ -0,0 +1,169 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/q_plsf.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the q_plsf_3.c and q_plsf_5.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef q_plsf_h
+#define q_plsf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define MR795_1_SIZE  512
+#define PAST_RQ_INIT_SIZE 8
+
+#define DICO1_SIZE  256
+#define DICO2_SIZE  512
+#define DICO3_SIZE  512
+
+#define DICO1_5_SIZE  128
+#define DICO2_5_SIZE  256
+#define DICO3_5_SIZE  256
+#define DICO4_5_SIZE  256
+#define DICO5_5_SIZE  64
+
+#define MR515_3_SIZE  128
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 past_rq[M];    /* Past quantized prediction error, Q15 */
+
+    } Q_plsfState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word16 Q_plsf_init(Q_plsfState **st);
+    /* initialize one instance of the state.
+       Stores pointer to filter status struct in *st. This pointer has to
+       be passed to Q_plsf_5 / Q_plsf_3 in each call.
+       returns 0 on success
+     */
+
+    Word16 Q_plsf_reset(Q_plsfState *st);
+    /* reset of state (i.e. set state memory to zero)
+       returns 0 on success
+     */
+
+    void Q_plsf_exit(Q_plsfState **st);
+    /* de-initialize state (i.e. free status struct)
+       stores NULL in *st
+     */
+
+    void Q_plsf_3(
+        Q_plsfState *st,    /* i/o: state struct                             */
+        enum Mode mode,     /* i  : coder mode                               */
+        Word16 *lsp1,       /* i  : 1st LSP vector                      Q15  */
+        Word16 *lsp1_q,     /* o  : quantized 1st LSP vector            Q15  */
+        Word16 *indice,     /* o  : quantization indices of 3 vectors   Q0   */
+        Word16 *pred_init_i,/* o  : init index for MA prediction in DTX mode */
+        Flag  *pOverflow    /* o : Flag set when overflow occurs             */
+    );
+
+    void Q_plsf_5(
+        Q_plsfState *st,
+        Word16 *lsp1,      /* i  : 1st LSP vector,                     Q15 */
+        Word16 *lsp2,      /* i  : 2nd LSP vector,                     Q15 */
+        Word16 *lsp1_q,    /* o  : quantized 1st LSP vector,           Q15 */
+        Word16 *lsp2_q,    /* o  : quantized 2nd LSP vector,           Q15 */
+        Word16 *indice,    /* o  : quantization indices of 5 matrices, Q0  */
+        Flag  *pOverflow   /* o : Flag set when overflow occurs            */
+    );
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _Q_PLSF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/q_plsf_3_tbl.h b/media/libstagefright/codecs/amrnb/common/include/q_plsf_3_tbl.h
new file mode 100644
index 0000000..2e43d10
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/q_plsf_3_tbl.h
@@ -0,0 +1,136 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/q_plsf_3_tbl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, q_plsf_3_tbl.tab
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+#define MR795_1_SIZE  512
+#define PAST_RQ_INIT_SIZE 8
+
+#define DICO1_SIZE  256
+#define DICO2_SIZE  512
+#define DICO3_SIZE  512
+
+#define MR515_3_SIZE  128
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /* Codebooks of LSF prediction residual */
+    extern const Word16 mean_lsf_3[];
+
+    extern const Word16 pred_fac_3[];
+
+    extern const Word16 dico1_lsf_3[];
+    extern const Word16 dico2_lsf_3[];
+    extern const Word16 dico3_lsf_3[];
+
+    extern const Word16 mr515_3_lsf[];
+    extern const Word16 mr795_1_lsf[];
+
+    extern const Word16 past_rq_init[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/q_plsf_5_tbl.h b/media/libstagefright/codecs/amrnb/common/include/q_plsf_5_tbl.h
new file mode 100644
index 0000000..245b5f4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/q_plsf_5_tbl.h
@@ -0,0 +1,110 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/q_plsf_5_tbl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                        Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares tables defined in q_plsf_5_tbl.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef Q_PLSF_5_TBL_H
+#define Q_PLSF_5_TBL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 mean_lsf_5[];
+    extern const Word16 dico1_lsf_5[];
+    extern const Word16 dico2_lsf_5[];
+    extern const Word16 dico3_lsf_5[];
+    extern const Word16 dico4_lsf_5[];
+    extern const Word16 dico5_lsf_5[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/qgain475_tab.h b/media/libstagefright/codecs/amrnb/common/include/qgain475_tab.h
new file mode 100644
index 0000000..6c0d766
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/qgain475_tab.h
@@ -0,0 +1,107 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/qgain475_tab.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                        Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares tables defined in qgain475_tab.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef QGAIN475_TAB_H
+#define QGAIN475_TAB_H
+
+#define MR475_VQ_SIZE 256
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 table_gain_MR475[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/qua_gain.h b/media/libstagefright/codecs/amrnb/common/include/qua_gain.h
new file mode 100644
index 0000000..65b35ee
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/qua_gain.h
@@ -0,0 +1,135 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/qua_gain.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the file, qua_gain.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef qua_gain_h
+#define qua_gain_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "gc_pred.h"
+#include "mode.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define VQ_SIZE_HIGHRATES 128
+#define VQ_SIZE_LOWRATES 64
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word16
+    Qua_gain(                   /* o  : index of quantization.                 */
+        enum Mode mode,         /* i  : AMR mode                               */
+        Word16 exp_gcode0,      /* i  : predicted CB gain (exponent),      Q0  */
+        Word16 frac_gcode0,     /* i  : predicted CB gain (fraction),      Q15 */
+        Word16 frac_coeff[],    /* i  : energy coeff. (5), fraction part,  Q15 */
+        Word16 exp_coeff[],     /* i  : energy coeff. (5), exponent part,  Q0  */
+        /*      (frac_coeff and exp_coeff computed in  */
+        /*       calc_filt_energies())                 */
+        Word16 gp_limit,        /* i  : pitch gain limit                       */
+        Word16 *gain_pit,       /* o  : Pitch gain,                        Q14 */
+        Word16 *gain_cod,       /* o  : Code gain,                         Q1  */
+        Word16 *qua_ener_MR122, /* o  : quantized energy error,            Q10 */
+        /*      (for MR122 MA predictor update)        */
+        Word16 *qua_ener,       /* o  : quantized energy error,            Q10 */
+        /*      (for other MA predictor update)        */
+        Flag   *pOverflow       /* o  : overflow indicator                     */
+    );
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* qua_gain_h */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/qua_gain_tbl.h b/media/libstagefright/codecs/amrnb/common/include/qua_gain_tbl.h
new file mode 100644
index 0000000..a7691e7
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/qua_gain_tbl.h
@@ -0,0 +1,108 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/qua_gain_tbl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                        Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares tables defined in qua_gain_tbl.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef QUA_GAIN_TBL_H
+#define QUA_GAIN_TBL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 table_gain_highrates[];
+    extern const Word16 table_gain_lowrates[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/reorder.h b/media/libstagefright/codecs/amrnb/common/include/reorder.h
new file mode 100644
index 0000000..620cd0b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/reorder.h
@@ -0,0 +1,109 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/reorder.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Reorder_lsf() function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef REORDER_H
+#define REORDER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Reorder_lsf(
+        Word16 *lsf,       /* (i/o)  : vector of LSFs   (range: 0<=val<=0.5)    */
+        Word16 min_dist,   /* (i)    : minimum required distance                */
+        Word16 n,          /* (i)    : LPC order                                */
+        Flag   *pOverflow  /* (i/o)  : overflow Flag                            */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _REORDER_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/residu.h b/media/libstagefright/codecs/amrnb/common/include/residu.h
new file mode 100644
index 0000000..f4d0041
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/residu.h
@@ -0,0 +1,83 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : residu.h
+*      Purpose          : Computes the LP residual.
+*      Description      : The LP residual is computed by filtering the input
+*                       : speech through the LP inverse filter A(z).
+*
+*
+********************************************************************************
+*/
+#ifndef residu_h
+#define residu_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    void Residu(
+        Word16 a[],        /* (i)  : prediction coefficients                    */
+        Word16 x[],        /* (i)  : speech signal                              */
+        Word16 y[],        /* (o)  : residual signal                            */
+        Word16 lg          /* (i)  : size of filtering                          */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/reverse_bits.h b/media/libstagefright/codecs/amrnb/common/include/reverse_bits.h
new file mode 100644
index 0000000..fcc8df6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/reverse_bits.h
@@ -0,0 +1,114 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/include/reverse_bits.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Adding #include "mode.h" so that it compiles and works for the
+              ARM tools.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                        Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the reverse_bits function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef REVERSE_BITS_H
+#define REVERSE_BITS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void reverse_bits(enum Mode mode, unsigned char *pCompressedBlock);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/round.h b/media/libstagefright/codecs/amrnb/common/include/round.h
new file mode 100644
index 0000000..3129e27
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/round.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/round.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for round function.
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the pv_round function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef ROUND_H
+#define ROUND_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 pv_round(Word32 L_var1, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ROUND_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/set_zero.h b/media/libstagefright/codecs/amrnb/common/include/set_zero.h
new file mode 100644
index 0000000..debd223
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/set_zero.h
@@ -0,0 +1,79 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : set_zero.h
+*      Description      : Set vector x[] to zero
+*
+*
+********************************************************************************
+*/
+#ifndef set_zero_h
+#define set_zero_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    void Set_zero(
+        Word16 x[],        /* (o)  : vector to clear                            */
+        Word16 L           /* (i)  : length of vector                           */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/shl.h b/media/libstagefright/codecs/amrnb/common/include/shl.h
new file mode 100644
index 0000000..84ca8d9
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/shl.h
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/shl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for shl function.
+
+ Description: Changed prototype of the mult() function. Instead of using global
+              a pointer to overflow flag is now passed into the function.
+
+ Description: Updated template. Changed the parameter name from "overflow" to
+              "pOverflow" in the function prototype declaration
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the shl function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SHL_H
+#define SHL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 shl(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _SHL_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/shr.h b/media/libstagefright/codecs/amrnb/common/include/shr.h
new file mode 100644
index 0000000..e961c04
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/shr.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/shr.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for shr function.
+
+ Description: Changed the function prototype declaration.
+              Updated template.
+
+ Description: Updated template. Changed the parameter name from "overflow" to
+              "pOverflow" in the function prototype declaration
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the shr function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SHR_H
+#define SHR_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 shr(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _SHR_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/shr_r.h b/media/libstagefright/codecs/amrnb/common/include/shr_r.h
new file mode 100644
index 0000000..c4f9e2c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/shr_r.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/include/shr_r.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for shr_r function.
+
+ Description: Passing in pOverflow.
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #define after Include section.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the shr_r function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SHR_R_H
+#define SHR_R_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 shr_r(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/sqrt_l.h b/media/libstagefright/codecs/amrnb/common/include/sqrt_l.h
new file mode 100644
index 0000000..86209bd
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/sqrt_l.h
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/sqrt_l.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Updated function prototype declaration to reflect new interface.
+              A pointer to overflow flag is passed into the function. Updated
+              template.
+
+ Description: Added extern declaration for sqrt_l_tbl[]
+
+ Description: Moved _cplusplus #ifdef before function prototype.
+
+ Who:                           Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the sqrt_l() function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef SQRT_L_H
+#define SQRT_L_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 sqrt_l_tbl[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word32 sqrt_l_exp(      /* o : output value,                          Q31 */
+        Word32 L_x,         /* i : input value,                           Q31 */
+        Word16 *pExp,       /* o : right shift to be applied to result,   Q1  */
+        Flag   *pOverflow   /* i : pointer to overflow flag */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SQRT_L__H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/sub.h b/media/libstagefright/codecs/amrnb/common/include/sub.h
new file mode 100644
index 0000000..18dc456
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/sub.h
@@ -0,0 +1,115 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/sub.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate header file for sub function.
+
+ Description: Changed function prototype declaration.
+
+ Description: Updated copyright information.
+              Updated variable name from "overflow" to "pOverflow" to match
+              with original function declaration.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the sub function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SUB_H
+#define SUB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 sub(Word16 var1, Word16 var2, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _SUB_H_ */
diff --git a/media/libstagefright/codecs/amrnb/common/include/syn_filt.h b/media/libstagefright/codecs/amrnb/common/include/syn_filt.h
new file mode 100644
index 0000000..7fff112
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/syn_filt.h
@@ -0,0 +1,83 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : syn_filt.h
+*      Purpose          : Perform synthesis filtering through 1/A(z).
+*
+*
+********************************************************************************
+*/
+#ifndef syn_filt_h
+#define syn_filt_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    void Syn_filt(
+        Word16 a[],        /* (i)  : a[m+1] prediction coefficients   (m=10)    */
+        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.           */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/typedef.h b/media/libstagefright/codecs/amrnb/common/include/typedef.h
new file mode 100644
index 0000000..ee4d732
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/typedef.h
@@ -0,0 +1,73 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : typedef.c
+*      Purpose          : Basic types.
+*
+********************************************************************************
+*/
+#ifndef typedef_h
+#define typedef_h "$Id $"
+
+#undef ORIGINAL_TYPEDEF_H /* CHANGE THIS TO #define to get the      */
+/*  "original" ETSI version of typedef.h  */
+/* CHANGE TO #undef for PV version        */
+
+#ifdef ORIGINAL_TYPEDEF_H
+/*
+ * this is the original code from the ETSI file typedef.h
+ */
+
+#if   defined(__unix__) || defined(__unix)
+typedef signed char Word8;
+typedef short Word16;
+typedef int Word32;
+typedef int Flag;
+
+#else
+#error No System recognized
+#endif
+#else /* not original typedef.h */
+
+/*
+ * use (improved) type definition file typdefs.h
+ */
+#include "gsm_amr_typedefs.h"
+
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/vad.h b/media/libstagefright/codecs/amrnb/common/include/vad.h
new file mode 100644
index 0000000..b9ee89f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/vad.h
@@ -0,0 +1,76 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+**-------------------------------------------------------------------------**
+**                                                                         **
+**     GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001       **
+**                               R99   Version 3.2.0                       **
+**                               REL-4 Version 4.0.0                       **
+**                                                                         **
+**-------------------------------------------------------------------------**
+********************************************************************************
+*
+*      File             : vad.h
+*      Purpose          : Voice Activity Detection (VAD) for AMR
+*
+********************************************************************************
+*/
+#ifndef vad_h
+#define vad_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+
+#include "vad1.h"   /* for VAD option 1 */
+#include "vad2.h"   /* for VAD option 2 */
+
+/*
+********************************************************************************
+*                         LOCAL VARIABLES AND TABLES
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+*                         DEFINITION OF DATA TYPES
+********************************************************************************
+*/
+
+#ifndef VAD2
+#define vadState vadState1
+#else
+#define vadState vadState2
+#endif
+
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/vad1.h b/media/libstagefright/codecs/amrnb/common/include/vad1.h
new file mode 100644
index 0000000..c144ea0
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/vad1.h
@@ -0,0 +1,197 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/include/vad_1.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions, prototype and structure
+ definitions needed by vad_1.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef vad_1_h
+#define vad_1_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst_vad.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /* state variable */
+    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[3][2];        /* memory for the filter bank               */
+        Word16 a_data3[5];           /* 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 three variables (vadreg, pitch and tone)
+           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 pitch;                /* flags for pitch detection                */
+        Word16 tone;                 /* flags for tone detection                 */
+        Word16 complex_high;         /* flags for complex detection              */
+        Word16 complex_low;          /* flags for complex detection              */
+
+        Word16 oldlag_count, oldlag; /* variables for pitch detection            */
+
+        Word16 complex_hang_count;   /* complex hangover counter, used by VAD    */
+        Word16 complex_hang_timer;   /* hangover initiator, used by CAD          */
+
+        Word16 best_corr_hp;         /* FIP filtered value Q15                   */
+
+        Word16 speech_vad_decision;  /* final decision                           */
+        Word16 complex_warning;      /* complex background warning               */
+
+        Word16 sp_burst_count;       /* counts length of a speech burst incl     */
+        Word16 corr_hp_fast;         /* filtered value                           */
+    } vadState1;
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16 vad1_init(vadState1 **st);
+    /* initialize one instance of the pre processing state.
+       Stores pointer to filter status struct in *st. This pointer has to
+       be passed to vad in each call.
+       returns 0 on success
+     */
+
+    Word16 vad1_reset(vadState1 *st);
+    /* reset of pre processing state (i.e. set state memory to zero)
+       returns 0 on success
+     */
+
+    void vad1_exit(vadState1 **st);
+    /* de-initialize pre processing state (i.e. free status struct)
+       stores NULL in *st
+     */
+
+    void vad_complex_detection_update(vadState1 *st,       /* i/o : State struct     */
+                                      Word16 best_corr_hp /* i   : best Corr Q15    */
+                                     );
+
+    void vad_tone_detection(vadState1 *st,  /* i/o : State struct            */
+                            Word32 t0,     /* i   : autocorrelation maxima  */
+                            Word32 t1,     /* i   : energy                  */
+                            Flag   *pOverflow
+                           );
+
+    void vad_tone_detection_update(
+        vadState1 *st,             /* i/o : State struct              */
+        Word16 one_lag_per_frame,  /* i   : 1 if one open-loop lag is
+                                              calculated per each frame,
+                                              otherwise 0                     */
+        Flag *pOverflow
+    );
+
+    void vad_pitch_detection(vadState1 *st,   /* i/o : State struct                  */
+                             Word16 lags[],  /* i   : speech encoder open loop lags */
+                             Flag   *pOverflow
+                            );
+
+    Word16 vad1(vadState1 *st,   /* i/o : State struct                      */
+                Word16 in_buf[], /* i   : samples of the input frame
+                                inbuf[159] is the very last sample,
+                                incl lookahead                          */
+                Flag *pOverflow
+               );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VAD1_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/vad2.h b/media/libstagefright/codecs/amrnb/common/include/vad2.h
new file mode 100644
index 0000000..3197b3a
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/vad2.h
@@ -0,0 +1,203 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/include/vad2.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Added pOverflow to the r_fft function prototype.
+
+ Description: Added pOverflow to the LTP_flag_update prototype.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions, prototype and structure
+ definitions needed by vad_2.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef vad_2_h
+#define vad_2_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+#define     YES     1
+#define     NO      0
+#define     ON      1
+#define     OFF     0
+#define     TRUE        1
+#define     FALSE       0
+
+#define     FRM_LEN                 80
+#define     DELAY                   24
+#define     FFT_LEN                 128
+
+#define     NUM_CHAN                16
+#define     LO_CHAN                 0
+#define     HI_CHAN                 15
+
+#define     UPDATE_THLD             35
+#define     HYSTER_CNT_THLD         6
+#define     UPDATE_CNT_THLD         50
+
+#define     SHIFT_STATE_0       0       /* channel energy scaled as 22,9 */
+#define     SHIFT_STATE_1       1       /* channel energy scaled as 27,4 */
+
+#define     NOISE_FLOOR_CHAN_0  512     /* 1.0    scaled as 22,9 */
+#define     MIN_CHAN_ENRG_0     32      /* 0.0625 scaled as 22,9 */
+#define     MIN_NOISE_ENRG_0    32      /* 0.0625 scaled as 22,9 */
+#define     INE_NOISE_0     8192        /* 16.0   scaled as 22,9 */
+#define     FRACTIONAL_BITS_0   9       /* used as input to fn10Log10() */
+
+#define     NOISE_FLOOR_CHAN_1  16      /* 1.0    scaled as 27,4 */
+#define     MIN_CHAN_ENRG_1     1       /* 0.0625 scaled as 27,4 */
+#define     MIN_NOISE_ENRG_1    1       /* 0.0625 scaled as 27,4 */
+#define     INE_NOISE_1     256     /* 16.0   scaled as 27,4 */
+#define     FRACTIONAL_BITS_1   4       /* used as input to fn10Log10() */
+
+#define     STATE_1_TO_0_SHIFT_R    (FRACTIONAL_BITS_1-FRACTIONAL_BITS_0)   /* state correction factor */
+#define     STATE_0_TO_1_SHIFT_R    (FRACTIONAL_BITS_0-FRACTIONAL_BITS_1)   /* state correction factor */
+
+#define         HIGH_ALPHA              29491       /* 0.9 scaled as 0,15 */
+#define         LOW_ALPHA               22938       /* 0.7 scaled as 0,15 */
+#define         ALPHA_RANGE             (HIGH_ALPHA - LOW_ALPHA)
+#define         DEV_THLD                7168        /* 28.0 scaled as 7,8 */
+
+#define         PRE_EMP_FAC             (-26214)    /* -0.8 scaled as 0,15 */
+
+#define         CEE_SM_FAC              18022       /* 0.55 scaled as 0,15 */
+#define         ONE_MINUS_CEE_SM_FAC    14746       /* 0.45 scaled as 0,15 */
+
+#define         CNE_SM_FAC              3277        /* 0.1 scaled as 0,15 */
+#define         ONE_MINUS_CNE_SM_FAC    29491       /* 0.9 scaled as 0,15 */
+
+#define         FFT_HEADROOM            2
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    typedef struct
+    {
+        Word16 pre_emp_mem;
+        Word16 update_cnt;
+        Word16 hyster_cnt;
+        Word16 last_update_cnt;
+        Word16 ch_enrg_long_db[NUM_CHAN];   /* scaled as 7,8  */
+
+        Word32 Lframe_cnt;
+        Word32 Lch_enrg[NUM_CHAN];  /* scaled as 22,9 or 27,4 */
+        Word32 Lch_noise[NUM_CHAN]; /* scaled as 22,9 */
+
+        Word16 last_normb_shift;    /* last block norm shift count */
+
+        Word16 tsnr;            /* total signal-to-noise ratio in dB (scaled as 7,8) */
+        Word16 hangover;
+        Word16 burstcount;
+        Word16 fupdate_flag;        /* forced update flag from previous frame */
+        Word16 negSNRvar;       /* Negative SNR variance (scaled as 7,8) */
+        Word16 negSNRbias;      /* sensitivity bias from negative SNR variance (scaled as 15,0) */
+
+        Word16 shift_state;     /* use 22,9 or 27,4 scaling for ch_enrg[] */
+
+        Word32 L_R0;
+        Word32 L_Rmax;
+        Flag   LTP_flag;        /* Use to indicate the the LTP gain is > LTP_THRESH */
+
+    } vadState2;
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Word16  vad2(Word16 *farray_ptr, vadState2 *st, Flag *pOverflow);
+    Word16 vad2_init(vadState2 **st);
+    Word16 vad2_reset(vadState2 *st);
+    void    vad2_exit(vadState2 **state);
+
+    void    r_fft(Word16 *farray_ptr, Flag *pOverflow);
+
+    void    LTP_flag_update(vadState2 *st, Word16 mode, Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _VAD2_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/weight_a.h b/media/libstagefright/codecs/amrnb/common/include/weight_a.h
new file mode 100644
index 0000000..0358c85
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/weight_a.h
@@ -0,0 +1,81 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : weight_a.h
+*      Purpose          : Spectral expansion of LP coefficients.  (order==10)
+*      Description      : a_exp[i] = a[i] * fac[i-1]    ,i=1,10
+*
+*
+********************************************************************************
+*/
+#ifndef weight_a_h
+#define weight_a_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    void Weight_Ai(
+        Word16 a[],        /* (i)  : a[m+1]  LPC coefficients   (m=10)          */
+        const Word16 fac[],/* (i)  : Spectral expansion factors.                */
+        Word16 a_exp[]     /* (o)  : Spectral expanded LPC coefficients         */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/include/window_tab.h b/media/libstagefright/codecs/amrnb/common/include/window_tab.h
new file mode 100644
index 0000000..42233af
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/window_tab.h
@@ -0,0 +1,109 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: .audio/gsm-amr/c/include/window_tab.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file declares a tables in window_tab.c used in lpc.c.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef WINDOW_TAB_H
+#define WINDOW_TAB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 window_200_40[];
+    extern const Word16 window_160_80[];
+    extern const Word16 window_232_8[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/include/wmf_to_ets.h b/media/libstagefright/codecs/amrnb/common/include/wmf_to_ets.h
new file mode 100644
index 0000000..8bcccc8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/include/wmf_to_ets.h
@@ -0,0 +1,119 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/include/src/wmf_to_ets.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed mode to frame_type_3gpp
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the wmf_to_ets function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef WMF_TO_ETS_H
+#define WMF_TO_ETS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "frame_type_3gpp.h"
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void wmf_to_ets(enum Frame_Type_3GPP frame_type_3gpp,
+    UWord8   *wmf_input_ptr,
+    Word16   *ets_output_ptr);
+
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/pvgsmamrdecoderinterface.h b/media/libstagefright/codecs/amrnb/common/pvgsmamrdecoderinterface.h
new file mode 100644
index 0000000..ccbed44
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/pvgsmamrdecoderinterface.h
@@ -0,0 +1,183 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+//////////////////////////////////////////////////////////////////////////////////
+//                                                                              //
+//  File: pvgsmamrdecoderinterface.h                                            //
+//                                                                              //
+//////////////////////////////////////////////////////////////////////////////////
+
+#ifndef _PVGSMAMR_DECODER_INTERFACE_H
+#define _PVGSMAMR_DECODER_INTERFACE_H
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+typedef enum
+{
+    /*
+     *    One word (2-byte) to indicate type of frame type.
+     *    One word (2-byte) to indicate frame type.
+     *    One word (2-byte) to indicate mode.
+     *    N words (2-byte) containing N bits (bit 0 = 0xff81, bit 1 = 0x007f).
+     */
+    ETS = 0, /* Both AMR-Narrowband and AMR-Wideband */
+
+    /*
+     *    One word (2-byte) for sync word (good frames: 0x6b21, bad frames: 0x6b20)
+     *    One word (2-byte) for frame length N.
+     *    N words (2-byte) containing N bits (bit 0 = 0x007f, bit 1 = 0x0081).
+     */
+    ITU, /* AMR-Wideband */
+
+    /*
+     *   AMR-WB MIME/storage format, see RFC 3267 (sections 5.1 and 5.3) for details
+     */
+    MIME_IETF,
+
+    WMF, /* AMR-Narrowband */
+
+    IF2  /* AMR-Narrowband */
+
+} bitstream_format;
+
+
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+typedef struct
+{
+    int16_t prev_ft;
+    int16_t prev_mode;
+} RX_State;
+
+
+typedef struct tPVAmrDecoderExternal
+{
+    /*
+     * INPUT:
+     * Pointer to the input buffer that contains the encoded bistream data.
+     * The data is filled in such that the first bit transmitted is
+     * the most-significant bit (MSB) of the first array element.
+     * The buffer is accessed in a linear fashion for speed, and the number of
+     * bytes consumed varies frame to frame. This is use for mime/ietf data
+     */
+    uint8_t  *pInputBuffer;
+
+    /*
+     * INPUT:
+     * Pointer to the input buffer that contains the encoded stream data.
+     * The data is filled such that the first bit transmitted is
+     * in the  first int16_t element.
+     * The buffer is accessed in a linear fashion for speed, and the number of
+     * bytes consumed varies frame to frame.
+     */
+    int16_t  *pInputSampleBuffer;
+
+    /*
+     * INPUT: (but what is pointed to is an output)
+     * Pointer to the output buffer to hold the 16-bit PCM audio samples.
+     */
+    int16_t  *pOutputBuffer;
+
+    /*
+     * INPUT:
+     * Number of requested output audio channels. This relieves the calling
+     * environment from having to perform stereo-to-mono or mono-to-stereo
+     * conversions.
+     */
+    int32_t     desiredChannels;
+
+    /*
+         * INPUT:
+         * Format type of the encoded bitstream.
+         */
+    bitstream_format     input_format;
+
+    /*
+     * OUTPUT:
+     * The sampling rate decoded from the bitstream, in units of
+     * samples/second. For this release of the library this value does
+     * not change from frame to frame, but future versions will.
+     */
+    int32_t   samplingRate;
+
+    /*
+     * OUTPUT:
+     * This value is the bitrate in units of bits/second. IT
+     * is calculated using the number of bits consumed for the current frame,
+     * and then multiplying by the sampling_rate, divided by points in a frame.
+     * This value can changes frame to frame.
+     */
+    int32_t   bitRate;
+
+    /*
+     * OUTPUT:
+     * The number of channels decoded from the bitstream. The output data
+     * will have be the amount specified in the variable desiredChannels,
+     * this output is informative only, and can be ignored.
+     */
+    int32_t     encodedChannels;
+
+    /*
+     * OUTPUT:
+     * This value is the number of output PCM samples per channel.
+     * It is  320.
+     */
+    int16_t     frameLength;
+
+    /*
+     * OUTPUT:
+     * This value is the quality indicator. 1 (good)  0 (bad)
+    */
+    uint8_t     quality;
+
+
+    /*
+     * OUTPUT:
+     *  GSM AMR NB and WB mode (i.e. bit-rate )
+     */
+    int16_t     mode;
+    int16_t     mode_old;
+
+    /*
+     * OUTPUT:
+     *  GSM AMR NB and WB frame type ( speech_good, speech_bad, sid, etc.)
+     */
+    int16_t     frame_type;
+
+    int16_t reset_flag;
+    int16_t reset_flag_old;
+
+    /*
+     * OUTPUT:
+     *  Decoder  status
+     */
+    int32_t     status;
+
+    /*
+     * OUTPUT:
+     *  Rx status state
+     */
+    RX_State  rx_state;
+
+} tPVAmrDecoderExternal;
+
+#endif
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/add.cpp b/media/libstagefright/codecs/amrnb/common/src/add.cpp
new file mode 100644
index 0000000..d488ca5
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/add.cpp
@@ -0,0 +1,203 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/add.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for add function. Sync'ed up with the
+          current template and fixed tabs.
+
+ Description: Changed all occurrences of L_sum with sum.
+
+ Description: Changed function protype to pass in pointer to Overflow flag
+                as a parameter.
+
+ Description: Removed code that updates MOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Summation function with overflow control
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: add
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ 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 <= var2 <= 0x0000 7fff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the add operation resulted in overflow
+
+ Returns:
+    sum = 16-bit limited sum of var1 and var2 (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function 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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] add.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Word16 add (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 sum;
+
+    sum = (Word32) var1 + var2;
+
+* The reference ETSI code uses a global flag for Overflow inside the function
+* saturate(). In the actual implementation a pointer to Overflow flag is passed in
+* as a parameter to the function
+
+    var_out = saturate (sum);
+#if (WMOPS)
+    multiCounter[currCounter].add++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 add(Word16 var1, Word16 var2, Flag *pOverflow)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Word32 sum;
+    sum = (Word32) var1 + var2;
+
+    /* Saturate result (if necessary). */
+    /* Replaced function call with in-line code             */
+    /* to conserve MIPS, i.e., var_out = saturate (sum)  */
+
+    if (sum > 0X00007fffL)
+    {
+        *pOverflow = 1;
+        sum = MAX_16;
+    }
+    else if (sum < (Word32) 0xffff8000L)
+    {
+        *pOverflow = 1;
+        sum = MIN_16;
+    }
+
+    /* Return the sum as a 16 bit value by type casting Word32 to Word16 */
+
+    return ((Word16) sum);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp b/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp
new file mode 100644
index 0000000..bd99b30
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/az_lsp.cpp
@@ -0,0 +1,740 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/az_lsp.c
+ Funtions: Chebps
+           Chebps_Wrapper
+           Az_lsp
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Finished first pass of optimization.
+
+ Description: Made changes based on review comments.
+
+ Description: Made input to Chebps_Wrapper consistent with that of Chebps.
+
+ Description: Replaced current Pseudo-code with the UMTS code version 3.2.0.
+              Updated coding template.
+
+ Description: Replaced basic_op.h and oper_32b.h with the header files of the
+              math functions used by the file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Used "-" operator instead of calling sub function in the
+                 az_lsp() code.
+              2. Copied detailed function description of az_lsp from the
+                 header file.
+              3. Modified local variable definition to one per line.
+              4. Used NC in the definition of f1 and f2 arrays.
+              5. Added curly brackets in the IF statement.
+
+ Description: Changed function interface to pass in a pointer to overflow
+              flag into the function instead of using a global flag. Removed
+              inclusion of unneeded header files.
+
+ Description:  For Chebps() and Az_lsp()
+              1. Eliminated unused include files.
+              2. Replaced array addressing by pointers
+              3. Eliminated math operations that unnecessary checked for
+                 saturation.
+              4. Eliminated not needed variables
+              5. Eliminated if-else checks for saturation
+              6. Deleted unused function cheps_wraper
+
+ Description:  Added casting to eliminate warnings
+
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ These modules compute the LSPs from the LP coefficients.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "az_lsp.h"
+#include "cnst.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NC   M/2                  /* M = LPC order, NC = M/2 */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Chebps
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    x = input value (Word16)
+    f = polynomial (Word16)
+    n = polynomial order (Word16)
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the operations in the function resulted in saturation.
+
+ Returns:
+    cheb = Chebyshev polynomial for the input value x.(Word16)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This module evaluates the Chebyshev polynomial series.
+    - The polynomial order is   n = m/2 = 5
+    - The polynomial F(z) (F1(z) or F2(z)) is given by
+        F(w) = 2 exp(-j5w) C(x)
+        where
+        C(x) = T_n(x) + f(1)T_n-1(x) + ... +f(n-1)T_1(x) + f(n)/2
+        and T_m(x) = cos(mw) is the mth order Chebyshev
+        polynomial ( x=cos(w) )
+    - C(x) for the input x is returned.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ az_lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word16 Chebps (Word16 x,
+                      Word16 f[], // (n)
+                      Word16 n)
+{
+    Word16 i, cheb;
+    Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
+    Word32 t0;
+
+// The reference ETSI code uses a global flag for Overflow. However, in the
+// actual implementation a pointer to Overflow flag is passed in as a
+// parameter to the function. This pointer is passed into all the basic math
+// functions invoked
+
+    b2_h = 256; // b2 = 1.0
+    b2_l = 0;
+
+    t0 = L_mult (x, 512);          // 2*x
+    t0 = L_mac (t0, f[1], 8192);   // + f[1]
+    L_Extract (t0, &b1_h, &b1_l);  // b1 = 2*x + f[1]
+
+    for (i = 2; i < n; i++)
+    {
+        t0 = Mpy_32_16 (b1_h, b1_l, x);         // t0 = 2.0*x*b1
+        t0 = L_shl (t0, 1);
+        t0 = L_mac (t0, b2_h, (Word16) 0x8000); // t0 = 2.0*x*b1 - b2
+        t0 = L_msu (t0, b2_l, 1);
+        t0 = L_mac (t0, f[i], 8192);            // t0 = 2.0*x*b1 - b2 + f[i]
+
+        L_Extract (t0, &b0_h, &b0_l);           // b0 = 2.0*x*b1 - b2 + f[i]
+
+        b2_l = b1_l; // b2 = b1;
+        b2_h = b1_h;
+        b1_l = b0_l; // b1 = b0;
+        b1_h = b0_h;
+    }
+
+    t0 = Mpy_32_16 (b1_h, b1_l, x);             // t0 = x*b1;
+    t0 = L_mac (t0, b2_h, (Word16) 0x8000);     // t0 = x*b1 - b2
+    t0 = L_msu (t0, b2_l, 1);
+    t0 = L_mac (t0, f[i], 4096);                // t0 = x*b1 - b2 + f[i]/2
+
+    t0 = L_shl (t0, 6);
+
+    cheb = extract_h (t0);
+
+    return (cheb);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 Chebps(Word16 x,
+                     Word16 f[], /* (n) */
+                     Word16 n,
+                     Flag *pOverflow)
+{
+    Word16 i;
+    Word16 cheb;
+    Word16 b1_h;
+    Word16 b1_l;
+    Word32 t0;
+    Word32 L_temp;
+    Word16 *p_f = &f[1];
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    /* L_temp = 1.0 */
+
+    L_temp = 0x01000000L;
+
+    t0 = ((Word32) x << 10) + ((Word32) * (p_f++) << 14);
+
+    /* b1 = t0 = 2*x + f[1]  */
+
+    b1_h = (Word16)(t0 >> 16);
+    b1_l = (Word16)((t0 >> 1) - (b1_h << 15));
+
+
+    for (i = 2; i < n; i++)
+    {
+        /* t0 = 2.0*x*b1    */
+        t0  = ((Word32) b1_h * x);
+        t0 += ((Word32) b1_l * x) >> 15;
+        t0 <<= 2;
+
+        /* t0 = 2.0*x*b1 - b2   */
+        t0 -= L_temp;
+
+        /* t0 = 2.0*x*b1 - b2 + f[i] */
+        t0 += (Word32) * (p_f++) << 14;
+
+        L_temp = ((Word32) b1_h << 16) + ((Word32) b1_l << 1);
+
+        /* b0 = 2.0*x*b1 - b2 + f[i]*/
+        b1_h = (Word16)(t0 >> 16);
+        b1_l = (Word16)((t0 >> 1) - (b1_h << 15));
+
+    }
+
+    /* t0 = x*b1; */
+    t0  = ((Word32) b1_h * x);
+    t0 += ((Word32) b1_l * x) >> 15;
+    t0 <<= 1;
+
+
+    /* t0 = x*b1 - b2   */
+    t0 -= L_temp;
+
+    /* t0 = x*b1 - b2 + f[i]/2 */
+    t0 += (Word32) * (p_f) << 13;
+
+
+    if ((UWord32)(t0 - 0xfe000000L) < 0x01ffffffL -  0xfe000000L)
+    {
+        cheb = (Word16)(t0 >> 10);
+    }
+    else
+    {
+        if (t0 > (Word32) 0x01ffffffL)
+        {
+            cheb = MAX_16;
+
+        }
+        else
+        {
+            cheb = MIN_16;
+        }
+    }
+
+    return (cheb);
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Az_lsp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS FOR Az_lsp
+
+ Inputs:
+    a = predictor coefficients (Word16)
+    lsp = line spectral pairs (Word16)
+    old_lsp = old line spectral pairs (Word16)
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the operations in the function resulted in saturation.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes the LSPs from the LP coefficients.
+
+ The sum and difference filters are computed and divided by 1+z^{-1} and
+ 1-z^{-1}, respectively.
+
+     f1[i] = a[i] + a[11-i] - f1[i-1] ;   i=1,...,5
+     f2[i] = a[i] - a[11-i] + f2[i-1] ;   i=1,...,5
+
+ The roots of F1(z) and F2(z) are found using Chebyshev polynomial evaluation.
+ The polynomials are evaluated at 60 points regularly spaced in the
+ frequency domain. The sign change interval is subdivided 4 times to better
+ track the root. The LSPs are found in the cosine domain [1,-1].
+
+ If less than 10 roots are found, the LSPs from the past frame are used.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ az_lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Az_lsp (
+    Word16 a[],         // (i)  : predictor coefficients (MP1)
+    Word16 lsp[],       // (o)  : line spectral pairs (M)
+    Word16 old_lsp[]    // (i)  : old lsp[] (in case not found 10 roots) (M)
+)
+{
+    Word16 i, j, nf, ip;
+    Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
+    Word16 x, y, sign, exp;
+    Word16 *coef;
+    Word16 f1[M / 2 + 1], f2[M / 2 + 1];
+    Word32 t0;
+
+     *-------------------------------------------------------------*
+     *  find the sum and diff. pol. F1(z) and F2(z)                *
+     *    F1(z) <--- F1(z)/(1+z**-1) & F2(z) <--- F2(z)/(1-z**-1)  *
+     *                                                             *
+     * f1[0] = 1.0;                                                *
+     * f2[0] = 1.0;                                                *
+     *                                                             *
+     * for (i = 0; i< NC; i++)                                     *
+     * {                                                           *
+     *   f1[i+1] = a[i+1] + a[M-i] - f1[i] ;                       *
+     *   f2[i+1] = a[i+1] - a[M-i] + f2[i] ;                       *
+     * }                                                           *
+     *-------------------------------------------------------------*
+
+    f1[0] = 1024; // f1[0] = 1.0
+    f2[0] = 1024; // f2[0] = 1.0
+
+// The reference ETSI code uses a global flag for Overflow. However, in the
+// actual implementation a pointer to Overflow flag is passed in as a
+// parameter to the function. This pointer is passed into all the basic math
+// functions invoked
+
+    for (i = 0; i < NC; i++)
+    {
+        t0 = L_mult (a[i + 1], 8192);   // x = (a[i+1] + a[M-i]) >> 2
+        t0 = L_mac (t0, a[M - i], 8192);
+        x = extract_h (t0);
+        // f1[i+1] = a[i+1] + a[M-i] - f1[i]
+        f1[i + 1] = sub (x, f1[i]);
+
+        t0 = L_mult (a[i + 1], 8192);   // x = (a[i+1] - a[M-i]) >> 2
+        t0 = L_msu (t0, a[M - i], 8192);
+        x = extract_h (t0);
+        // f2[i+1] = a[i+1] - a[M-i] + f2[i]
+        f2[i + 1] = add (x, f2[i]);
+    }
+
+     *-------------------------------------------------------------*
+     * find the LSPs using the Chebychev pol. evaluation           *
+     *-------------------------------------------------------------*
+
+    nf = 0; // number of found frequencies
+    ip = 0; // indicator for f1 or f2
+
+    coef = f1;
+
+    xlow = grid[0];
+    ylow = Chebps (xlow, coef, NC);
+
+    j = 0;
+    // while ( (nf < M) && (j < grid_points) )
+    while ((sub (nf, M) < 0) && (sub (j, grid_points) < 0))
+    {
+        j++;
+        xhigh = xlow;
+        yhigh = ylow;
+        xlow = grid[j];
+        ylow = Chebps (xlow, coef, NC);
+
+        if (L_mult (ylow, yhigh) <= (Word32) 0L)
+        {
+
+            // divide 4 times the interval
+
+            for (i = 0; i < 4; i++)
+            {
+                // xmid = (xlow + xhigh)/2
+                xmid = add (shr (xlow, 1), shr (xhigh, 1));
+                ymid = Chebps (xmid, coef, NC);
+
+                if (L_mult (ylow, ymid) <= (Word32) 0L)
+                {
+                    yhigh = ymid;
+                    xhigh = xmid;
+                }
+                else
+                {
+                    ylow = ymid;
+                    xlow = xmid;
+                }
+            }
+
+             *-------------------------------------------------------------*
+             * Linear interpolation                                        *
+             *    xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);            *
+             *-------------------------------------------------------------*
+
+            x = sub (xhigh, xlow);
+            y = sub (yhigh, ylow);
+
+            if (y == 0)
+            {
+                xint = xlow;
+            }
+            else
+            {
+                sign = y;
+                y = abs_s (y);
+                exp = norm_s (y);
+                y = shl (y, exp);
+                y = div_s ((Word16) 16383, y);
+                t0 = L_mult (x, y);
+                t0 = L_shr (t0, sub (20, exp));
+                y = extract_l (t0);     // y= (xhigh-xlow)/(yhigh-ylow)
+
+                if (sign < 0)
+                    y = negate (y);
+
+                t0 = L_mult (ylow, y);
+                t0 = L_shr (t0, 11);
+                xint = sub (xlow, extract_l (t0)); // xint = xlow - ylow*y
+            }
+
+            lsp[nf] = xint;
+            xlow = xint;
+            nf++;
+
+            if (ip == 0)
+            {
+                ip = 1;
+                coef = f2;
+            }
+            else
+            {
+                ip = 0;
+                coef = f1;
+            }
+            ylow = Chebps (xlow, coef, NC);
+
+        }
+    }
+
+    // Check if M roots found
+
+    if (sub (nf, M) < 0)
+    {
+        for (i = 0; i < M; i++)
+        {
+            lsp[i] = old_lsp[i];
+        }
+
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Az_lsp(
+    Word16 a[],         /* (i)  : predictor coefficients (MP1)               */
+    Word16 lsp[],       /* (o)  : line spectral pairs (M)                    */
+    Word16 old_lsp[],   /* (i)  : old lsp[] (in case not found 10 roots) (M) */
+    Flag   *pOverflow   /* (i/o): overflow flag                              */
+)
+{
+    register Word16 i;
+    register Word16 j;
+    register Word16 nf;
+    register Word16 ip;
+    Word16 xlow;
+    Word16 ylow;
+    Word16 xhigh;
+    Word16 yhigh;
+    Word16 xmid;
+    Word16 ymid;
+    Word16 xint;
+    Word16 x;
+    Word16 y;
+    Word16 sign;
+    Word16 exp;
+    Word16 *coef;
+    Word16 f1[NC + 1];
+    Word16 f2[NC + 1];
+    Word32 L_temp1;
+    Word32 L_temp2;
+    Word16 *p_f1 = f1;
+    Word16 *p_f2 = f2;
+
+    /*-------------------------------------------------------------*
+     *  find the sum and diff. pol. F1(z) and F2(z)                *
+     *    F1(z) <--- F1(z)/(1+z**-1) & F2(z) <--- F2(z)/(1-z**-1)  *
+     *                                                             *
+     * f1[0] = 1.0;                                                *
+     * f2[0] = 1.0;                                                *
+     *                                                             *
+     * for (i = 0; i< NC; i++)                                     *
+     * {                                                           *
+     *   f1[i+1] = a[i+1] + a[M-i] - f1[i] ;                       *
+     *   f2[i+1] = a[i+1] - a[M-i] + f2[i] ;                       *
+     * }                                                           *
+     *-------------------------------------------------------------*/
+
+    *p_f1 = 1024;                       /* f1[0] = 1.0 */
+    *p_f2 = 1024;                       /* f2[0] = 1.0 */
+
+    for (i = 0; i < NC; i++)
+    {
+        L_temp1 = (Word32) * (a + i + 1);
+        L_temp2 = (Word32) * (a + M - i);
+        /* x = (a[i+1] + a[M-i]) >> 2  */
+        x = (Word16)((L_temp1 + L_temp2) >> 2);
+        /* y = (a[i+1] - a[M-i]) >> 2 */
+        y = (Word16)((L_temp1 - L_temp2) >> 2);
+        /* f1[i+1] = a[i+1] + a[M-i] - f1[i] */
+        x -= *(p_f1++);
+        *(p_f1) = x;
+        /* f2[i+1] = a[i+1] - a[M-i] + f2[i] */
+        y += *(p_f2++);
+        *(p_f2) = y;
+    }
+
+    /*-------------------------------------------------------------*
+     * find the LSPs using the Chebychev pol. evaluation           *
+     *-------------------------------------------------------------*/
+
+    nf = 0;                         /* number of found frequencies */
+    ip = 0;                         /* indicator for f1 or f2      */
+
+    coef = f1;
+
+    xlow = *(grid);
+    ylow = Chebps(xlow, coef, NC, pOverflow);
+
+    j = 0;
+
+    while ((nf < M) && (j < grid_points))
+    {
+        j++;
+        xhigh = xlow;
+        yhigh = ylow;
+        xlow = *(grid + j);
+        ylow = Chebps(xlow, coef, NC, pOverflow);
+
+        if (((Word32)ylow*yhigh) <= 0)
+        {
+            /* divide 4 times the interval */
+            for (i = 4; i != 0; i--)
+            {
+                /* xmid = (xlow + xhigh)/2 */
+                x = xlow >> 1;
+                y = xhigh >> 1;
+                xmid = x + y;
+
+                ymid = Chebps(xmid, coef, NC, pOverflow);
+
+                if (((Word32)ylow*ymid) <= 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 <<= exp;
+                y = div_s((Word16) 16383, y);
+
+                y = ((Word32)x * y) >> (19 - exp);
+
+                if (sign < 0)
+                {
+                    y = -y;
+                }
+
+                /* xint = xlow - ylow*y */
+                xint = xlow - (((Word32) ylow * y) >> 10);
+            }
+
+            *(lsp + nf) = xint;
+            xlow = xint;
+            nf++;
+
+            if (ip == 0)
+            {
+                ip = 1;
+                coef = f2;
+            }
+            else
+            {
+                ip = 0;
+                coef = f1;
+            }
+
+            ylow = Chebps(xlow, coef, NC, pOverflow);
+
+        }
+    }
+
+    /* Check if M roots found */
+
+    if (nf < M)
+    {
+        for (i = NC; i != 0 ; i--)
+        {
+            *lsp++ = *old_lsp++;
+            *lsp++ = *old_lsp++;
+        }
+    }
+
+}
+
+Word16 Chebps_Wrapper(Word16 x,
+                      Word16 f[], /* (n) */
+                      Word16 n,
+                      Flag *pOverflow)
+{
+    return Chebps(x, f, n, pOverflow);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/bitno_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/bitno_tab.cpp
new file mode 100644
index 0000000..fed684d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/bitno_tab.cpp
@@ -0,0 +1,309 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/src/bitno_tab.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Define "const Word16 *bitno[N_MODES]" as "const Word16 *const
+                      bitno[N_MODES]"
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+      File             : bitno.tab
+      Purpose          : Tables for bit2prm and prm2bit
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"   /* parameter sizes: MAX_PRM_SIZE */
+#include "mode.h"   /* N_MODES */
+#include "bitno_tab.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    /* number of parameters per modes (values must be <= MAX_PRM_SIZE!) */
+    extern const Word16 prmno[N_MODES] =
+    {
+        PRMNO_MR475,
+        PRMNO_MR515,
+        PRMNO_MR59,
+        PRMNO_MR67,
+        PRMNO_MR74,
+        PRMNO_MR795,
+        PRMNO_MR102,
+        PRMNO_MR122,
+        PRMNO_MRDTX
+    };
+
+    /* number of parameters to first subframe per modes */
+    extern const Word16 prmnofsf[N_MODES - 1] =
+    {
+        PRMNOFSF_MR475,
+        PRMNOFSF_MR515,
+        PRMNOFSF_MR59,
+        PRMNOFSF_MR67,
+        PRMNOFSF_MR74,
+        PRMNOFSF_MR795,
+        PRMNOFSF_MR102,
+        PRMNOFSF_MR122
+    };
+
+    /* parameter sizes (# of bits), one table per mode */
+    extern const Word16 bitno_MR475[PRMNO_MR475] =
+    {
+        8, 8, 7,                                 /* LSP VQ          */
+        8, 7, 2, 8,                              /* first subframe  */
+        4, 7, 2,                                 /* second subframe */
+        4, 7, 2, 8,                              /* third subframe  */
+        4, 7, 2,                                 /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR515[PRMNO_MR515] =
+    {
+        8, 8, 7,                                 /* LSP VQ          */
+        8, 7, 2, 6,                              /* first subframe  */
+        4, 7, 2, 6,                              /* second subframe */
+        4, 7, 2, 6,                              /* third subframe  */
+        4, 7, 2, 6,                              /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR59[PRMNO_MR59] =
+    {
+        8, 9, 9,                                 /* LSP VQ          */
+        8, 9, 2, 6,                              /* first subframe  */
+        4, 9, 2, 6,                              /* second subframe */
+        8, 9, 2, 6,                              /* third subframe  */
+        4, 9, 2, 6,                              /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR67[PRMNO_MR67] =
+    {
+        8, 9, 9,                                 /* LSP VQ          */
+        8, 11, 3, 7,                             /* first subframe  */
+        4, 11, 3, 7,                             /* second subframe */
+        8, 11, 3, 7,                             /* third subframe  */
+        4, 11, 3, 7,                             /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR74[PRMNO_MR74] =
+    {
+        8, 9, 9,                                 /* LSP VQ          */
+        8, 13, 4, 7,                             /* first subframe  */
+        5, 13, 4, 7,                             /* second subframe */
+        8, 13, 4, 7,                             /* third subframe  */
+        5, 13, 4, 7,                             /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR795[PRMNO_MR795] =
+    {
+        9, 9, 9,                                 /* LSP VQ          */
+        8, 13, 4, 4, 5,                          /* first subframe  */
+        6, 13, 4, 4, 5,                          /* second subframe */
+        8, 13, 4, 4, 5,                          /* third subframe  */
+        6, 13, 4, 4, 5,                          /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR102[PRMNO_MR102] =
+    {
+        8, 9, 9,                                 /* LSP VQ          */
+        8, 1, 1, 1, 1, 10, 10, 7, 7,             /* first subframe  */
+        5, 1, 1, 1, 1, 10, 10, 7, 7,             /* second subframe */
+        8, 1, 1, 1, 1, 10, 10, 7, 7,             /* third subframe  */
+        5, 1, 1, 1, 1, 10, 10, 7, 7,             /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MR122[PRMNO_MR122] =
+    {
+        7, 8, 9, 8, 6,                           /* LSP VQ          */
+        9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* first subframe  */
+        6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* second subframe */
+        9, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5,   /* third subframe  */
+        6, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 5    /* fourth subframe */
+    };
+
+    extern const Word16 bitno_MRDTX[PRMNO_MRDTX] =
+    {
+        3,
+        8, 9, 9,
+        6
+    };
+
+    /* overall table with all parameter sizes for all modes */
+    extern const Word16 * const bitno[N_MODES] =
+    {
+        bitno_MR475,
+        bitno_MR515,
+        bitno_MR59,
+        bitno_MR67,
+        bitno_MR74,
+        bitno_MR795,
+        bitno_MR102,
+        bitno_MR122,
+        bitno_MRDTX
+    };
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/bitreorder_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/bitreorder_tab.cpp
new file mode 100644
index 0000000..69b20fb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/bitreorder_tab.cpp
@@ -0,0 +1,421 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/src/bitreorder.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed file name to bitreorder_tab.c and .h. Also, updated the
+              module description.
+
+ Description: Define "const Word16 *reorderBits[NUM_MODES-1]" as
+              "const Word16 *const reorderBits[NUM_MODES-1]".
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition. Removed corresponding header file from Include
+              section.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function contains tables needed to reformat the encoded speech bits
+ into IF2, WMF, and ETS.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ AMR Speech Codec Frame Structure,
+ 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+#define NUM_MODES           16
+#define NUMBIT_MR475        95
+#define NUMBIT_MR515       103
+#define NUMBIT_MR59        118
+#define NUMBIT_MR67        134
+#define NUMBIT_MR74        148
+#define NUMBIT_MR795       159
+#define NUMBIT_MR102       204
+#define NUMBIT_MR122       244
+#define NUMBIT_AMR_SID      39
+#define NUMBIT_GSMEFR_SID   43
+#define NUMBIT_TDMAEFR_SID  38
+#define NUMBIT_PDCEFR_SID   37
+#define NUMBIT_UNUSED1       0
+#define NUMBIT_UNUSED2       0
+#define NUMBIT_UNUSED3       0
+#define NUMBIT_NO_DATA       0
+
+#define MAX_NUM_BITS       244
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    /* number of parameters per modes (values must be <= MAX_PRM_SIZE!) */
+    extern const Word16 numOfBits[NUM_MODES] =
+    {
+        NUMBIT_MR475,
+        NUMBIT_MR515,
+        NUMBIT_MR59,
+        NUMBIT_MR67,
+        NUMBIT_MR74,
+        NUMBIT_MR795,
+        NUMBIT_MR102,
+        NUMBIT_MR122,
+        NUMBIT_AMR_SID,
+        NUMBIT_GSMEFR_SID,
+        NUMBIT_TDMAEFR_SID,
+        NUMBIT_PDCEFR_SID,
+        NUMBIT_UNUSED1,
+        NUMBIT_UNUSED2,
+        NUMBIT_UNUSED3,
+        NUMBIT_NO_DATA
+    };
+
+    extern const Word16 reorderBits_MR475[NUMBIT_MR475] =
+    {
+        0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
+        10, 11, 12, 13, 14, 15, 23, 24, 25, 26,
+        27, 28, 48, 49, 61, 62, 82, 83, 47, 46,
+        45, 44, 81, 80, 79, 78, 17, 18, 20, 22,
+        77, 76, 75, 74, 29, 30, 43, 42, 41, 40,
+        38, 39, 16, 19, 21, 50, 51, 59, 60, 63,
+        64, 72, 73, 84, 85, 93, 94, 32, 33, 35,
+        36, 53, 54, 56, 57, 66, 67, 69, 70, 87,
+        88, 90, 91, 34, 55, 68, 89, 37, 58, 71,
+        92, 31, 52, 65, 86
+    };
+
+    extern const Word16 reorderBits_MR515[NUMBIT_MR515] =
+    {
+        7,  6,  5,  4,  3,  2,  1,  0, 15, 14,
+        13, 12, 11, 10,  9,  8, 23, 24, 25, 26,
+        27, 46, 65, 84, 45, 44, 43, 64, 63, 62,
+        83, 82, 81, 102, 101, 100, 42, 61, 80, 99,
+        28, 47, 66, 85, 18, 41, 60, 79, 98, 29,
+        48, 67, 17, 20, 22, 40, 59, 78, 97, 21,
+        30, 49, 68, 86, 19, 16, 87, 39, 38, 58,
+        57, 77, 35, 54, 73, 92, 76, 96, 95, 36,
+        55, 74, 93, 32, 51, 33, 52, 70, 71, 89,
+        90, 31, 50, 69, 88, 37, 56, 75, 94, 34,
+        53, 72, 91
+    };
+
+    extern const Word16 reorderBits_MR59[NUMBIT_MR59] =
+    {
+        0,  1,  4,  5,  3,  6,  7,  2, 13, 15,
+        8,  9, 11, 12, 14, 10, 16, 28, 74, 29,
+        75, 27, 73, 26, 72, 30, 76, 51, 97, 50,
+        71, 96, 117, 31, 77, 52, 98, 49, 70, 95,
+        116, 53, 99, 32, 78, 33, 79, 48, 69, 94,
+        115, 47, 68, 93, 114, 46, 67, 92, 113, 19,
+        21, 23, 22, 18, 17, 20, 24, 111, 43, 89,
+        110, 64, 65, 44, 90, 25, 45, 66, 91, 112,
+        54, 100, 40, 61, 86, 107, 39, 60, 85, 106,
+        36, 57, 82, 103, 35, 56, 81, 102, 34, 55,
+        80, 101, 42, 63, 88, 109, 41, 62, 87, 108,
+        38, 59, 84, 105, 37, 58, 83, 104
+    };
+
+    extern const Word16 reorderBits_MR67[NUMBIT_MR67] =
+    {
+        0,  1,  4,  3,  5,  6, 13,  7,  2,  8,
+        9, 11, 15, 12, 14, 10, 28, 82, 29, 83,
+        27, 81, 26, 80, 30, 84, 16, 55, 109, 56,
+        110, 31, 85, 57, 111, 48, 73, 102, 127, 32,
+        86, 51, 76, 105, 130, 52, 77, 106, 131, 58,
+        112, 33, 87, 19, 23, 53, 78, 107, 132, 21,
+        22, 18, 17, 20, 24, 25, 50, 75, 104, 129,
+        47, 72, 101, 126, 54, 79, 108, 133, 46, 71,
+        100, 125, 128, 103, 74, 49, 45, 70, 99, 124,
+        42, 67, 96, 121, 39, 64, 93, 118, 38, 63,
+        92, 117, 35, 60, 89, 114, 34, 59, 88, 113,
+        44, 69, 98, 123, 43, 68, 97, 122, 41, 66,
+        95, 120, 40, 65, 94, 119, 37, 62, 91, 116,
+        36, 61, 90, 115
+    };
+
+    extern const Word16 reorderBits_MR74[NUMBIT_MR74] =
+    {
+        0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
+        10, 11, 12, 13, 14, 15, 16, 26, 87, 27,
+        88, 28, 89, 29, 90, 30, 91, 51, 80, 112,
+        141, 52, 81, 113, 142, 54, 83, 115, 144, 55,
+        84, 116, 145, 58, 119, 59, 120, 21, 22, 23,
+        17, 18, 19, 31, 60, 92, 121, 56, 85, 117,
+        146, 20, 24, 25, 50, 79, 111, 140, 57, 86,
+        118, 147, 49, 78, 110, 139, 48, 77, 53, 82,
+        114, 143, 109, 138, 47, 76, 108, 137, 32, 33,
+        61, 62, 93, 94, 122, 123, 41, 42, 43, 44,
+        45, 46, 70, 71, 72, 73, 74, 75, 102, 103,
+        104, 105, 106, 107, 131, 132, 133, 134, 135, 136,
+        34, 63, 95, 124, 35, 64, 96, 125, 36, 65,
+        97, 126, 37, 66, 98, 127, 38, 67, 99, 128,
+        39, 68, 100, 129, 40, 69, 101, 130
+    };
+
+    extern const Word16 reorderBits_MR795[NUMBIT_MR795] =
+    {
+        8,  7,  6,  5,  4,  3,  2, 14, 16,  9,
+        10, 12, 13, 15, 11, 17, 20, 22, 24, 23,
+        19, 18, 21, 56, 88, 122, 154, 57, 89, 123,
+        155, 58, 90, 124, 156, 52, 84, 118, 150, 53,
+        85, 119, 151, 27, 93, 28, 94, 29, 95, 30,
+        96, 31, 97, 61, 127, 62, 128, 63, 129, 59,
+        91, 125, 157, 32, 98, 64, 130,  1,  0, 25,
+        26, 33, 99, 34, 100, 65, 131, 66, 132, 54,
+        86, 120, 152, 60, 92, 126, 158, 55, 87, 121,
+        153, 117, 116, 115, 46, 78, 112, 144, 43, 75,
+        109, 141, 40, 72, 106, 138, 36, 68, 102, 134,
+        114, 149, 148, 147, 146, 83, 82, 81, 80, 51,
+        50, 49, 48, 47, 45, 44, 42, 39, 35, 79,
+        77, 76, 74, 71, 67, 113, 111, 110, 108, 105,
+        101, 145, 143, 142, 140, 137, 133, 41, 73, 107,
+        139, 37, 69, 103, 135, 38, 70, 104, 136
+    };
+
+    extern const Word16 reorderBits_MR102[NUMBIT_MR102] =
+    {
+        7,  6,  5,  4,  3,  2,  1,  0, 16, 15,
+        14, 13, 12, 11, 10,  9,  8, 26, 27, 28,
+        29, 30, 31, 115, 116, 117, 118, 119, 120, 72,
+        73, 161, 162, 65, 68, 69, 108, 111, 112, 154,
+        157, 158, 197, 200, 201, 32, 33, 121, 122, 74,
+        75, 163, 164, 66, 109, 155, 198, 19, 23, 21,
+        22, 18, 17, 20, 24, 25, 37, 36, 35, 34,
+        80, 79, 78, 77, 126, 125, 124, 123, 169, 168,
+        167, 166, 70, 67, 71, 113, 110, 114, 159, 156,
+        160, 202, 199, 203, 76, 165, 81, 82, 92, 91,
+        93, 83, 95, 85, 84, 94, 101, 102, 96, 104,
+        86, 103, 87, 97, 127, 128, 138, 137, 139, 129,
+        141, 131, 130, 140, 147, 148, 142, 150, 132, 149,
+        133, 143, 170, 171, 181, 180, 182, 172, 184, 174,
+        173, 183, 190, 191, 185, 193, 175, 192, 176, 186,
+        38, 39, 49, 48, 50, 40, 52, 42, 41, 51,
+        58, 59, 53, 61, 43, 60, 44, 54, 194, 179,
+        189, 196, 177, 195, 178, 187, 188, 151, 136, 146,
+        153, 134, 152, 135, 144, 145, 105, 90, 100, 107,
+        88, 106, 89, 98, 99, 62, 47, 57, 64, 45,
+        63, 46, 55, 56
+    };
+
+    extern const Word16 reorderBits_MR122[NUMBIT_MR122] =
+    {
+        0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
+        10, 11, 12, 13, 14, 23, 15, 16, 17, 18,
+        19, 20, 21, 22, 24, 25, 26, 27, 28, 38,
+        141, 39, 142, 40, 143, 41, 144, 42, 145, 43,
+        146, 44, 147, 45, 148, 46, 149, 47, 97, 150,
+        200, 48, 98, 151, 201, 49, 99, 152, 202, 86,
+        136, 189, 239, 87, 137, 190, 240, 88, 138, 191,
+        241, 91, 194, 92, 195, 93, 196, 94, 197, 95,
+        198, 29, 30, 31, 32, 33, 34, 35, 50, 100,
+        153, 203, 89, 139, 192, 242, 51, 101, 154, 204,
+        55, 105, 158, 208, 90, 140, 193, 243, 59, 109,
+        162, 212, 63, 113, 166, 216, 67, 117, 170, 220,
+        36, 37, 54, 53, 52, 58, 57, 56, 62, 61,
+        60, 66, 65, 64, 70, 69, 68, 104, 103, 102,
+        108, 107, 106, 112, 111, 110, 116, 115, 114, 120,
+        119, 118, 157, 156, 155, 161, 160, 159, 165, 164,
+        163, 169, 168, 167, 173, 172, 171, 207, 206, 205,
+        211, 210, 209, 215, 214, 213, 219, 218, 217, 223,
+        222, 221, 73, 72, 71, 76, 75, 74, 79, 78,
+        77, 82, 81, 80, 85, 84, 83, 123, 122, 121,
+        126, 125, 124, 129, 128, 127, 132, 131, 130, 135,
+        134, 133, 176, 175, 174, 179, 178, 177, 182, 181,
+        180, 185, 184, 183, 188, 187, 186, 226, 225, 224,
+        229, 228, 227, 232, 231, 230, 235, 234, 233, 238,
+        237, 236, 96, 199
+    };
+
+    /* overall table with all parameter sizes for all modes */
+    extern const Word16 * const reorderBits[NUM_MODES-1] =
+    {
+        reorderBits_MR475,
+        reorderBits_MR515,
+        reorderBits_MR59,
+        reorderBits_MR67,
+        reorderBits_MR74,
+        reorderBits_MR795,
+        reorderBits_MR102,
+        reorderBits_MR122
+    };
+
+    /* Number of Frames (16-bit segments sent for each mode */
+    extern const Word16 numCompressedBytes[16] =
+    {
+        13, /*4.75*/
+        14, /*5.15*/
+        16, /*5.90*/
+        18, /*6.70*/
+        19, /*7.40*/
+        21, /*7.95*/
+        26, /*10.2*/
+        31, /*12.2*/
+        6, /*GsmAmr comfort noise*/
+        6, /*Gsm-Efr comfort noise*/
+        6, /*IS-641 comfort noise*/
+        6, /*Pdc-Efr comfort noise*/
+        0, /*future use*/
+        0, /*future use*/
+        0, /*future use*/
+        1  /*No transmission*/
+    };
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/bits2prm.cpp b/media/libstagefright/codecs/amrnb/common/src/bits2prm.cpp
new file mode 100644
index 0000000..1d6f7b1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/bits2prm.cpp
@@ -0,0 +1,292 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/bits2prm.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Fixed a typo in the include section. Optimized some lines of
+              code as per review comments.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "bits2prm.h"
+#include "typedef.h"
+#include "mode.h"
+#include "bitno_tab.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Bin2int
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    no_of_bits = number of bits associated with value
+    bitstream = pointer to buffer where bits are read
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Function    : Bin2int
+  Purpose     : Read "no_of_bits" bits from the array bitstream[]
+                and convert to integer.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ bits2prm.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word16 Bin2int ( // Reconstructed parameter
+    Word16 no_of_bits,  // input : number of bits associated with value
+    Word16 *bitstream   // output: address where bits are written
+)
+{
+    Word16 value, i, bit;
+
+    value = 0;
+    for (i = 0; i < no_of_bits; i++)
+    {
+        value = shl (value, 1);
+        bit = *bitstream++;
+        if (sub (bit, BIT_1) == 0)
+            value = add (value, 1);
+    }
+    return (value);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+static Word16 Bin2int(  /* Reconstructed parameter                      */
+    Word16 no_of_bits,  /* input : number of bits associated with value */
+    Word16 *bitstream   /* input: address where bits are read from      */
+)
+{
+    Word16 value;
+    Word16 i;
+    Word16 single_bit;
+
+    value = 0;
+    for (i = 0; i < no_of_bits; i++)
+    {
+        value <<= 1;
+        single_bit = *(bitstream++);
+        value |= single_bit;
+    }
+    return (value);
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: bits2prm
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    mode = AMR mode of type enum Mode
+    bits[] = pointer to serial bits of type Word16
+    prm[] = pointer to analysis parameters of type Word16
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Function    : Bits2prm
+  Purpose     : Retrieves the vector of encoder parameters from
+                the received serial bits in a frame.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ bits2prm.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Bits2prm (
+    enum Mode mode,     // i : AMR mode
+    Word16 bits[],      // i : serial bits       (size <= MAX_SERIAL_SIZE)
+    Word16 prm[]        // o : analysis parameters  (size <= MAX_PRM_SIZE)
+)
+{
+    Word16 i;
+
+    for (i = 0; i < prmno[mode]; i++)
+    {
+        prm[i] = Bin2int (bitno[mode][i], bits);
+        bits += bitno[mode][i];
+        add(0,0);       // account for above pointer update
+    }
+
+   return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+OSCL_EXPORT_REF void Bits2prm(
+    enum Mode mode,     /* i : AMR mode                                    */
+    Word16 bits[],      /* i : serial bits       (size <= MAX_SERIAL_SIZE) */
+    Word16 prm[]        /* o : analysis parameters  (size <= MAX_PRM_SIZE) */
+)
+{
+    Word16 i;
+
+    for (i = 0; i < prmno[mode]; i++)
+    {
+        prm[i] = Bin2int(bitno[mode][i], bits);
+        bits += bitno[mode][i];
+    }
+
+    return;
+}
+
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/bytesused.cpp b/media/libstagefright/codecs/amrnb/common/src/bytesused.cpp
new file mode 100644
index 0000000..9552206
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/bytesused.cpp
@@ -0,0 +1,208 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/BytesUsed.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Corrected entries for all SID frames and updated function
+              description. Updated copyright year.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition. Removed corresponding header file from Include
+              section.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function creates a table called BytesUsed that holds the value that
+ describes the number of bytes required to hold one frame worth of data in
+ the WMF (non-IF2) frame format. Each table entry is the sum of the frame
+ type byte and the number of bytes used up by the core speech data for each
+ 3GPP frame type.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] "AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0
+     Release 4, June 2001, page 13.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    extern const short BytesUsed[16] =
+    {
+        13, /* 4.75 */
+        14, /* 5.15 */
+        16, /* 5.90 */
+        18, /* 6.70 */
+        20, /* 7.40 */
+        21, /* 7.95 */
+        27, /* 10.2 */
+        32, /* 12.2 */
+        6, /* GsmAmr comfort noise */
+        7, /* Gsm-Efr comfort noise */
+        6, /* IS-641 comfort noise */
+        6, /* Pdc-Efr comfort noise */
+        0, /* future use */
+        0, /* future use */
+        0, /* future use */
+        1 /* No transmission */
+    };
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/c2_9pf_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/c2_9pf_tab.cpp
new file mode 100644
index 0000000..471bee8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/c2_9pf_tab.cpp
@@ -0,0 +1,165 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/c2_9pf_tab.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1)    Corrected the module description
+ (2)    Corrected the filename in the template.
+ (3)    Removed embedded tabs.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for startPos[] used by the functions
+ c2_9pf.c and d2_9pf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 startPos[2*4*2] = {0, 2, 0, 3,
+        0, 2, 0, 3,
+        1, 3, 2, 4,
+        1, 4, 1, 4
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] c2_9pf.c UMTS GSM AMR speech codec, R99 -  Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
diff --git a/media/libstagefright/codecs/amrnb/common/src/copy.cpp b/media/libstagefright/codecs/amrnb/common/src/copy.cpp
new file mode 100644
index 0000000..75890b2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/copy.cpp
@@ -0,0 +1,87 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*      File             : copy.h
+*
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "copy.h"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include <string.h>
+
+#include "typedef.h"
+#include "basic_op.h"
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+/*************************************************************************
+ *
+ *   FUNCTION:   Copy
+ *
+ *   PURPOSE:   Copy vector x[] to y[]
+ *
+ *
+ *************************************************************************/
+/*
+**************************************************************************
+*
+*  Function    : Copy
+*  Purpose     : Copy vector x[] to y[]
+*
+**************************************************************************
+*/
+void Copy(
+    const Word16 x[],   /* i : input vector (L)  */
+    Word16 y[],         /* o : output vector (L) */
+    Word16 L            /* i : vector length     */
+)
+{
+    memmove(y, x, L*sizeof(*x));
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/div_32.cpp b/media/libstagefright/codecs/amrnb/common/src/div_32.cpp
new file mode 100644
index 0000000..143e37c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/div_32.cpp
@@ -0,0 +1,209 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/div_32.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag. Removed inclusion of unwanted header files. Changed
+              the name of input and output variables for clarity.
+
+ Description:
+              1. Eliminated unused include files.
+              2. Replaced l_extract functionality, code size and speed
+                 do not justify calling this function
+              3. Eliminated sub() function call, replace by (-), this knowing
+                 that the result will not saturate.
+
+ Description:  Added casting to eliminate warnings
+
+ Who:                           Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: div_32
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_num = 32 bit signed integer (Word32) whose value falls in the
+                range : 0x0000 0000 < L_num < L_denom
+    L_denom_hi = 16 bit positive normalized integer whose value falls in
+               the range : 0x4000 < hi < 0x7fff
+    L_denom_lo = 16 bit positive integer whose value falls in the range :
+               0 < lo < 0x7fff
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the 32 bit divide operation resulted in overflow
+
+ Returns:
+    result = 32-bit quotient of of the division of two 32 bit integers
+                L_num / L_denom (Word32)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function is a fractional integer division of two 32 bit numbers, the
+ numerator L_num and the denominator L_denom. The denominator is formed by
+ combining denom_hi and denom_lo. Note that denom_hi is a normalized numbers.
+ The numerator and denominator must be positive and the numerator must be
+ less than the denominator.
+
+ The division is done as follows:
+ 1. Find 1/L_denom by first approximating: approx = 1 / denom_hi.
+ 2. 1/L_denom = approx * (2.0 - L_denom * approx ).
+ 3. result = L_num * (1/L_denom).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] div_32() function in oper_32b.c,  UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word32 Div_32(Word32 L_num,
+              Word16 L_denom_hi,
+              Word16 L_denom_lo,
+              Flag   *pOverflow)
+{
+
+    Word16 approx;
+    Word16 hi;
+    Word16 lo;
+    Word16 n_hi;
+    Word16 n_lo;
+    Word32 result;
+
+    /* First approximation: 1 / L_denom = 1/L_denom_hi */
+
+    approx = div_s((Word16) 0x3fff, L_denom_hi);
+
+    /* 1/L_denom = approx * (2.0 - L_denom * approx) */
+
+    result = Mpy_32_16(L_denom_hi, L_denom_lo, approx, pOverflow);
+    /* result is > 0 , and less than 1.0 */
+    result =  0x7fffffffL - result;
+
+    hi = (Word16)(result >> 16);
+    lo = (result >> 1) - (hi << 15);
+
+    result = Mpy_32_16(hi, lo, approx, pOverflow);
+
+    /* L_num * (1/L_denom) */
+
+    hi = (Word16)(result >> 16);
+    lo = (result >> 1) - (hi << 15);
+
+    n_hi = (Word16)(L_num >> 16);
+    n_lo = (L_num >> 1) - (n_hi << 15);
+
+    result = Mpy_32(n_hi, n_lo, hi, lo, pOverflow);
+    result = L_shl(result, 2, pOverflow);
+
+    return (result);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/div_s.cpp b/media/libstagefright/codecs/amrnb/common/src/div_s.cpp
new file mode 100644
index 0000000..f3bed7e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/div_s.cpp
@@ -0,0 +1,277 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/div_s.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the div_s function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Making changes based on review meeting.
+
+ Description: Made changes based on P3 review meeting.
+
+ Description: Changing abort() to exit(0).
+
+ Description: Made the following changes
+              1. Unrolled the division loop to make three comparison per
+                 pass, using only five iterations of the loop and saving
+                 shifts cycles
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    var1 = 16 bit signed integer (Word16) whose value falls in
+           the range : 0x0000 <= var1 <= 0x7fff.
+    var2 = 16 bit signed integer (Word16) whose value falls in
+           the range : 0x0000 <= var1 <= 0x7fff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var_out = quotient of var1 divided by var2 (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function 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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 div_s (Word16 var1, Word16 var2)
+{
+    Word16 var_out = 0;
+    Word16 iteration;
+    Word32 L_num;
+    Word32 L_denom;
+    Word16 abort_flag = 0;
+
+    if ((var1 > var2) || (var1 < 0))
+    {
+        printf ("Division Error var1=%d  var2=%d\n", var1, var2);
+        abort_flag = 1;
+        exit(0);
+    }
+    if ((var1 != 0) && (abort_flag == 0))
+    {
+        if (var1 == var2)
+        {
+            var_out = MAX_16;
+        }
+        else
+        {
+            L_num = (Word32) var1;
+            L_denom = (Word32) var2;
+
+            for (iteration = 15; iteration > 0; iteration--)
+            {
+                var_out <<= 1;
+                L_num <<= 1;
+
+                if (L_num >= L_denom)
+                {
+                    L_num -= L_denom;
+                    var_out += 1;
+                }
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].div_s++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 div_s(register Word16 var1, register Word16 var2)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Word16 var_out = 0;
+    register Word16 iteration;
+    Word32 L_num;
+    Word32 L_denom;
+    Word32 L_denom_by_2;
+    Word32 L_denom_by_4;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    if ((var1 > var2) || (var1 < 0))
+    {
+        return 0; // used to exit(0);
+    }
+    if (var1)
+    {
+        if (var1 != var2)
+        {
+
+            L_num = (Word32) var1;
+            L_denom = (Word32) var2;
+            L_denom_by_2 = (L_denom << 1);
+            L_denom_by_4 = (L_denom << 2);
+            for (iteration = 5; iteration > 0; iteration--)
+            {
+                var_out <<= 3;
+                L_num   <<= 3;
+
+                if (L_num >= L_denom_by_4)
+                {
+                    L_num -= L_denom_by_4;
+                    var_out |= 4;
+                }
+
+                if (L_num >= L_denom_by_2)
+                {
+                    L_num -= L_denom_by_2;
+                    var_out |=  2;
+                }
+
+                if (L_num >= (L_denom))
+                {
+                    L_num -= (L_denom);
+                    var_out |=  1;
+                }
+
+            }
+        }
+        else
+        {
+            var_out = MAX_16;
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].div_s++;
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return (var_out);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/extract_h.cpp b/media/libstagefright/codecs/amrnb/common/src/extract_h.cpp
new file mode 100644
index 0000000..e538f9f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/extract_h.cpp
@@ -0,0 +1,177 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/src/extract_h.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the extract_h function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit long signed integer (Word32 ) whose value falls
+             in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    L_var1 = Most significant word of input (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function returns the 16 MSB of the input, L_var1.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 extract_h (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) (L_var1 >> 16);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 extract_h(Word32 L_var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return ((Word16)(L_var1 >> 16));
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/extract_l.cpp b/media/libstagefright/codecs/amrnb/common/src/extract_l.cpp
new file mode 100644
index 0000000..dbb9a6e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/extract_l.cpp
@@ -0,0 +1,176 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/extract_l.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the extract_l function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit long signed integer (Word32 ) whose value falls
+             in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    L_var1 = Most significant word of input (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function returns the 16 LSB of the input, L_var1.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 extract_l (Word32 L_var1)
+{
+    Word16 var_out;
+
+    var_out = (Word16) L_var1;
+#if (WMOPS)
+    multiCounter[currCounter].extract_l++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 extract_l(Word32 L_var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return ((Word16) L_var1);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/gains_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/gains_tbl.cpp
new file mode 100644
index 0000000..a08dd2d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/gains_tbl.cpp
@@ -0,0 +1,217 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/gains_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, gains.tab
+
+ Description: Added include of "typedef.h" to includes section.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                               Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+#define NB_QUA_PITCH 16
+#define NB_QUA_CODE 32
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+
+    extern const Word16 qua_gain_pitch[NB_QUA_PITCH] =
+    {
+        0, 3277, 6556, 8192, 9830, 11469, 12288, 13107,
+        13926, 14746, 15565, 16384, 17203, 18022, 18842, 19661
+    };
+
+
+    extern const Word16 qua_gain_code[(NB_QUA_CODE+1)*3] =
+    {
+        /* gain factor (g_fac) and quantized energy error (qua_ener_MR122, qua_ener)
+         * are stored:
+         *
+         * qua_ener_MR122 = log2(g_fac)      (not the rounded floating point value, but
+         *                                    the value the original EFR algorithm
+         *                                    calculates from g_fac [using Log2])
+         * qua_ener       = 20*log10(g_fac); (rounded floating point value)
+         *
+         *
+         * g_fac (Q11), qua_ener_MR122 (Q10), qua_ener (Q10)
+         */
+        159,                -3776,          -22731,
+        206,                -3394,          -20428,
+        268,                -3005,          -18088,
+        349,                -2615,          -15739,
+        419,                -2345,          -14113,
+        482,                -2138,          -12867,
+        554,                -1932,          -11629,
+        637,                -1726,          -10387,
+        733,                -1518,           -9139,
+        842,                -1314,           -7906,
+        969,                -1106,           -6656,
+        1114,                 -900,           -5416,
+        1281,                 -694,           -4173,
+        1473,                 -487,           -2931,
+        1694,                 -281,           -1688,
+        1948,                  -75,            -445,
+        2241,                  133,             801,
+        2577,                  339,            2044,
+        2963,                  545,            3285,
+        3408,                  752,            4530,
+        3919,                  958,            5772,
+        4507,                 1165,            7016,
+        5183,                 1371,            8259,
+        5960,                 1577,            9501,
+        6855,                 1784,           10745,
+        7883,                 1991,           11988,
+        9065,                 2197,           13231,
+        10425,                 2404,           14474,
+        12510,                 2673,           16096,
+        16263,                 3060,           18429,
+        21142,                 3448,           20763,
+        27485,                 3836,           23097,
+        27485,                 3836,           23097
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] gains.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp b/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp
new file mode 100644
index 0000000..3650f3c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/gc_pred.cpp
@@ -0,0 +1,1046 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/gc_pred.c
+ Functions:
+            gc_pred_reset
+            gc_pred
+            gc_pred_update
+            gc_pred_average_limited
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the functions that perform codebook gain MA prediction.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "gc_pred.h"
+#include "basicop_malloc.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "log2.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NPRED 4  /* number of prediction taps */
+
+/* average innovation energy.                               */
+/* MEAN_ENER  = 36.0/constant, constant = 20*Log10(2)       */
+#define MEAN_ENER_MR122  783741L  /* 36/(20*log10(2)) (Q17) */
+
+/* minimum quantized energy: -14 dB */
+#define MIN_ENERGY       -14336       /* 14                 Q10 */
+#define MIN_ENERGY_MR122  -2381       /* 14 / (20*log10(2)) Q10 */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* MA prediction coefficients (Q13) */
+static const Word16 pred[NPRED] = {5571, 4751, 2785, 1556};
+
+/* MA prediction coefficients (Q6)  */
+static const Word16 pred_MR122[NPRED] = {44, 37, 22, 12};
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: gc_pred_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type gc_predState
+
+ Outputs:
+    past_qua_en field in the structure pointed to by state is initialized
+      to MIN_ENERGY
+    past_qua_en_MR122 field in the structure pointed to by state is
+      initialized to MIN_ENERGY_MR122
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function initializes the state memory used by gc_pred to zero.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ gc_pred.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int gc_pred_reset (gc_predState *state)
+{
+   Word16 i;
+
+   if (state == (gc_predState *) NULL){
+      fprintf(stderr, "gc_pred_reset: invalid parameter\n");
+      return -1;
+   }
+
+   for(i = 0; i < NPRED; i++)
+   {
+      state->past_qua_en[i] = MIN_ENERGY;
+      state->past_qua_en_MR122[i] = MIN_ENERGY_MR122;
+   }
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 gc_pred_reset(gc_predState *state)
+{
+    Word16 i;
+
+    if (state == (gc_predState *) NULL)
+    {
+        /* fprintf(stderr, "gc_pred_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    for (i = 0; i < NPRED; i++)
+    {
+        state->past_qua_en[i] = MIN_ENERGY;
+        state->past_qua_en_MR122[i] = MIN_ENERGY_MR122;
+    }
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: gc_pred
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type gc_predState
+    mode = AMR mode (enum Mode)
+    code = pointer to the innovative codebook vector; Q12 in MR122 mode,
+           otherwise, Q13 (Word16)
+    exp_gcode0 = pointer to the exponent part of predicted gain factor
+             (Q0) (Word16)
+    frac_gcode0 = pointer to the fractional part of predicted gain factor
+              (Q15) (Word16)
+    exp_en = pointer to the exponent part of the innovation energy; this
+         is calculated for MR795 mode, Q0 (Word16)
+    frac_en = pointer to the fractional part of the innovation energy;
+          this is calculated for MR795 mode, Q15 (Word16)
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    store pointed to by exp_gcode0 contains the exponent part of the
+      recently calculated predicted gain factor
+    store pointed to by frac_gcode0 contains the fractional part of the
+      recently calculated predicted gain factor
+    store pointed to by exp_en contains the exponent part of the
+      recently calculated innovation energy
+    store pointed to by frac_en contains the fractional part of the
+      recently calculated innovation energy
+    pOverflow = 1 if the math functions called by gc_pred
+                results in overflow else zero.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    pred = table of MA prediction coefficients (Q13) (Word16)
+    pred_MR122 = table of MA prediction coefficients (Q6) (Word16)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the MA prediction of the innovation energy (in
+ dB/(20*log10(2))), with the mean removed.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ gc_pred.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+The original etsi reference code uses a global flag Overflow. However, in the
+actual implementation a pointer to a the overflow flag is passed in.
+
+void
+gc_pred(
+    gc_predState *st,   // i/o: State struct
+    enum Mode mode,     // i  : AMR mode
+    Word16 *code,       // i  : innovative codebook vector (L_SUBFR)
+                        //      MR122: Q12, other modes: Q13
+    Word16 *exp_gcode0, // o  : exponent of predicted gain factor, Q0
+    Word16 *frac_gcode0,// o  : fraction of predicted gain factor  Q15
+    Word16 *exp_en,     // o  : exponent of innovation energy,     Q0
+                        //      (only calculated for MR795)
+    Word16 *frac_en     // o  : fraction of innovation energy,     Q15
+                        //      (only calculated for MR795)
+)
+{
+    Word16 i;
+    Word32 ener_code;
+    Word16 exp, frac;
+
+     *-------------------------------------------------------------------*
+     *  energy of code:                                                  *
+     *  ~~~~~~~~~~~~~~~                                                  *
+     *  ener_code = sum(code[i]^2)                                       *
+     *-------------------------------------------------------------------*
+    ener_code = L_mac((Word32) 0, code[0], code[0]);
+                                                 // MR122:  Q12*Q12 -> Q25
+                                                 // others: Q13*Q13 -> Q27
+    for (i = 1; i < L_SUBFR; i++)
+        ener_code = L_mac(ener_code, code[i], code[i]);
+
+    if (sub (mode, MR122) == 0)
+    {
+        Word32 ener;
+
+        // ener_code = ener_code / lcode; lcode = 40; 1/40 = 26214 Q20
+        ener_code = L_mult (pv_round (ener_code), 26214);   // Q9  * Q20 -> Q30
+
+         *-------------------------------------------------------------------*
+         *  energy of code:                                                  *
+         *  ~~~~~~~~~~~~~~~                                                  *
+         *  ener_code(Q17) = 10 * Log10(energy) / constant                   *
+         *                 = 1/2 * Log2(energy)                              *
+         *                                           constant = 20*Log10(2)  *
+         *-------------------------------------------------------------------*
+        // ener_code = 1/2 * Log2(ener_code); Note: Log2=log2+30
+        Log2(ener_code, &exp, &frac);
+        ener_code = L_Comp (sub (exp, 30), frac);     // Q16 for log()
+                                                    // ->Q17 for 1/2 log()
+
+         *-------------------------------------------------------------------*
+         *  predicted energy:                                                *
+         *  ~~~~~~~~~~~~~~~~~                                                *
+         *  ener(Q24) = (Emean + sum{pred[i]*past_en[i]})/constant           *
+         *            = MEAN_ENER + sum(pred[i]*past_qua_en[i])              *
+         *                                           constant = 20*Log10(2)  *
+         *-------------------------------------------------------------------*
+
+        ener = MEAN_ENER_MR122;                      // Q24 (Q17)
+        for (i = 0; i < NPRED; i++)
+        {
+            ener = L_mac (ener, st->past_qua_en_MR122[i], pred_MR122[i]);
+                                                     // Q10 * Q13 -> Q24
+                                                     // Q10 * Q6  -> Q17
+        }
+
+         *-------------------------------------------------------------------*
+         *  predicted codebook gain                                          *
+         *  ~~~~~~~~~~~~~~~~~~~~~~~                                          *
+         *  gc0     = Pow10( (ener*constant - ener_code*constant) / 20 )     *
+         *          = Pow2(ener-ener_code)                                   *
+         *          = Pow2(int(d)+frac(d))                                   *
+         *                                                                   *
+         *  (store exp and frac for pow2())                                  *
+         *-------------------------------------------------------------------*
+
+        ener = L_shr (L_sub (ener, ener_code), 1);                // Q16
+        L_Extract(ener, exp_gcode0, frac_gcode0);
+    }
+    else // all modes except 12.2
+    {
+        Word32 L_tmp;
+        Word16 exp_code, gcode0;
+
+         *-----------------------------------------------------------------*
+         *  Compute: means_ener - 10log10(ener_code/ L_sufr)               *
+         *-----------------------------------------------------------------*
+
+        exp_code = norm_l (ener_code);
+        ener_code = L_shl (ener_code, exp_code);
+
+        // Log2 = log2 + 27
+        Log2_norm (ener_code, exp_code, &exp, &frac);
+
+        // fact = 10/log2(10) = 3.01 = 24660 Q13
+        L_tmp = Mpy_32_16(exp, frac, -24660); // Q0.Q15 * Q13 -> Q14
+
+         *   L_tmp = means_ener - 10log10(ener_code/L_SUBFR)
+         *         = means_ener - 10log10(ener_code) + 10log10(L_SUBFR)
+         *         = K - fact * Log2(ener_code)
+         *         = K - fact * log2(ener_code) - fact*27
+         *
+         *   ==> K = means_ener + fact*27 + 10log10(L_SUBFR)
+         *
+         *   means_ener =       33    =  540672    Q14  (MR475, MR515, MR59)
+         *   means_ener =       28.75 =  471040    Q14  (MR67)
+         *   means_ener =       30    =  491520    Q14  (MR74)
+         *   means_ener =       36    =  589824    Q14  (MR795)
+         *   means_ener =       33    =  540672    Q14  (MR102)
+         *   10log10(L_SUBFR) = 16.02 =  262481.51 Q14
+         *   fact * 27                = 1331640    Q14
+         *   -----------------------------------------
+         *   (MR475, MR515, MR59)   K = 2134793.51 Q14 ~= 16678 * 64 * 2
+         *   (MR67)                 K = 2065161.51 Q14 ~= 32268 * 32 * 2
+         *   (MR74)                 K = 2085641.51 Q14 ~= 32588 * 32 * 2
+         *   (MR795)                K = 2183945.51 Q14 ~= 17062 * 64 * 2
+         *   (MR102)                K = 2134793.51 Q14 ~= 16678 * 64 * 2
+
+
+        if (sub (mode, MR102) == 0)
+        {
+            // mean = 33 dB
+            L_tmp = L_mac(L_tmp, 16678, 64);     // Q14
+        }
+        else if (sub (mode, MR795) == 0)
+        {
+            // ener_code  = <xn xn> * 2^27*2^exp_code
+            // frac_en    = ener_code / 2^16
+            //            = <xn xn> * 2^11*2^exp_code
+            // <xn xn>    = <xn xn>*2^11*2^exp * 2^exp_en
+            //           := frac_en            * 2^exp_en
+
+            // ==> exp_en = -11-exp_code;
+
+            *frac_en = extract_h (ener_code);
+            *exp_en = sub (-11, exp_code);
+
+            // mean = 36 dB
+            L_tmp = L_mac(L_tmp, 17062, 64);     // Q14
+        }
+        else if (sub (mode, MR74) == 0)
+        {
+            // mean = 30 dB
+            L_tmp = L_mac(L_tmp, 32588, 32);     // Q14
+        }
+        else if (sub (mode, MR67) == 0)
+        {
+            // mean = 28.75 dB
+            L_tmp = L_mac(L_tmp, 32268, 32);     // Q14
+        }
+        else // MR59, MR515, MR475
+        {
+            // mean = 33 dB
+            L_tmp = L_mac(L_tmp, 16678, 64);     // Q14
+        }
+
+         *-----------------------------------------------------------------*
+         * Compute gcode0.                                                 *
+         *  = Sum(i=0,3) pred[i]*past_qua_en[i] - ener_code + mean_ener    *
+         *-----------------------------------------------------------------*
+
+        L_tmp = L_shl(L_tmp, 10);                // Q24
+        for (i = 0; i < 4; i++)
+            L_tmp = L_mac(L_tmp, pred[i], st->past_qua_en[i]);
+                                                 // Q13 * Q10 -> Q24
+
+        gcode0 = extract_h(L_tmp);               // Q8
+
+         *-----------------------------------------------------------------*
+         * gcode0 = pow(10.0, gcode0/20)                                   *
+         *        = pow(2, 3.3219*gcode0/20)                               *
+         *        = pow(2, 0.166*gcode0)                                   *
+         *-----------------------------------------------------------------*
+
+        // 5439 Q15 = 0.165985
+        // (correct: 1/(20*log10(2)) 0.166096 = 5443 Q15)
+        if (sub (mode, MR74) == 0) // For IS641 bitexactness
+            L_tmp = L_mult(gcode0, 5439);  // Q8 * Q15 -> Q24
+        else
+            L_tmp = L_mult(gcode0, 5443);  // Q8 * Q15 -> Q24
+
+        L_tmp = L_shr(L_tmp, 8);                   //          -> Q16
+        L_Extract(L_tmp, exp_gcode0, frac_gcode0); //       -> Q0.Q15
+    }
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void gc_pred(
+    gc_predState *st,   /* i/o: State struct                           */
+    enum Mode mode,     /* i  : AMR mode                               */
+    Word16 *code,       /* i  : innovative codebook vector (L_SUBFR)   */
+    /*      MR122: Q12, other modes: Q13           */
+    Word16 *exp_gcode0, /* o  : exponent of predicted gain factor, Q0  */
+    Word16 *frac_gcode0,/* o  : fraction of predicted gain factor  Q15 */
+    Word16 *exp_en,     /* o  : exponent of innovation energy,     Q0  */
+    /*      (only calculated for MR795)            */
+    Word16 *frac_en,    /* o  : fraction of innovation energy,     Q15 */
+    /*      (only calculated for MR795)            */
+    Flag   *pOverflow
+)
+{
+    register Word16 i;
+    register Word32 L_temp1, L_temp2;
+    register Word32 L_tmp;
+    Word32 ener_code;
+    Word32 ener;
+    Word16 exp, frac;
+    Word16 exp_code, gcode0;
+    Word16 tmp;
+    Word16 *p_code = &code[0];
+
+    /*-------------------------------------------------------------------*
+     *  energy of code:                                                  *
+     *  ~~~~~~~~~~~~~~~                                                  *
+     *  ener_code = sum(code[i]^2)                                       *
+     *-------------------------------------------------------------------*/
+    ener_code = 0;
+
+    /* MR122:  Q12*Q12 -> Q25 */
+    /* others: Q13*Q13 -> Q27 */
+
+    for (i = L_SUBFR >> 2; i != 0; i--)
+    {
+        tmp = *(p_code++);
+        ener_code += ((Word32) tmp * tmp) >> 3;
+        tmp = *(p_code++);
+        ener_code += ((Word32) tmp * tmp) >> 3;
+        tmp = *(p_code++);
+        ener_code += ((Word32) tmp * tmp) >> 3;
+        tmp = *(p_code++);
+        ener_code += ((Word32) tmp * tmp) >> 3;
+    }
+
+    ener_code <<= 4;
+
+    if (ener_code < 0)      /*  Check for saturation */
+    {
+        ener_code = MAX_32;
+    }
+
+    if (mode == MR122)
+    {
+        /* ener_code = ener_code / lcode; lcode = 40; 1/40 = 26214 Q20 */
+        /* Q9  * Q20 -> Q30 */
+
+        ener_code = ((Word32)(pv_round(ener_code, pOverflow) * 26214)) << 1;
+
+        /*-------------------------------------------------------------*
+         *  energy of code:                                            *
+         *  ~~~~~~~~~~~~~~~                                            *
+         *  ener_code(Q17) = 10 * Log10(energy) / constant             *
+         *                 = 1/2 * Log2(energy)                        *
+         *  constant = 20*Log10(2)                                     *
+         *-------------------------------------------------------------*/
+        /* ener_code = 1/2 * Log2(ener_code); Note: Log2=log2+30 */
+        Log2(ener_code, &exp, &frac, pOverflow);
+
+        /* Q16 for log()    */
+        /* ->Q17 for 1/2 log()*/
+
+        L_temp1 = (Word32)(exp - 30) << 16;
+        ener_code = L_temp1 + ((Word32)frac << 1);
+
+        /*-------------------------------------------------------------*
+         *  predicted energy:                                          *
+         *  ~~~~~~~~~~~~~~~~~                                          *
+         *  ener(Q24) = (Emean + sum{pred[i]*past_en[i]})/constant     *
+         *            = MEAN_ENER + sum(pred[i]*past_qua_en[i])        *
+         *  constant = 20*Log10(2)                                     *
+         *-------------------------------------------------------------*/
+
+        ener = MEAN_ENER_MR122;                   /* Q24 (Q17) */
+        for (i = 0; i < NPRED; i++)
+        {
+            L_temp1 = (((Word32) st->past_qua_en_MR122[i]) *
+                       pred_MR122[i]) << 1;
+            ener = L_add(ener, L_temp1, pOverflow);
+
+            /* Q10 * Q13 -> Q24 */
+            /* Q10 * Q6  -> Q17 */
+        }
+
+        /*---------------------------------------------------------------*
+         *  predicted codebook gain                                      *
+         *  ~~~~~~~~~~~~~~~~~~~~~~~                                      *
+         *  gc0     = Pow10( (ener*constant - ener_code*constant) / 20 ) *
+         *          = Pow2(ener-ener_code)                               *
+         *          = Pow2(int(d)+frac(d))                               *
+         *                                                               *
+         *  (store exp and frac for pow2())                              *
+         *---------------------------------------------------------------*/
+        /* Q16 */
+
+        L_temp1 = L_sub(ener, ener_code, pOverflow);
+
+
+        *exp_gcode0 = (Word16)(L_temp1 >> 17);
+
+        L_temp2 = (Word32) * exp_gcode0 << 15;
+        L_temp1 >>= 2;
+
+        *frac_gcode0 = (Word16)(L_temp1 - L_temp2);
+
+    }
+    else /* all modes except 12.2 */
+    {
+        /*-----------------------------------------------------------------*
+         *  Compute: means_ener - 10log10(ener_code/ L_sufr)               *
+         *-----------------------------------------------------------------*/
+
+        exp_code = norm_l(ener_code);
+        ener_code = L_shl(ener_code, exp_code, pOverflow);
+
+        /* Log2 = log2 + 27 */
+        Log2_norm(ener_code, exp_code, &exp, &frac);
+
+        /* fact = 10/log2(10) = 3.01 = 24660 Q13 */
+        /* Q0.Q15 * Q13 -> Q14 */
+
+        L_temp2 = (((Word32) exp) * -24660) << 1;
+        L_tmp = (((Word32) frac) * -24660) >> 15;
+
+        /* Sign-extend resulting product */
+        if (L_tmp & (Word32) 0x00010000L)
+        {
+            L_tmp = L_tmp | (Word32) 0xffff0000L;
+        }
+
+        L_tmp = L_tmp << 1;
+        L_tmp = L_add(L_tmp, L_temp2, pOverflow);
+
+
+        /*   L_tmp = means_ener - 10log10(ener_code/L_SUBFR)
+         *         = means_ener - 10log10(ener_code) + 10log10(L_SUBFR)
+         *         = K - fact * Log2(ener_code)
+         *         = K - fact * log2(ener_code) - fact*27
+         *
+         *   ==> K = means_ener + fact*27 + 10log10(L_SUBFR)
+         *
+         *   means_ener =       33    =  540672    Q14  (MR475, MR515, MR59)
+         *   means_ener =       28.75 =  471040    Q14  (MR67)
+         *   means_ener =       30    =  491520    Q14  (MR74)
+         *   means_ener =       36    =  589824    Q14  (MR795)
+         *   means_ener =       33    =  540672    Q14  (MR102)
+         *   10log10(L_SUBFR) = 16.02 =  262481.51 Q14
+         *   fact * 27                = 1331640    Q14
+         *   -----------------------------------------
+         *   (MR475, MR515, MR59)   K = 2134793.51 Q14 ~= 16678 * 64 * 2
+         *   (MR67)                 K = 2065161.51 Q14 ~= 32268 * 32 * 2
+         *   (MR74)                 K = 2085641.51 Q14 ~= 32588 * 32 * 2
+         *   (MR795)                K = 2183945.51 Q14 ~= 17062 * 64 * 2
+         *   (MR102)                K = 2134793.51 Q14 ~= 16678 * 64 * 2
+         */
+
+        if (mode == MR102)
+        {
+            /* mean = 33 dB */
+            L_temp2 = (Word32) 16678 << 7;
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);     /* Q14 */
+        }
+        else if (mode == MR795)
+        {
+            /* ener_code  = <xn xn> * 2^27*2^exp_code
+               frac_en    = ener_code / 2^16
+                          = <xn xn> * 2^11*2^exp_code
+               <xn xn>    = <xn xn>*2^11*2^exp * 2^exp_en
+            :                 = frac_en            * 2^exp_en
+                          ==> exp_en = -11-exp_code;      */
+            *frac_en = (Word16)(ener_code >> 16);
+            *exp_en = sub(-11, exp_code, pOverflow);
+
+            /* mean = 36 dB */
+            L_temp2 = (Word32) 17062 << 7;
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);     /* Q14 */
+        }
+        else if (mode == MR74)
+        {
+            /* mean = 30 dB */
+            L_temp2 = (Word32) 32588 << 6;
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);     /* Q14 */
+        }
+        else if (mode == MR67)
+        {
+            /* mean = 28.75 dB */
+            L_temp2 = (Word32) 32268 << 6;
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);     /* Q14 */
+        }
+        else /* MR59, MR515, MR475 */
+        {
+            /* mean = 33 dB */
+            L_temp2 = (Word32) 16678 << 7;
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);     /* Q14 */
+        }
+
+        /*-------------------------------------------------------------*
+         * Compute gcode0.                                              *
+         *  = Sum(i=0,3) pred[i]*past_qua_en[i] - ener_code + mean_ener *
+         *--------------------------------------------------------------*/
+        /* Q24 */
+        if (L_tmp > (Word32) 0X001fffffL)
+        {
+            *pOverflow = 1;
+            L_tmp = MAX_32;
+        }
+        else if (L_tmp < (Word32) 0xffe00000L)
+        {
+            *pOverflow = 1;
+            L_tmp = MIN_32;
+        }
+        else
+        {
+            L_tmp = L_tmp << 10;
+        }
+
+        for (i = 0; i < 4; i++)
+        {
+            L_temp2 = ((((Word32) pred[i]) * st->past_qua_en[i]) << 1);
+            L_tmp = L_add(L_tmp, L_temp2, pOverflow);  /* Q13 * Q10 -> Q24 */
+        }
+
+        gcode0 = (Word16)(L_tmp >> 16);               /* Q8  */
+
+        /*-----------------------------------------------------------*
+         * gcode0 = pow(10.0, gcode0/20)                             *
+         *        = pow(2, 3.3219*gcode0/20)                         *
+         *        = pow(2, 0.166*gcode0)                             *
+         *-----------------------------------------------------------*/
+
+        /* 5439 Q15 = 0.165985                                       */
+        /* (correct: 1/(20*log10(2)) 0.166096 = 5443 Q15)            */
+
+        if (mode == MR74) /* For IS641 bitexactness */
+        {
+            L_tmp = (((Word32) gcode0) * 5439) << 1;  /* Q8 * Q15 -> Q24 */
+        }
+        else
+        {
+            L_tmp = (((Word32) gcode0) * 5443) << 1;  /* Q8 * Q15 -> Q24 */
+        }
+
+        if (L_tmp < 0)
+        {
+            L_tmp = ~((~L_tmp) >> 8);
+        }
+        else
+        {
+            L_tmp = L_tmp >> 8;     /* -> Q16 */
+        }
+
+        *exp_gcode0 = (Word16)(L_tmp >> 16);
+        if (L_tmp < 0)
+        {
+            L_temp1 = ~((~L_tmp) >> 1);
+        }
+        else
+        {
+            L_temp1 = L_tmp >> 1;
+        }
+        L_temp2 = (Word32) * exp_gcode0 << 15;
+        *frac_gcode0 = (Word16)(L_sub(L_temp1, L_temp2, pOverflow));
+        /* -> Q0.Q15 */
+    }
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: gc_pred_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type gc_predState
+    qua_ener_MR122 = quantized energy for update (Q10); calculated as
+             (log2(qua_err)) (Word16)
+    qua_ener = quantized energy for update (Q10); calculated as
+           (20*log10(qua_err)) (Word16)
+
+ Outputs:
+    structure pointed to by st contains the calculated quantized energy
+      for update
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function updates the MA predictor with the last quantized energy.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ gc_pred.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void gc_pred_update(
+    gc_predState *st,      // i/o: State struct
+    Word16 qua_ener_MR122, // i  : quantized energy for update, Q10
+                           //      (log2(qua_err))
+    Word16 qua_ener        // i  : quantized energy for update, Q10
+                           //      (20*log10(qua_err))
+)
+{
+    Word16 i;
+
+    for (i = 3; i > 0; i--)
+    {
+        st->past_qua_en[i] = st->past_qua_en[i - 1];
+        st->past_qua_en_MR122[i] = st->past_qua_en_MR122[i - 1];
+    }
+
+    st->past_qua_en_MR122[0] = qua_ener_MR122;  //    log2 (qua_err), Q10
+
+    st->past_qua_en[0] = qua_ener;              // 20*log10(qua_err), Q10
+
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void gc_pred_update(
+    gc_predState *st,      /* i/o: State struct                     */
+    Word16 qua_ener_MR122, /* i  : quantized energy for update, Q10 */
+    /*      (log2(qua_err))                  */
+    Word16 qua_ener        /* i  : quantized energy for update, Q10 */
+    /*      (20*log10(qua_err))              */
+)
+{
+    st->past_qua_en[3] = st->past_qua_en[2];
+    st->past_qua_en_MR122[3] = st->past_qua_en_MR122[2];
+
+    st->past_qua_en[2] = st->past_qua_en[1];
+    st->past_qua_en_MR122[2] = st->past_qua_en_MR122[1];
+
+    st->past_qua_en[1] = st->past_qua_en[0];
+    st->past_qua_en_MR122[1] = st->past_qua_en_MR122[0];
+
+    st->past_qua_en_MR122[0] = qua_ener_MR122; /*    log2 (qua_err), Q10 */
+
+    st->past_qua_en[0] = qua_ener;            /* 20*log10(qua_err), Q10 */
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: gc_pred_average_limited
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type gc_predState
+    ener_avg_MR122 = pointer to the averaged quantized energy (Q10);
+             calculated as (log2(qua_err)) (Word16)
+    ener_avg = pointer to the averaged quantized energy (Q10); calculated
+           as (20*log10(qua_err)) (Word16)
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    store pointed to by ener_avg_MR122 contains the new averaged quantized
+      energy
+    store pointed to by ener_avg contains the new averaged quantized
+      energy
+    pOverflow = 1 if the math functions called by gc_pred_average_limited
+            results in overflow else zero.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calculates the average of MA predictor state values (with a
+ lower limit) used in error concealment.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ gc_pred.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+The original etsi reference code uses a global flag Overflow. However, in the
+actual implementation a pointer to a the overflow flag is passed in.
+
+void gc_pred_average_limited(
+    gc_predState *st,       // i: State struct
+    Word16 *ener_avg_MR122, // o: everaged quantized energy,  Q10
+                            //    (log2(qua_err))
+    Word16 *ener_avg        // o: averaged quantized energy,  Q10
+                            //    (20*log10(qua_err))
+)
+{
+    Word16 av_pred_en;
+    Word16 i;
+
+    // do average in MR122 mode (log2() domain)
+    av_pred_en = 0;
+    for (i = 0; i < NPRED; i++)
+    {
+        av_pred_en = add (av_pred_en, st->past_qua_en_MR122[i]);
+    }
+
+    // av_pred_en = 0.25*av_pred_en
+    av_pred_en = mult (av_pred_en, 8192);
+
+    // if (av_pred_en < -14/(20Log10(2))) av_pred_en = ..
+
+    if (sub (av_pred_en, MIN_ENERGY_MR122) < 0)
+    {
+        av_pred_en = MIN_ENERGY_MR122;
+    }
+    *ener_avg_MR122 = av_pred_en;
+
+    // do average for other modes (20*log10() domain)
+    av_pred_en = 0;
+    for (i = 0; i < NPRED; i++)
+    {
+        av_pred_en = add (av_pred_en, st->past_qua_en[i]);
+    }
+
+    // av_pred_en = 0.25*av_pred_en
+    av_pred_en = mult (av_pred_en, 8192);
+
+    // if (av_pred_en < -14) av_pred_en = ..
+
+    if (sub (av_pred_en, MIN_ENERGY) < 0)
+    {
+        av_pred_en = MIN_ENERGY;
+    }
+    *ener_avg = av_pred_en;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void gc_pred_average_limited(
+    gc_predState *st,       /* i: State struct                    */
+    Word16 *ener_avg_MR122, /* o: everaged quantized energy,  Q10 */
+    /*    (log2(qua_err))                 */
+    Word16 *ener_avg,       /* o: averaged quantized energy,  Q10 */
+    /*    (20*log10(qua_err))             */
+    Flag *pOverflow
+)
+{
+    Word16 av_pred_en;
+    register Word16 i;
+
+    /* do average in MR122 mode (log2() domain) */
+    av_pred_en = 0;
+    for (i = 0; i < NPRED; i++)
+    {
+        av_pred_en =
+            add(av_pred_en, st->past_qua_en_MR122[i], pOverflow);
+    }
+
+    /* av_pred_en = 0.25*av_pred_en  (with sign-extension)*/
+    if (av_pred_en < 0)
+    {
+        av_pred_en = (av_pred_en >> 2) | 0xc000;
+    }
+    else
+    {
+        av_pred_en >>= 2;
+    }
+
+    /* if (av_pred_en < -14/(20Log10(2))) av_pred_en = .. */
+    if (av_pred_en < MIN_ENERGY_MR122)
+    {
+        av_pred_en = MIN_ENERGY_MR122;
+    }
+    *ener_avg_MR122 = av_pred_en;
+
+    /* do average for other modes (20*log10() domain) */
+    av_pred_en = 0;
+    for (i = 0; i < NPRED; i++)
+    {
+        av_pred_en = add(av_pred_en, st->past_qua_en[i], pOverflow);
+    }
+
+    /* av_pred_en = 0.25*av_pred_en  (with sign-extension)*/
+    if (av_pred_en < 0)
+    {
+        av_pred_en = (av_pred_en >> 2) | 0xc000;
+    }
+    else
+    {
+        av_pred_en >>= 2;
+    }
+
+    /* if (av_pred_en < -14) av_pred_en = .. */
+    if (av_pred_en < MIN_ENERGY)
+    {
+        av_pred_en = MIN_ENERGY;
+    }
+    *ener_avg = av_pred_en;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp b/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp
new file mode 100644
index 0000000..be76241
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/gmed_n.cpp
@@ -0,0 +1,218 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/gmed_n.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Put file into template and first pass at optimization.
+
+ Description: Made changes based on comments from the review meeting. Used
+    pointers instead of index addressing in the arrays.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unncessary include files.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "gmed_n.h"
+#include    "typedef.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NMAX    9   /* largest N used in median calculation */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: gmed_n
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    ind = input values (Word16)
+    n = number of inputs to find the median (Word16)
+
+ Returns:
+    median value.
+
+ Outputs:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calculates N-point median of a data set. This routine is only
+ valid for a odd number of gains (n <= NMAX).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ gmed_n.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 gmed_n (   // o : The median value (0...N-1)
+    Word16 ind[], // i : Past gain values
+    Word16 n      // i : The number of gains; this routine
+                  //     is only valid for a odd number of gains
+                  //     (n <= NMAX)
+)
+{
+    Word16 i, j, ix = 0;
+    Word16 max;
+    Word16 medianIndex;
+    Word16 tmp[NMAX];
+    Word16 tmp2[NMAX];
+
+    for (i = 0; i < n; i++)
+    {
+        tmp2[i] = ind[i];
+    }
+
+    for (i = 0; i < n; i++)
+    {
+        max = -32767;
+        for (j = 0; j < n; j++)
+        {
+            if (sub (tmp2[j], max) >= 0)
+            {
+                max = tmp2[j];
+                ix = j;
+            }
+        }
+        tmp2[ix] = -32768;
+        tmp[i] = ix;
+    }
+
+    medianIndex=tmp[ shr(n,1) ];  // account for complex addressing
+    return (ind[medianIndex]);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 gmed_n(            /* o : the median value    */
+    Word16 ind[],   /* i : input values        */
+    Word16 n        /* i : number of inputs    */
+)
+{
+    register Word16 i, j, ix = 0;
+    register Word16 max;
+    register Word16 medianIndex;
+    Word16  tmp[NMAX];
+    Word16  tmp2[NMAX];
+
+    for (i = 0; i < n; i++)
+    {
+        *(tmp2 + i) = *(ind + i);
+    }
+
+    for (i = 0; i < n; i++)
+    {
+        max = -32767;
+        for (j = 0; j < n; j++)
+        {
+            if (*(tmp2 + j) >= max)
+            {
+                max = *(tmp2 + j);
+                ix = j;
+            }
+        }
+        *(tmp2 + ix) = -32768;
+        *(tmp + i) = ix;
+    }
+
+    medianIndex = *(tmp + (n >> 1));  /* account for complex addressing */
+
+    return (*(ind + medianIndex));
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/gray_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/gray_tbl.cpp
new file mode 100644
index 0000000..99073d9
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/gray_tbl.cpp
@@ -0,0 +1,160 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/gray_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for the gray encoding and decoding tables,
+ gray_tbl[] and dgray_tbl[] used by the c1035pf and d1035pf module
+ respectively.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 gray[8]  = {0, 1, 3, 2, 6, 4, 5, 7};
+    extern const Word16 dgray[8] = {0, 1, 3, 2, 5, 6, 4, 7};
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] gray.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/grid_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/grid_tbl.cpp
new file mode 100644
index 0000000..cd81566
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/grid_tbl.cpp
@@ -0,0 +1,180 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/grid_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for grid_tbl[] used by the az_lsp()
+ function.
+
+ //  Table for az_lsp()
+ //
+ // 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));
+ //
+ //
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+#define grid_points 60
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 grid[grid_points + 1] =
+    {
+        32760, 32723, 32588, 32364, 32051, 31651,
+        31164, 30591, 29935, 29196, 28377, 27481,
+        26509, 25465, 24351, 23170, 21926, 20621,
+        19260, 17846, 16384, 14876, 13327, 11743,
+        10125, 8480, 6812, 5126, 3425, 1714,
+        0, -1714, -3425, -5126, -6812, -8480,
+        -10125, -11743, -13327, -14876, -16384, -17846,
+        -19260, -20621, -21926, -23170, -24351, -25465,
+        -26509, -27481, -28377, -29196, -29935, -30591,
+        -31164, -31651, -32051, -32364, -32588, -32723,
+        -32760
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] grid.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/int_lpc.cpp b/media/libstagefright/codecs/amrnb/common/src/int_lpc.cpp
new file mode 100644
index 0000000..806474d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/int_lpc.cpp
@@ -0,0 +1,633 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/int_lpc.c
+ Functions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template.
+ Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description: Per review comments, replaced includes of "basic_op.h"
+ and "count.h" with "shr.h", "sub.h", and "add.h"
+
+ Description:  For Int_lpc_1and3()  and Int_lpc_1and3_2()
+              1. Replaced array addressing by pointers
+              2. Eliminated math operations that unnecessary checked for
+                 saturation
+              3. Unrolled loops to speed up processing
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "int_lpc.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "lsp_az.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Int_lpc_1and3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp_old -- array of type Word16 -- LSP vector at the
+                                       4th subfr. of past frame (M)
+    lsp_mid -- array of type Word16 -- LSP vector at the 2nd subfr. of
+                                       present frame (M)
+    lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
+                                       present frame (M)
+
+ Outputs:
+    Az -- array of type Word16 -- interpolated LP parameters in all subfr.
+                                  (AZ_SIZE)
+    pOverflow -- pointer to type Flag -- Overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose     : Interpolates the LSPs and converts to LPC parameters
+               to get a different LP filter in each subframe.
+ Description : The 20 ms speech frame is divided into 4 subframes.
+               The LSPs are quantized and transmitted at the 2nd and
+               4th subframes (twice per frame) and interpolated at the
+               1st and 3rd subframe.
+
+                     |------|------|------|------|
+                        sf1    sf2    sf3    sf4
+                  F0            Fm            F1
+
+                sf1:   1/2 Fm + 1/2 F0         sf3:   1/2 F1 + 1/2 Fm
+                sf2:       Fm                  sf4:       F1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Int_lpc_1and3(
+    Word16 lsp_old[],  /* i : LSP vector at the 4th subfr. of past frame (M) */
+    Word16 lsp_mid[],  /* i : LSP vector at the 2nd subfr. of
+                              present frame (M)                              */
+    Word16 lsp_new[],  /* i : LSP vector at the 4th subfr. of
+                              present frame (M)                              */
+    Word16 Az[],       /* o : interpolated LP parameters in all subfr.
+                              (AZ_SIZE)                                      */
+    Flag  *pOverflow
+)
+{
+    Word16 i;
+    Word16 lsp[M];
+    Word16 *p_lsp_old = &lsp_old[0];
+    Word16 *p_lsp_mid = &lsp_mid[0];
+    Word16 *p_lsp_new = &lsp_new[0];
+    Word16 *p_lsp     = &lsp[0];
+
+    /*  lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
+
+    for (i = M >> 1; i != 0; i--)
+    {
+        *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
+        *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);       /* Subframe 1 */
+
+    Az += MP1;
+
+    Lsp_Az(
+        lsp_mid,
+        Az,
+        pOverflow);       /* Subframe 2 */
+
+    Az += MP1;
+
+    p_lsp_mid = &lsp_mid[0];
+    p_lsp     = &lsp[0];
+
+    for (i = M >> 1; i != 0; i--)
+    {
+        *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
+        *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);           /* Subframe 3 */
+
+    Az += MP1;
+
+    Lsp_Az(
+        lsp_new,
+        Az,
+        pOverflow);       /* Subframe 4 */
+
+    return;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Int_lpc_1and3_2
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp_old -- array of type Word16 -- LSP vector at the
+                                       4th subfr. of past frame (M)
+    lsp_mid -- array of type Word16 -- LSP vector at the 2nd subfr. of
+                                       present frame (M)
+    lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
+                                       present frame (M)
+
+ Outputs:
+    Az -- array of type Word16 -- interpolated LP parameters in.
+                                  subfr 1 and 2.
+    pOverflow -- pointer to type Flag -- Overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose : Interpolation of the LPC parameters. Same as the Int_lpc
+           function but we do not recompute Az() for subframe 2 and
+           4 because it is already available.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Int_lpc_1and3_2(
+    Word16 lsp_old[],  /* i : LSP vector at the 4th subfr. of past frame (M) */
+    Word16 lsp_mid[],  /* i : LSP vector at the 2nd subframe of
+                             present frame (M)                               */
+    Word16 lsp_new[],  /* i : LSP vector at the 4th subframe of
+                             present frame (M)                               */
+    Word16 Az[],       /* o :interpolated LP parameters
+                             in subframes 1 and 3 (AZ_SIZE)                  */
+    Flag  *pOverflow
+)
+{
+    Word16 i;
+    Word16 lsp[M];
+    Word16 *p_lsp_old = &lsp_old[0];
+    Word16 *p_lsp_mid = &lsp_mid[0];
+    Word16 *p_lsp_new = &lsp_new[0];
+    Word16 *p_lsp     = &lsp[0];
+
+    /*  lsp[i] = lsp_mid[i] * 0.5 + lsp_old[i] * 0.5 */
+
+    for (i = M >> 1; i != 0; i--)
+    {
+        *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
+        *(p_lsp++) = (*(p_lsp_old++) >> 1) + (*(p_lsp_mid++) >> 1);
+    }
+    Lsp_Az(lsp, Az, pOverflow);            /* Subframe 1 */
+    Az += MP1 * 2;
+
+    p_lsp_mid = &lsp_mid[0];
+    p_lsp     = &lsp[0];
+
+    for (i = M >> 1; i != 0; i--)
+    {
+        *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
+        *(p_lsp++) = (*(p_lsp_mid++) >> 1) + (*(p_lsp_new++) >> 1);
+    }
+
+    Lsp_Az(lsp, Az, pOverflow);            /* Subframe 3 */
+
+    return;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp_old -- array of type Word16 -- LSP vector at the
+                                       4th subfr. of past frame (M)
+    lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
+                                       present frame (M)
+
+ Outputs:
+    Az -- array of type Word16 -- interpolated LP parameters in.
+                                  all subframes.
+    pOverflow -- pointer to type Flag -- Overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE:  Interpolates the LSPs and convert to LP parameters to get
+           a different LP filter in each subframe.
+
+ DESCRIPTION:
+    The 20 ms speech frame is divided into 4 subframes.
+    The LSPs are quantized and transmitted at the 4th subframe
+    (once per frame) and interpolated at the 1st, 2nd and 3rd subframe.
+
+         |------|------|------|------|
+            sf1    sf2    sf3    sf4
+      F0                          F1
+
+    sf1:   3/4 F0 + 1/4 F1         sf3:   1/4 F0 + 3/4 F1
+    sf2:   1/2 F0 + 1/2 F1         sf4:       F1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Int_lpc_1to3(
+    Word16 lsp_old[], /* input : LSP vector at the 4th SF of past frame    */
+    Word16 lsp_new[], /* input : LSP vector at the 4th SF of present frame */
+    Word16 Az[],      /* output: interpolated LP parameters in all SFs     */
+    Flag   *pOverflow
+)
+{
+    Word16 i;
+    Word16 temp;
+    Word16 temp2;
+
+    Word16 lsp[M];
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_old[i], 2, pOverflow);
+        temp = sub(lsp_old[i], temp, pOverflow);
+        temp2 = shr(lsp_new[i], 2, pOverflow);
+
+        lsp[i] = add(temp2, temp, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);        /* Subframe 1 */
+
+    Az += MP1;
+
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_new[i], 1, pOverflow);
+        temp2 = shr(lsp_old[i], 1, pOverflow);
+        lsp[i] = add(temp, temp2, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);        /* Subframe 2 */
+
+    Az += MP1;
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_new[i], 2, pOverflow);
+        temp = sub(lsp_new[i], temp, pOverflow);
+        temp2 = shr(lsp_old[i], 2, pOverflow);
+
+        lsp[i] = add(temp2, temp, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);       /* Subframe 3 */
+
+    Az += MP1;
+
+    Lsp_Az(
+        lsp_new,
+        Az,
+        pOverflow);        /* Subframe 4 */
+
+    return;
+}
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Int_lpc_1to3_2
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp_old -- array of type Word16 -- LSP vector at the
+                                       4th subfr. of past frame (M)
+    lsp_new -- array of type Word16 -- LSP vector at the 4th subfr. of
+                                       present frame (M)
+
+ Outputs:
+    Az -- array of type Word16 -- interpolated LP parameters in.
+                                  subfr 1, 2, and 3.
+    pOverflow -- pointer to type Flag -- Overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Interpolation of the LPC parameters.
+ Same as the previous function but we do not recompute Az() for
+ subframe 4 because it is already available.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ int_lpc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Int_lpc_1to3_2(
+    Word16 lsp_old[],  /* input : LSP vector at the 4th SF of past frame    */
+    Word16 lsp_new[],  /* input : LSP vector at the 4th SF of present frame */
+    Word16 Az[],       /* output: interpolated LP parameters in SFs 1,2,3   */
+    Flag   *pOverflow
+)
+{
+    Word16 i;
+    Word16 temp;
+    Word16 temp2;
+    Word16 lsp[M];
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_old[i], 2, pOverflow);
+
+        temp = sub(lsp_old[i], temp, pOverflow);
+
+        temp2 = shr(lsp_new[i], 2, pOverflow);
+
+        lsp[i] = add(temp2, temp, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);        /* Subframe 1 */
+
+    Az += MP1;
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_new[i], 1, pOverflow);
+        temp2 = shr(lsp_old[i], 1, pOverflow);
+
+        lsp[i] = add(temp2, temp, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);        /* Subframe 2 */
+
+    Az += MP1;
+
+    for (i = 0; i < M; i++)
+    {
+        temp = shr(lsp_new[i], 2, pOverflow);
+        temp = sub(lsp_new[i], temp, pOverflow);
+        temp2 = shr(lsp_old[i], 2, pOverflow);
+
+        lsp[i] = add(temp, temp2, pOverflow);
+    }
+
+    Lsp_Az(
+        lsp,
+        Az,
+        pOverflow);        /* Subframe 3 */
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/inv_sqrt.cpp b/media/libstagefright/codecs/amrnb/common/src/inv_sqrt.cpp
new file mode 100644
index 0000000..83f4d0c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/inv_sqrt.cpp
@@ -0,0 +1,270 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/inv_sqrt.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Put file into template.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header files of the math functions
+              used in the file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Defined one local variable per line.
+              2. Used "&=", ">>=", and "+=" in the code.
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag.
+
+ Description: Removed inclusion of inv_sqrt.tab file. Changed array name
+              from "table" to "inv_sqrt_tbl"
+
+ Description: Removed math operations that were not needed as functions,
+             this because the numbers themselves will not saturate the
+             operators, so there is not need to check for saturation.
+
+ Description: Updated copyrigth year, according to code review comments.
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "inv_sqrt.h"
+#include    "typedef.h"
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Inv_sqrt
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_x = input value (Word32)
+    pOverflow = pointer to overflow flag
+
+ Outputs:
+    pOverflow -> if the Inv_sqrt operation resulted in an overflow.
+
+ Returns:
+    L_y = inverse squareroot of L_x (Word32)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes 1/sqrt(L_x), where L_x is positive.
+ If L_x is negative or zero, the result is 1 (3fff ffff).
+
+ The function 1/sqrt(L_x) is approximated by a table and linear
+ interpolation. The inverse square root is computed using the
+ following steps:
+    1- Normalization of L_x.
+    2- If (30-exponent) is even then shift right once.
+    3- exponent = (30-exponent)/2  +1
+    4- i = bit25-b31 of L_x;  16<=i<=63  because of normalization.
+    5- a = bit10-b24
+    6- i -=16
+    7- L_y = table[i]<<16 - (table[i] - table[i+1]) * a * 2
+    8- L_y >>= exponent
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ inv_sqrt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 Inv_sqrt (       // (o) : output value
+    Word32 L_x          // (i) : input value
+)
+{
+    Word16 exp, i, a, tmp;
+    Word32 L_y;
+
+* The reference ETSI code uses a global Overflow flag. In the actual
+* implementation a pointer to the overflow flag is passed into the function.
+* This pointer is in turn passed into the basic math functions such as add(),
+* L_shl(), L_shr(), sub() called by this module.
+
+    if (L_x <= (Word32) 0)
+        return ((Word32) 0x3fffffffL);
+
+    exp = norm_l (L_x);
+    L_x = L_shl (L_x, exp);     // L_x is normalize
+
+    exp = sub (30, exp);
+
+    if ((exp & 1) == 0)         // If exponent even -> shift right
+    {
+        L_x = L_shr (L_x, 1);
+    }
+    exp = shr (exp, 1);
+    exp = add (exp, 1);
+
+    L_x = L_shr (L_x, 9);
+    i = extract_h (L_x);        // Extract b25-b31
+    L_x = L_shr (L_x, 1);
+    a = extract_l (L_x);        // Extract b10-b24
+    a = a & (Word16) 0x7fff;
+
+    i = sub (i, 16);
+
+    L_y = L_deposit_h (table[i]);       // table[i] << 16
+    tmp = sub (table[i], table[i + 1]); // table[i] - table[i+1])
+    L_y = L_msu (L_y, tmp, a);  // L_y -=  tmp*a*2
+
+    L_y = L_shr (L_y, exp);     // denormalization
+
+    return (L_y);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word32 Inv_sqrt(        /* (o) : output value   */
+    Word32 L_x,         /* (i) : input value    */
+    Flag   * pOverflow  /* (i) : pointer to overflow flag */
+)
+{
+    Word16 exp;
+    Word16 i;
+    Word16 a;
+    Word16 tmp;
+    Word32 L_y;
+    OSCL_UNUSED_ARG(pOverflow);
+
+    if (L_x <= (Word32) 0)
+    {
+        return ((Word32) 0x3fffffffL);
+    }
+
+    exp = norm_l(L_x);
+    L_x <<= exp;         /* L_x is normalize */
+
+    exp = 30 - exp;
+
+    if ((exp & 1) == 0)             /* If exponent even -> shift right */
+    {
+        L_x >>= 1;
+    }
+    exp >>= 1;
+    exp += 1;
+
+    L_x >>= 9;
+    i = (Word16)(L_x >> 16);        /* Extract b25-b31 */
+    a = (Word16)(L_x >> 1);         /* Extract b10-b24 */
+    a &= (Word16) 0x7fff;
+
+    i -= 16;
+
+    L_y = (Word32)inv_sqrt_tbl[i] << 16;    /* inv_sqrt_tbl[i] << 16    */
+
+    /* inv_sqrt_tbl[i] - inv_sqrt_tbl[i+1])  */
+    tmp =  inv_sqrt_tbl[i] - inv_sqrt_tbl[i + 1];
+    /* always a positive number less than 200 */
+
+    L_y -= ((Word32)tmp * a) << 1;        /* L_y -=  tmp*a*2         */
+    /* always a positive minus a small negative number */
+
+    L_y >>= exp;                /* denormalization, exp always 0< exp < 31 */
+
+    return (L_y);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/inv_sqrt_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/inv_sqrt_tbl.cpp
new file mode 100644
index 0000000..bde2c4e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/inv_sqrt_tbl.cpp
@@ -0,0 +1,167 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/inv_sqrt_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed table name to inv_sqrt_tbl
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for table[] used by the inv_sqrt function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 inv_sqrt_tbl[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
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] inv_sqrt.tab file,  UMTS GSM AMR speech codec, R99 - Version 3.2.0,
+ March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/l_abs.cpp b/media/libstagefright/codecs/amrnb/common/src/l_abs.cpp
new file mode 100644
index 0000000..fd1c90d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/l_abs.cpp
@@ -0,0 +1,193 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/l_abs.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the L_abs function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit long signed integer (Word32 ) whose value falls
+             in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    L_var1 = absolute value of input (Word32)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calculates the absolute value of L_var1; saturate in case
+ where the input is -214783648.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 L_abs (Word32 L_var1)
+{
+    Word32 L_var_out;
+
+    if (L_var1 == MIN_32)
+    {
+        L_var_out = MAX_32;
+    }
+    else
+    {
+        if (L_var1 < 0)
+        {
+            L_var_out = -L_var1;
+        }
+        else
+        {
+            L_var_out = L_var1;
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].L_abs++;
+#endif
+    return (L_var_out);
+}
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word32 L_abs(register Word32 L_var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    Word32 y = L_var1 - (L_var1 < 0);
+    y = y ^(y >> 31);
+    return (y);
+
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/l_deposit_h.cpp b/media/libstagefright/codecs/amrnb/common/src/l_deposit_h.cpp
new file mode 100644
index 0000000..e705ed1
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/l_deposit_h.cpp
@@ -0,0 +1,177 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/l_deposit_h.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the L_deposit_h function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    var1 = 16 bit short signed integer (Word16) whose value falls in
+           the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var1 = deposit of var1 into MSWord of 32 bit value (Word32)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function deposits the 16 bit var1 into the 16 MS bits of the 32 bit
+ output. The 16 LS bits of the output are zeroed.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 L_deposit_h (Word16 var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1 << 16;
+#if (WMOPS)
+    multiCounter[currCounter].L_deposit_h++;
+#endif
+    return (L_var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word32 L_deposit_h(Word16 var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return ((Word32) var1 << 16);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/l_deposit_l.cpp b/media/libstagefright/codecs/amrnb/common/src/l_deposit_l.cpp
new file mode 100644
index 0000000..5064fdb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/l_deposit_l.cpp
@@ -0,0 +1,177 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/l_deposit_l.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the L_deposit_l function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    var1 = 16 bit short signed integer (Word16) whose value falls in
+           the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var1 = deposit of var1 into LSWord of 32 bit value (Word32)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function deposits the 16 bit var1 into the 16 LS bits of the 32 bit
+ output. The 16 MS bits of the output are sign extended.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 L_deposit_l (Word16 var1)
+{
+    Word32 L_var_out;
+
+    L_var_out = (Word32) var1;
+#if (WMOPS)
+    multiCounter[currCounter].L_deposit_l++;
+#endif
+    return (L_var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word32 L_deposit_l(Word16 var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return ((Word32) var1);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/l_shr_r.cpp b/media/libstagefright/codecs/amrnb/common/src/l_shr_r.cpp
new file mode 100644
index 0000000..f609a73
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/l_shr_r.cpp
@@ -0,0 +1,214 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/src/l_shr_r.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the L_shr_r function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag. Removed code that updates MOPS counter. Changed
+              function return value name from "L_var_out" to "result".
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: L_shr_r
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit long signed integer (Word32 ) whose value falls
+             in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+    var2 = 16 bit short signed integer (Word16) whose value falls in
+           the range : 0xffff 8000 <= var2 <= 0x0000 7fff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the 32 bit shift operation resulted in overflow
+
+ Returns:
+    result = Shifted result w/ rounding (Word32)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function arithmetically shifts the 32 bit input L_var1 right var2
+ positions with rounding. If var2 is negative, the function
+ arithmetically shifts L_var1 left by -var2 and zero fills the -var2 LSB of
+ the result. The result is saturated in case of underflows or overflows, i.e.,
+
+ - 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).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] L_shr_r() function in basic_op2.c,  UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 L_shr_r (Word32 L_var1, Word16 var2)
+{
+    Word32 L_var_out;
+
+* The reference ETSI code uses a global flag for Overflow. In the actual
+* implementation a pointer to Overflow flag is passed in as a parameter to the
+* function L_shr()
+
+    if (var2 > 31)
+    {
+        L_var_out = 0;
+    }
+    else
+    {
+        L_var_out = L_shr (L_var1, var2);
+#if (WMOPS)
+        multiCounter[currCounter].L_shr--;
+#endif
+        if (var2 > 0)
+        {
+            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+            {
+                L_var_out++;
+            }
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].L_shr_r++;
+#endif
+    return (L_var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word32 L_shr_r(register Word32 L_var1, register Word16 var2, Flag *pOverflow)
+{
+    Word32 result;
+
+    if (var2 > 31)
+    {
+        result = 0;
+    }
+    else
+    {
+        result = L_shr(L_var1, var2, pOverflow);
+
+        if (var2 > 0)
+        {
+            if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+            {
+                result++;
+            }
+        }
+    }
+    return (result);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/log2.cpp b/media/libstagefright/codecs/amrnb/common/src/log2.cpp
new file mode 100644
index 0000000..0ada423
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/log2.cpp
@@ -0,0 +1,179 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/src/log2.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. Moved Log2_norm
+          function to its own file.
+
+ Description: Changed l_shl.c to l_shl.h in Include section.
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag. Changed input pointer names for clarity.
+
+ Description:
+              1. Eliminated l_shl function knowing that after normalization
+                 the left shift factor will not saturate.
+              2. Eliminated unused include files typedef.h and l_shl.h.
+
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "log2.h"
+#include "basic_op.h"
+#include "log2_norm.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: log2()
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_x = input value of type Word32
+    pExponent = pointer to the integer part of Log2 of type Word16 whose
+           valid range is: 0 <= value <= 30
+    pFraction = pointer to the fractional part of Log2 of type Word16
+           whose valid range is: 0 <= value < 1
+    pOverflow = pointer to overflow flag
+
+
+ Outputs:
+    pExponent -> integer part of the newly calculated Log2
+    pFraction -> fractional part of the newly calculated Log2
+    pOverflow -> 1 if the log2() operation resulted in saturation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes logarithm (base2) of the input L_x, where L_x is
+ positive. If L_x is negative or zero, the result is 0.
+
+ This function first normalizes the input L_x and calls the function Log2_norm
+ to calculate the logarithm.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] log2.c,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void Log2(
+    Word32 L_x,         /* (i) : input value                                */
+    Word16 *pExponent,  /* (o) : Integer part of Log2.   (range: 0<=val<=30)*/
+    Word16 *pFraction,  /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+    Flag   *pOverflow   /* (i/o) : overflow flag                            */
+)
+{
+    Word16 exp;
+    Word32 result;
+    OSCL_UNUSED_ARG(pOverflow);
+
+    exp = norm_l(L_x);
+    result = L_x << exp;
+    Log2_norm(result, exp, pExponent, pFraction);
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/log2_norm.cpp b/media/libstagefright/codecs/amrnb/common/src/log2_norm.cpp
new file mode 100644
index 0000000..feda874
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/log2_norm.cpp
@@ -0,0 +1,238 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/log2_norm.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for Log2_norm function.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Modified code to improve performance.
+              2. Fixed typecasting issue with TI C compiler.
+              3. Added more comments to the code.
+
+ Description: Removed unnecessary line of code (line 208).
+
+ Description: Removed inclusion of "log2.tab"
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "log2_norm.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Log2_norm
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_x = normalized input value of type Word32
+    exp = number of shifts required to normalize L_x; it is of type Word16
+    exponent = pointer to the integer part of Log2 (of type Word16)
+           whose valid range is: 0 <= value <= 30
+    fraction = pointer to the fractional part of Log2 (of type Word16)
+           whose valid range is: 0 <= value < 1
+
+ Outputs:
+    exponent points to the newly calculated integer part of Log2
+    fraction points to the newly calculated fractional part of Log2
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    table = Log2 table of constants of type Word16
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ The function Log2(L_x) calculates the logarithm of the normalized input
+ buffer L_x. The logarithm 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 = i - 32
+ 5. fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ log2.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+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 = sub (30, exp);
+
+    L_x = L_shr (L_x, 9);
+    i = extract_h (L_x);                // Extract b25-b31
+    L_x = L_shr (L_x, 1);
+    a = extract_l (L_x);                // Extract b10-b24 of fraction
+    a = a & (Word16) 0x7fff;
+
+    i = sub (i, 32);
+
+    L_y = L_deposit_h (table[i]);       // table[i] << 16
+    tmp = sub (table[i], table[i + 1]); // table[i] - table[i+1]
+    L_y = L_msu (L_y, tmp, a);          // L_y -= tmp*a*2
+
+    *fraction = extract_h (L_y);
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+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;
+    }
+    else
+    {
+        /* Calculate exponent portion of Log2 */
+        *exponent = 30 - exp;
+
+        /* At this point, L_x > 0       */
+        /* Shift L_x to the right by 10 to extract bits 10-31,  */
+        /* which is needed to calculate fractional part of Log2 */
+        L_x >>= 10;
+        i = (Word16)(L_x >> 15);    /* Extract b25-b31 */
+        a = L_x & 0x7fff;           /* Extract b10-b24 of fraction */
+
+        /* Calculate table index -> subtract by 32 is done for           */
+        /* proper table indexing, since 32<=i<=63 (due to normalization) */
+        i -= 32;
+
+        /* Fraction part of Log2 is approximated by using table[]    */
+        /* and linear interpolation, i.e.,                           */
+        /* fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 */
+        L_y = (Word32) log2_tbl[i] << 16;  /* table[i] << 16        */
+        tmp = log2_tbl[i] - log2_tbl[i + 1];  /* table[i] - table[i+1] */
+        L_y -= (((Word32) tmp) * a) << 1; /* L_y -= tmp*a*2        */
+
+        *fraction = (Word16)(L_y >> 16);
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/log2_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/log2_tbl.cpp
new file mode 100644
index 0000000..25d63b2
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/log2_tbl.cpp
@@ -0,0 +1,164 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/log2_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for log2_tbl[] used by the log2() and
+ log2_norm() function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 log2_tbl[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
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] log2.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsfwt.cpp b/media/libstagefright/codecs/amrnb/common/src/lsfwt.cpp
new file mode 100644
index 0000000..6b511f7
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsfwt.cpp
@@ -0,0 +1,242 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/lsfwt.c
+ Functions: Lsf_wt
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated to accept new parameter, Flag *pOverflow.  Placed
+ file in the proper PV Software template.
+
+ Description:
+              1. Eliminated unused include files.
+              2. Replaced array addressing by pointers
+              3. Eliminated math operations that unnecessary checked for
+                 saturation, by evaluating the operands
+              4. Unrolled loops to speed up processing, use decrement loops
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Who:                       Date:
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf -- Pointer to Word16 -- LSF vector
+
+ Outputs:
+    wf -- Pointer to Word16 -- square of weighting factors
+    pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+Compute LSF weighting factors
+
+ d[i] = lsf[i+1] - lsf[i-1]
+
+ The weighting factors are approximated by two line segment
+
+ First segment passes by the following 2 points:
+
+    d[i] = 0Hz     wf[i] = 3.347
+    d[i] = 450Hz   wf[i] = 1.8
+
+ Second segment passes by the following 2 points:
+
+    d[i] = 450Hz   wf[i] = 1.8
+    d[i] = 1500Hz  wf[i] = 1.0
+
+ if( d[i] < 450Hz )
+   wf[i] = 3.347 - ( (3.347-1.8) / (450-0)) *  d[i]
+ else
+   wf[i] = 1.8 - ( (1.8-1.0) / (1500-450)) *  (d[i] - 450)
+
+
+ if( d[i] < 1843)
+   wf[i] = 3427 - (28160*d[i])>>15
+ else
+   wf[i] = 1843 - (6242*(d[i]-1843))>>15
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsfwt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "lsfwt.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Lsf_wt(
+    Word16 *lsf,         /* input : LSF vector                  */
+    Word16 *wf,          /* output: square of weighting factors */
+    Flag   *pOverflow
+)
+{
+    Word16 temp;
+    Word16 wgt_fct;
+    Word16 i;
+    Word16 *p_wf = wf;
+    Word16 *p_lsf   = &lsf[0];
+    Word16 *p_lsf_2 = &lsf[1];
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    /* wf[0] = lsf[1] - 0  */
+    *(p_wf++) = *(p_lsf_2++);
+
+    for (i = 4; i != 0 ; i--)
+    {
+        *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
+        *(p_wf++) = *(p_lsf_2++) - *(p_lsf++);
+    }
+    /*
+     *  wf[9] = 4000 - lsf[8]
+     */
+    *(p_wf) = 16384 - *(p_lsf);
+
+    p_wf = wf;
+
+    for (i = 10; i != 0; i--)
+    {
+        /*
+         *  (wf[i] - 450);
+         *  1843 == 450 Hz (Q15 considering 7FFF = 8000 Hz)
+         */
+        wgt_fct = *p_wf;
+        temp =  wgt_fct - 1843;
+
+        if (temp > 0)
+        {
+            temp = (Word16)(((Word32)temp * 6242) >> 15);
+            wgt_fct = 1843 - temp;
+        }
+        else
+        {
+            temp = (Word16)(((Word32)wgt_fct * 28160) >> 15);
+            wgt_fct = 3427 - temp;
+        }
+
+        *(p_wf++) = wgt_fct << 3;
+
+    } /* for (i = 10; i != 0; i--) */
+
+    return;
+
+} /* Lsf_wt() */
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp.cpp
new file mode 100644
index 0000000..0e3f772
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsp.cpp
@@ -0,0 +1,530 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/lsp.c
+ Functions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template.
+ Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description: Per review comments, added pOverflow flag to a few forgotten
+ functions.  Removed unnecessary include files.
+
+ Description:  For lsp_reset() and lsp()
+              1. Replaced copy() with more efficient memcpy().
+              2. Eliminated unused include file copy.h.
+
+ Description:  For lsp_reset()
+              1. Modified memcpy() operands order.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <stdlib.h>
+#include <string.h>
+
+#include "lsp.h"
+#include "typedef.h"
+#include "q_plsf.h"
+#include "az_lsp.h"
+#include "int_lpc.h"
+#include "lsp_tab.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp_init (lspState **st)
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = Pointer to type lspState
+
+ Outputs:
+    st = Pointer to type lspState -- values are initialized.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    lsp_init_data = Word16 array.
+
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Initializes lsp state data.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 lsp_init(lspState **st)
+{
+    lspState* s;
+
+    if (st == (lspState **) NULL)
+    {
+        /* fprintf(stderr, "lsp_init: invalid parameter\n"); */
+        return -1;
+    }
+
+    *st = NULL;
+
+    /* allocate memory */
+    if ((s = (lspState *) malloc(sizeof(lspState))) == NULL)
+    {
+        /* fprintf(stderr, "lsp_init: can not malloc state structure\n"); */
+        return -1;
+    }
+
+    /* Initialize quantization state */
+    if (0 != Q_plsf_init(&s->qSt))
+    {
+        return -1;
+    }
+
+    if (0 != lsp_reset(s))
+    {
+        return -1;
+    }
+
+    *st = s;
+
+    return 0;
+}
+
+
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = Pointer to type lspState
+
+ Outputs:
+    st = Pointer to type lspState -- values are reset.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    resets lsp_state data
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+Word16 lsp_reset(lspState *st)
+{
+
+    if (st == (lspState *) NULL)
+    {
+        /* fprintf(stderr, "lsp_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    /* Init lsp_old[] */
+    memcpy(st->lsp_old,   lsp_init_data,   M*sizeof(Word16));
+
+    /* Initialize lsp_old_q[] */
+    memcpy(st->lsp_old_q,   st->lsp_old,  M*sizeof(Word16));
+
+    /* Reset quantization state */
+    Q_plsf_reset(st->qSt);
+
+    return 0;
+}
+
+
+
+
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp_exit
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = Pointer to type lspState
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Frees memory used by lspState.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void lsp_exit(lspState **st)
+{
+    if (st == NULL || *st == NULL)
+        return;
+
+    /* Deallocate members */
+    Q_plsf_exit(&(*st)->qSt);
+
+    /* deallocate memory */
+    free(*st);
+    *st = NULL;
+
+    return;
+}
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+ Inputs:
+    st = Pointer to type lspState -- State struct
+    req_mode = enum Mode -- requested coder mode
+    used_mode = enum Mode -- used coder mode
+    az = array of type Word16 -- interpolated LP parameters Q12
+
+ Outputs:
+    azQ = array of type Word16 -- quantization interpol. LP parameters Q12
+    lsp_new = array of type Word16 -- new lsp vector
+    anap = Double pointer of type Word16 -- analysis parameters
+    pOverflow = Pointer to type Flag -- Flag set when overflow occurs
+    st = Pointer to type lspState -- State struct
+    az = array of type Word16 -- interpolated LP parameters Q12
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void lsp(lspState *st,       /* i/o : State struct                            */
+         enum Mode req_mode, /* i   : requested coder mode                    */
+         enum Mode used_mode,/* i   : used coder mode                         */
+         Word16 az[],        /* i/o : interpolated LP parameters Q12          */
+         Word16 azQ[],       /* o   : quantization interpol. LP parameters Q12*/
+         Word16 lsp_new[],   /* o   : new lsp vector                          */
+         Word16 **anap,      /* o   : analysis parameters                     */
+         Flag   *pOverflow)  /* o   : Flag set when overflow occurs           */
+
+{
+    Word16 lsp_new_q[M];    /* LSPs at 4th subframe           */
+    Word16 lsp_mid[M], lsp_mid_q[M];    /* LSPs at 2nd subframe           */
+
+    Word16 pred_init_i; /* init index for MA prediction in DTX mode */
+
+    if (req_mode == MR122)
+    {
+        Az_lsp(&az[MP1], lsp_mid, st->lsp_old, pOverflow);
+        Az_lsp(&az[MP1 * 3], lsp_new, lsp_mid, pOverflow);
+
+        /*--------------------------------------------------------------------*
+         * Find interpolated LPC parameters in all subframes (both quantized  *
+         * and unquantized).                                                  *
+         * The interpolated parameters are in array A_t[] of size (M+1)*4     *
+         * and the quantized interpolated parameters are in array Aq_t[]      *
+         *--------------------------------------------------------------------*/
+        Int_lpc_1and3_2(st->lsp_old, lsp_mid, lsp_new, az, pOverflow);
+
+        if (used_mode != MRDTX)
+        {
+            /* LSP quantization (lsp_mid[] and lsp_new[] jointly quantized) */
+            Q_plsf_5(
+                st->qSt,
+                lsp_mid,
+                lsp_new,
+                lsp_mid_q,
+                lsp_new_q,
+                *anap,
+                pOverflow);
+
+            Int_lpc_1and3(st->lsp_old_q, lsp_mid_q, lsp_new_q, azQ, pOverflow);
+
+            /* Advance analysis parameters pointer */
+            (*anap) += 5;
+        }
+    }
+    else
+    {
+        Az_lsp(&az[MP1 * 3], lsp_new, st->lsp_old, pOverflow);  /* From A(z) to lsp  */
+
+        /*--------------------------------------------------------------------*
+         * Find interpolated LPC parameters in all subframes (both quantized  *
+         * and unquantized).                                                  *
+         * The interpolated parameters are in array A_t[] of size (M+1)*4     *
+         * and the quantized interpolated parameters are in array Aq_t[]      *
+         *--------------------------------------------------------------------*/
+
+        Int_lpc_1to3_2(st->lsp_old, lsp_new, az, pOverflow);
+
+        if (used_mode != MRDTX)
+        {
+            /* LSP quantization */
+            Q_plsf_3(
+                st->qSt,
+                req_mode,
+                lsp_new,
+                lsp_new_q,
+                *anap,
+                &pred_init_i,
+                pOverflow);
+
+            Int_lpc_1to3(
+                st->lsp_old_q,
+                lsp_new_q,
+                azQ,
+                pOverflow);
+
+            /* Advance analysis parameters pointer */
+            (*anap) += 3;
+        }
+    }
+
+    /* update the LSPs for the next frame */
+    memcpy(st->lsp_old,   lsp_new,   M*sizeof(Word16));
+
+    if (used_mode != MRDTX)
+    {
+        memcpy(st->lsp_old_q, lsp_new_q, M*sizeof(Word16));
+    }
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp
new file mode 100644
index 0000000..6b7b471
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsp_az.cpp
@@ -0,0 +1,555 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/lsp_az.c
+ Funtions: Get_lsp_pol
+           Lsp_Az
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Deleted all Local stores needed/modified. Optimized Lsp_Az
+          function by getting rid of call to L_shr_r function.
+
+ Description: Updated file per comments gathered from Phase 2/3 review.
+
+ Description: Added setting of Overflow flag in the inlined code.
+
+ Description: 1. Optimized Lsp_Az function code.
+              2. Changed Input/Output definitions by adding Word type.
+
+ Description: Made changes based on review meeting.
+              1. Removed pseudocode.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h and oper_32b.h with the header files of the
+              math functions used in the file.
+
+ Description: Modified to pass overflow flag through to L_add and L_sub.  The
+ flag is passed back to the calling function by pointer reference.
+
+ Description: Removed the id line since it was removed in the header file by
+              Ken.
+
+ Description: Added the write-only variable, pOverflow, to the inputs section.
+
+ Description:  For lsp_az() and Get_lsp_pol()
+              1. Eliminated unused include files.
+              2. Replaced array addressing by pointers
+              3. Eliminated math operations that unnecessary checked for
+                 saturation, in some cases this by shifting before adding and
+                 in other cases by evaluating the operands
+              4. Unrolled loops to speed up processing
+              5. Replaced mpy_32_16 by multpilcations in place
+              6. Eliminated if-else statements for sign extension when
+                 right-shifting
+
+ Description:  Added casting to eliminate warnings, and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains functions that convert line spectral pairs (LSP) to
+ linear predictive (LP) coefficients (filter order = 10). The functions
+ included in this file include Get_lsp_pol, which finds the coefficients of
+ F1(z) and F2(z), and Lsp_Az, which converts LSP to LPC by multiplying
+ F1(z) by 1+z^(-1) and F2(z) by 1-z^(-1), then calculating A(z) = (F1(z) +
+ F2(z))/2.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "lsp_az.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Get_lsp_pol
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp = pointer to the buffer containing the line spectral pairs (LSP)
+          of type Word16
+    f = pointer to the polynomial of type Word32 to be generated
+
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Outputs:
+    buffer pointed to by f contains the polynomial generated
+
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function finds the polynomial F1(z) or F2(z) from the LSPs. If the LSP
+ vector is passed at address 0, F1(z) is computed and if it is passed at
+ address 1, F2(z) is computed.
+
+ This is performed by expanding the product polynomials:
+
+    F1(z) =   product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
+        i=0,2,4,6,8
+    F2(z) =   product   ( 1 - 2 lsp[i] z^-1 + z^-2 )
+        i=1,3,5,7,9
+
+ where lsp[] is the LSP vector in the cosine domain.
+
+ The expansion is performed using the following recursion:
+
+    f[0] = 1
+    b = -2.0 * lsp[0]
+    f[1] = b
+    for i=2 to 5 do
+        b = -2.0 * lsp[2*i-2];
+        for j=i-1 down to 2 do
+            f[j] = f[j] + b*f[j-1] + f[j-2];
+        f[1] = f[1] + b;
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp_az.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static void Get_lsp_pol (Word16 *lsp, Word32 *f)
+{
+    Word16 i, j, hi, lo;
+    Word32 t0;
+
+    // f[0] = 1.0;
+    *f = L_mult (4096, 2048);
+    f++;
+    *f = L_msu ((Word32) 0, *lsp, 512);    // f[1] =  -2.0 * lsp[0];
+    f++;
+    lsp += 2;                              // Advance lsp pointer
+
+    for (i = 2; i <= 5; i++)
+    {
+        *f = f[-2];
+
+        for (j = 1; j < i; j++, f--)
+        {
+            L_Extract (f[-1], &hi, &lo);
+            t0 = Mpy_32_16 (hi, lo, *lsp); // t0 = f[-1] * lsp
+            t0 = L_shl (t0, 1);
+            *f = L_add (*f, f[-2]); // *f += f[-2]
+            *f = L_sub (*f, t0); // *f -= t0
+        }
+        *f = L_msu (*f, *lsp, 512); // *f -= lsp<<9
+        f += i;                            // Advance f pointer
+        lsp += 2;                          // Advance lsp pointer
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void Get_lsp_pol(
+    Word16 *lsp,
+    Word32 *f,
+    Flag   *pOverflow)
+{
+    register Word16 i;
+    register Word16 j;
+
+    Word16 hi;
+    Word16 lo;
+    Word32 t0;
+    OSCL_UNUSED_ARG(pOverflow);
+
+    /* f[0] = 1.0;             */
+    *f++ = (Word32) 0x01000000;
+    *f++ = (Word32) - *(lsp++) << 10;       /* f[1] =  -2.0 * lsp[0];  */
+    lsp++;                                  /* Advance lsp pointer     */
+
+    for (i = 2; i <= 5; i++)
+    {
+        *f = *(f - 2);
+
+        for (j = 1; j < i; j++)
+        {
+            hi = (Word16)(*(f - 1) >> 16);
+
+            lo = (Word16)((*(f - 1) >> 1) - ((Word32) hi << 15));
+
+            t0  = ((Word32)hi * *lsp);
+            t0 += ((Word32)lo * *lsp) >> 15;
+
+            *(f) +=  *(f - 2);          /*      *f += f[-2]      */
+            *(f--) -=  t0 << 2;         /*      *f -= t0         */
+
+        }
+
+        *f -= (Word32)(*lsp++) << 10;
+
+        f  += i;
+        lsp++;
+    }
+
+    return;
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Get_lsp_pol_wrapper
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp = pointer to the buffer containing the line spectral pairs (LSP)
+          of type Word16
+    f = pointer to the polynomial of type Word32 to be generated
+
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Outputs:
+    buffer pointed to by f contains the polynomial generated
+
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function provides external access to the static function Get_lsp_pol.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ CALL Get_lsp_pol(lsp = lsp_ptr
+                  f = f_ptr )
+   MODIFYING(nothing)
+   RETURNING(nothing)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Get_lsp_pol_wrapper(
+    Word16 *lsp,
+    Word32 *f,
+    Flag   *pOverflow)
+{
+    /*----------------------------------------------------------------------------
+     CALL Get_lsp_pol(lsp = lsp_ptr
+              f = f_ptr )
+    ----------------------------------------------------------------------------*/
+    Get_lsp_pol(lsp, f, pOverflow);
+
+    /*----------------------------------------------------------------------------
+       MODIFYING(nothing)
+       RETURNING(nothing)
+    ----------------------------------------------------------------------------*/
+    return;
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Lsp_Az
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp = pointer to the buffer containing the line spectral pairs (LSP)
+          of type Word16
+
+      a = pointer to the buffer containing Linear Predictive (LP)
+          coefficients of type Word16 to be generated
+
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    pOverflow  = pointer set in case where one of the operations overflows.
+                 [data type Pointer to Flag]
+
+ Pointers and Buffers Modified:
+    a buffer contains the generated Linear Predictive (LP) coefficients
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+        None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function converts from the line spectral pairs (LSP) to LP coefficients
+ for a 10th order filter.
+
+ This is done by:
+    (1) Find the coefficients of F1(z) and F2(z) (see Get_lsp_pol)
+    (2) Multiply F1(z) by 1+z^{-1} and F2(z) by 1-z^{-1}
+    (3) A(z) = ( F1(z) + F2(z) ) / 2
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp_az.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Lsp_Az (
+    Word16 lsp[],        // (i)  : line spectral frequencies
+    Word16 a[]           // (o)  : predictor coefficients (order = 10)
+)
+{
+    Word16 i, j;
+    Word32 f1[6], f2[6];
+    Word32 t0;
+
+    Get_lsp_pol (&lsp[0], f1);
+    Get_lsp_pol (&lsp[1], f2);
+
+    for (i = 5; i > 0; i--)
+    {
+        f1[i] = L_add (f1[i], f1[i - 1]); // f1[i] += f1[i-1];
+        f2[i] = L_sub (f2[i], f2[i - 1]); // f2[i] -= f2[i-1];
+    }
+
+    a[0] = 4096;
+    for (i = 1, j = 10; i <= 5; i++, j--)
+    {
+        t0 = L_add (f1[i], f2[i]);           // f1[i] + f2[i]
+        a[i] = extract_l (L_shr_r (t0, 13));
+        t0 = L_sub (f1[i], f2[i]);           // f1[i] - f2[i]
+        a[j] = extract_l (L_shr_r (t0, 13));
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Lsp_Az(
+    Word16 lsp[],        /* (i)  : line spectral frequencies            */
+    Word16 a[],          /* (o)  : predictor coefficients (order = 10)  */
+    Flag  *pOverflow     /* (o)  : overflow flag                        */
+)
+{
+    register Word16 i;
+    register Word16 j;
+
+    Word32 f1[6];
+    Word32 f2[6];
+    Word32 t0;
+    Word32 t1;
+    Word16 *p_a = &a[0];
+    Word32 *p_f1;
+    Word32 *p_f2;
+
+    Get_lsp_pol(&lsp[0], f1, pOverflow);
+
+    Get_lsp_pol(&lsp[1], f2, pOverflow);
+
+    p_f1 = &f1[5];
+    p_f2 = &f2[5];
+
+    for (i = 5; i > 0; i--)
+    {
+        *(p_f1--) += f1[i-1];
+        *(p_f2--) -= f2[i-1];
+    }
+
+    *(p_a++) = 4096;
+    p_f1 = &f1[1];
+    p_f2 = &f2[1];
+
+    for (i = 1, j = 10; i <= 5; i++, j--)
+    {
+        t0 = *(p_f1) + *(p_f2);               /* f1[i] + f2[i] */
+        t1 = *(p_f1++) - *(p_f2++);           /* f1[i] - f2[i] */
+
+        t0 = t0 + ((Word32) 1 << 12);
+        t1 = t1 + ((Word32) 1 << 12);
+
+        *(p_a++) = (Word16)(t0 >> 13);
+        a[j]     = (Word16)(t1 >> 13);
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp_lsf.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp_lsf.cpp
new file mode 100644
index 0000000..39d6eda
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsp_lsf.cpp
@@ -0,0 +1,384 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/lsp_lsf.c
+ Functions: Lsp_lsf
+            Lsf_lsp
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template.
+
+ Description: Deleted variables listed in the Local Stores Needed/Modified
+              section.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template and removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header file of the math functions
+              used in the file.
+
+ Description: Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description: Placed table declarations in a .c file, rather than an included
+ .tab.  The tables are now referenced via an extern in this file.
+
+ Description:  For Lsp_lsf()
+              1. Eliminated unused include file typedef.h.
+              2. Replaced array addressing by pointers
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the functions that convert line spectral pairs (LSP) to
+ line spectral frequencies (LSF) and vice-versa.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "lsp_lsf.h"
+#include "basicop_malloc.h"
+#include "basic_op.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 table[];
+    extern const Word16 slope[];
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Lsf_lsp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf = buffer containing normalized line spectral frequencies; valid
+          range is between 0 and 0.5 (Word16)
+    lsp = buffer containing line spectral pairs; valid range is between
+          -1 and 1 (Word16)
+    m = LPC order (Word16)
+
+ Outputs:
+    lsp contains the newly calculated line spectral pairs
+
+ Returns:
+    None
+
+ Global Variables Used:
+    table = cosine table
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the LSF to LSP transformation using the equation:
+
+    lsf[i] = arccos(lsp[i])/(2*pi)
+
+ The transformation from lsp[i] to lsf[i] is approximated by a look-up table
+ and interpolation.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Lsf_lsp (
+    Word16 lsf[],       // (i) : lsf[m] normalized (range: 0.0<=val<=0.5)
+    Word16 lsp[],       // (o) : lsp[m] (range: -1<=val<1)
+    Word16 m            // (i) : LPC order
+)
+{
+    Word16 i, ind, offset;
+    Word32 L_tmp;
+
+    for (i = 0; i < m; i++)
+    {
+        ind = shr (lsf[i], 8);      // ind    = b8-b15 of lsf[i]
+        offset = lsf[i] & 0x00ff;    // offset = b0-b7  of lsf[i]
+
+        // lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256
+
+        L_tmp = L_mult (sub (table[ind + 1], table[ind]), offset);
+        lsp[i] = add (table[ind], extract_l (L_shr (L_tmp, 9)));
+
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Lsf_lsp(
+    Word16 lsf[],       /* (i) : lsf[m] normalized (range: 0.0<=val<=0.5) */
+    Word16 lsp[],       /* (o) : lsp[m] (range: -1<=val<1)                */
+    Word16 m,           /* (i) : LPC order                                */
+    Flag   *pOverflow   /* (o) : Flag set when overflow occurs            */
+)
+{
+    Word16 i, ind, offset;
+    Word32 L_tmp;
+
+    for (i = 0; i < m; i++)
+    {
+        ind = lsf[i] >> 8;           /* ind    = b8-b15 of lsf[i] */
+        offset = lsf[i] & 0x00ff;    /* offset = b0-b7  of lsf[i] */
+
+        /* lsp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 256 */
+
+        L_tmp = ((Word32)(table[ind + 1] - table[ind]) * offset) >> 8;
+        lsp[i] = add(table[ind], (Word16) L_tmp, pOverflow);
+
+    }
+
+    return;
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Lsp_lsf
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsp = buffer containing line spectral pairs; valid range is between
+          -1 and 1 (Word16)
+    lsf = buffer containing normalized line spectral frequencies; valid
+          range is between 0 and 0.5 (Word16)
+    m = LPC order (Word16)
+
+ Outputs:
+    lsf contains the newly calculated normalized line spectral frequencies
+
+ Returns:
+    None
+
+ Global Variables Used:
+    table = cosine table
+    slope = table to used to calculate inverse cosine
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the LSP to LSF transformation using the equation:
+
+    lsp[i] = cos(2*pi*lsf[i])
+
+ The transformation from lsf[i] to lsp[i] is approximated by a look-up table
+ and interpolation.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ lsp_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Lsp_lsf (
+    Word16 lsp[],       // (i)  : lsp[m] (range: -1<=val<1)
+    Word16 lsf[],       // (o)  : lsf[m] normalized (range: 0.0<=val<=0.5)
+    Word16 m            // (i)  : LPC order
+)
+{
+    Word16 i, ind;
+    Word32 L_tmp;
+
+    ind = 63;                        // begin at end of table -1
+
+    for (i = m - 1; i >= 0; i--)
+    {
+        // find value in table that is just greater than lsp[i]
+
+        while (sub (table[ind], lsp[i]) < 0)
+        {
+            ind--;
+
+        }
+
+        // acos(lsp[i])= ind*256 + ( ( lsp[i]-table[ind] ) *
+           slope[ind] )/4096
+
+        L_tmp = L_mult (sub (lsp[i], table[ind]), slope[ind]);
+        //(lsp[i]-table[ind])*slope[ind])>>12
+        lsf[i] = pv_round (L_shl (L_tmp, 3));
+        lsf[i] = add (lsf[i], shl (ind, 8));
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Lsp_lsf(
+    Word16 lsp[],       /* (i)  : lsp[m] (range: -1<=val<1)                */
+    Word16 lsf[],       /* (o)  : lsf[m] normalized (range: 0.0<=val<=0.5) */
+    Word16 m,           /* (i)  : LPC order                                */
+    Flag  *pOverflow    /* (o)  : Flag set when overflow occurs            */
+)
+{
+    Word16 i;
+    Word16 ind;
+    Word16 temp;
+    Word32 L_tmp;
+    Word16 *p_lsp = &lsp[m-1];
+    Word16 *p_lsf = &lsf[m-1];
+    OSCL_UNUSED_ARG(pOverflow);
+
+    ind = 63;                        /* begin at end of table -1 */
+
+    for (i = m - 1; i >= 0; i--)
+    {
+        /* find value in table that is just greater than lsp[i] */
+        temp = *(p_lsp--);
+        while (table[ind] < temp)
+        {
+            ind--;
+        }
+
+        /* acos(lsp[i])= ind*256 + ( ( lsp[i]-table[ind] ) *
+           slope[ind] )/4096 */
+
+        L_tmp = (Word32)(temp - table[ind]) * slope[ind];
+
+        /*(lsp[i]-table[ind])*slope[ind])>>12*/
+        L_tmp  = (L_tmp + 0x00000800) >> 12;
+
+        *(p_lsf--) = (Word16)(L_tmp) + (ind << 8);
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp_lsf_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp_lsf_tbl.cpp
new file mode 100644
index 0000000..cee0f32
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsp_lsf_tbl.cpp
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/src/lsp_lsf_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, lsp_lsf.tab
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 table[65] =
+    {
+        32767, 32729, 32610, 32413, 32138, 31786, 31357, 30853,
+        30274, 29622, 28899, 28106, 27246, 26320, 25330, 24279,
+        23170, 22006, 20788, 19520, 18205, 16846, 15447, 14010,
+        12540, 11039, 9512, 7962, 6393, 4808, 3212, 1608,
+        0, -1608, -3212, -4808, -6393, -7962, -9512, -11039,
+        -12540, -14010, -15447, -16846, -18205, -19520, -20788, -22006,
+        -23170, -24279, -25330, -26320, -27246, -28106, -28899, -29622,
+        -30274, -30853, -31357, -31786, -32138, -32413, -32610, -32729,
+        (Word16) 0x8000
+    };
+
+    /* 0x8000 = -32768 (used to silence the compiler) */
+
+    /* slope used to compute y = acos(x) */
+
+    extern const Word16 slope[64] =
+    {
+        -26887, -8812, -5323, -3813, -2979, -2444, -2081, -1811,
+        -1608, -1450, -1322, -1219, -1132, -1059, -998, -946,
+        -901, -861, -827, -797, -772, -750, -730, -713,
+        -699, -687, -677, -668, -662, -657, -654, -652,
+        -652, -654, -657, -662, -668, -677, -687, -699,
+        -713, -730, -750, -772, -797, -827, -861, -901,
+        -946, -998, -1059, -1132, -1219, -1322, -1450, -1608,
+        -1811, -2081, -2444, -2979, -3813, -5323, -8812, -26887
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/lsp_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/lsp_tab.cpp
new file mode 100644
index 0000000..deded93
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/lsp_tab.cpp
@@ -0,0 +1,187 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: .audio/gsm-amr/c/src/lsp_tab.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition. Removed corresponding header file from Include
+              section.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   File             : lsp.tab
+   Purpose          : Table for lsp init
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+#include    "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    extern const Word16 lsp_init_data[M] = {30000, 26000, 21000, 15000, 8000,
+        0, -8000, -15000, -21000, -26000
+    };
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp b/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp
new file mode 100644
index 0000000..0777e68
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/mult_r.cpp
@@ -0,0 +1,218 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/mult_r.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the mult_r function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Passing in a pointer to the overflow flag instead of using
+          a global flag.
+
+ Description: Made the following changes based on P2/P3 review:
+              1) Simplified test to determine if sign extension is necessary
+              2) Changed the name of pointer "overflow" to "Poverflow"
+              3) Removed code that updates MOPS counter
+              4) Updated template and reference section
+
+ Who:                       Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Multiplication function with rounding and overflow control
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: mult_r
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ 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 <= var2 <= 0x0000 7fff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the add operation resulted in overflow
+
+ Returns:
+    L_product_arr = 16-bit limited product of var1 and var2 (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the multiplication of var1 by var2 with rounding, and
+ gives a 16 bit result which is scaled, i.e.:
+    mult_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and  |
+    mult_r(-32768,-32768) = 32767
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] mult_r() function in basicop2.c, UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 mult_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+    Word32 L_product_arr;
+
+    L_product_arr = (Word32) var1 *(Word32) var2;
+    L_product_arr += (Word32) 0x00004000L;
+    L_product_arr &= (Word32) 0xffff8000L;
+    L_product_arr >>= 15;
+
+    if (L_product_arr & (Word32) 0x00010000L)
+    {
+        L_product_arr |= (Word32) 0xffff0000L;
+    }
+* The reference ETSI code uses a global flag for Overflow inside the function
+* saturate(). In the actual implementation a pointer to Overflow flag is passed in
+* as a parameter to the function
+
+    var_out = saturate (L_product_arr);
+
+#if (WMOPS)
+    multiCounter[currCounter].mult_r++;
+#endif
+
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Word16 mult_r(Word16 var1, Word16 var2, Flag *pOverflow)
+{
+
+    register Word32 L_product_arr;
+
+    L_product_arr = ((Word32) var1) * var2;              /* product */
+    L_product_arr += (Word32) 0x00004000L;               /* round */
+    L_product_arr >>= 15;                                /* shift */
+
+    /* sign extend when necessary */
+    L_product_arr |= (Word32) - (L_product_arr & (Word32) 0x00010000L);
+
+    /* Saturate result (if necessary). */
+    /* Replaced function call with in-line code to conserve MIPS, */
+    /* i.e., var_out = saturate (L_product_arr)  */
+
+    if (L_product_arr > 0X00007fffL)
+    {
+        *pOverflow = 1;
+        L_product_arr = MAX_16;
+    }
+    else if (L_product_arr < (Word32) 0xffff8000L)
+    {
+        *pOverflow = 1;
+        L_product_arr = MIN_16;
+    }
+
+    return ((Word16) L_product_arr);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/negate.cpp b/media/libstagefright/codecs/amrnb/common/src/negate.cpp
new file mode 100644
index 0000000..be58d2b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/negate.cpp
@@ -0,0 +1,179 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/src/negate.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the negate function. Sync'ed up with
+          the current template and fixed tabs.
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    var1 = 16 bit short signed integer (Word16) whose value falls in
+           the range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var1 = negated value of input (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function negates var1 with saturation; saturate in the case where input
+ is -32768: negate(var1) = sub(0,var1).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 negate (Word16 var1)
+{
+    Word16 var_out;
+
+    var_out = (var1 == MIN_16) ? MAX_16 : -var1;
+#if (WMOPS)
+    multiCounter[currCounter].negate++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "negate.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 negate(register Word16 var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    var1 = (var1 == MIN_16) ? MAX_16 : -var1;
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return (var1);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp b/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp
new file mode 100644
index 0000000..132fed6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/norm_l.cpp
@@ -0,0 +1,247 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./gsm-amr/c/src/norm_l.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the norm_l function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Updated module description to be the same as the equivalent
+          assembly file (norm_l.asm).
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Description: Made the following changes
+              1. Unrolled the search loop to make four comparison per
+                 pass, using only four iterations of the loop and saving
+                 shifts cycles
+              2. Updated header and copyright year
+
+ Description: 1. Support for ARM and Linux-ARM assembly instructions.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit long signed integer (Word32) whose value falls
+             in the range : 0x8000 0000 <= var1 <= 0x7fff ffff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var_out = number of left shifts need to normalize input (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function produces the number of left shifts needed to normalize the 32
+ bit variable L_var1 for positive values on the interval with minimum of
+ 0x40000000 and maximum of 0x7fffffff, and for negative values on the interval
+ with minimum of 0x80000000 and maximum of 0xc0000000. Note that when L_var1
+ is equal to zero, the output var_out is set to zero.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 norm_l (Word32 L_var1)
+{
+    Word16 var_out;
+
+    if (L_var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (L_var1 == (Word32) 0xffffffffL)
+        {
+            var_out = 31;
+        }
+        else
+        {
+            if (L_var1 < 0)
+            {
+                L_var1 = ~L_var1;
+            }
+            for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+            {
+                L_var1 <<= 1;
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].norm_l++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+#if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) )
+Word16 norm_l(register Word32 L_var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    register Word16 var_out = 0;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    if (L_var1)
+    {
+
+        Word32 y = L_var1 - (L_var1 < 0);
+        L_var1 = y ^(y >> 31);
+
+
+        while (!(0x40000000L & L_var1))
+        {
+            var_out++;
+            if ((0x20000000L & L_var1))
+            {
+                break;
+            }
+            var_out++;
+            if ((0x10000000L & L_var1))
+            {
+                break;
+            }
+            var_out++;
+            if ((0x08000000L & L_var1))
+            {
+                break;
+            }
+            var_out++;
+            L_var1 <<= 4;
+        }
+    }
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+
+
+    return (var_out);
+}
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp b/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp
new file mode 100644
index 0000000..8cdcdb8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/norm_s.cpp
@@ -0,0 +1,242 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/src/norm_s.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the norm_s function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Updated input/output definition and module description to
+          be the same as the equivalent assembly file (norm_s.asm).
+
+ Description: Updated definition of var1 to be the same as that in the
+          assembly file (norm_s.asm).
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    var1 = 16 bit signed integer of type Word16, whose value falls
+           in the range: 0x8000 <= var1 <= 0x7fff
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var_out = number of left shifts need to normalize var1 (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function produces the number of left shifts needed to normalize the 16
+ bit variable var1 for positive values on the interval with minimum of 0x4000
+ and maximum of 0x7fff, and for negative values on the interval with minimum
+ of 0x8000 and maximum of 0xc000. Note that when var1 is zero, the resulting
+ output var_out is set to zero.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 norm_s (Word16 var1)
+{
+    Word16 var_out;
+
+    if (var1 == 0)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        if (var1 == (Word16) 0xffff)
+        {
+            var_out = 15;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var1 = ~var1;
+            }
+            for (var_out = 0; var1 < 0x4000; var_out++)
+            {
+                var1 <<= 1;
+            }
+        }
+    }
+
+#if (WMOPS)
+    multiCounter[currCounter].norm_s++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+#if !( defined(PV_ARM_V5) || defined(PV_ARM_GCC_V5) )
+
+Word16 norm_s(register Word16 var1)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    register Word16 var_out = 0;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    if (var1)
+    {
+        Word16 y = var1 - (var1 < 0);
+        var1 = y ^(y >> 15);
+
+        while (!(0x4000 & var1))
+        {
+            var_out++;
+            if ((0x2000 & var1))
+            {
+                break;
+            }
+            var_out++;
+            if ((0x1000 & var1))
+            {
+                break;
+            }
+            var_out++;
+            if ((0x0800 & var1))
+            {
+                break;
+            }
+            var_out++;
+            var1 <<= 4;
+        }
+    }
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return (var_out);
+}
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/common/src/overflow_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/overflow_tbl.cpp
new file mode 100644
index 0000000..e5d42d6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/overflow_tbl.cpp
@@ -0,0 +1,174 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/overflow_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for overflow_tbl[] used by the l_shl()
+ and l_shr() functions.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word32 overflow_tbl [32]   = {0x7fffffffL, 0x3fffffffL,
+        0x1fffffffL, 0x0fffffffL,
+        0x07ffffffL, 0x03ffffffL,
+        0x01ffffffL, 0x00ffffffL,
+        0x007fffffL, 0x003fffffL,
+        0x001fffffL, 0x000fffffL,
+        0x0007ffffL, 0x0003ffffL,
+        0x0001ffffL, 0x0000ffffL,
+        0x00007fffL, 0x00003fffL,
+        0x00001fffL, 0x00000fffL,
+        0x000007ffL, 0x000003ffL,
+        0x000001ffL, 0x000000ffL,
+        0x0000007fL, 0x0000003fL,
+        0x0000001fL, 0x0000000fL,
+        0x00000007L, 0x00000003L,
+        0x00000001L, 0x00000000L
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] l_shl() function in basic_op2.c,  UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/ph_disp_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/ph_disp_tab.cpp
new file mode 100644
index 0000000..99725df
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/ph_disp_tab.cpp
@@ -0,0 +1,188 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/ph_disp_tab.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the table of impulse responses of the phase dispersion
+ filters. All impulse responses are in Q15
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 ph_imp_low_MR795[40] =
+    {
+        26777,    801,   2505,   -683,  -1382,    582,    604,  -1274,   3511,  -5894,
+        4534,   -499,  -1940,   3011,  -5058,   5614,  -1990,  -1061,  -1459,   4442,
+        -700,  -5335,   4609,    452,   -589,  -3352,   2953,   1267,  -1212,  -2590,
+        1731,   3670,  -4475,   -975,   4391,  -2537,    949,  -1363,   -979,   5734
+    };
+    extern const Word16 ph_imp_mid_MR795[40] =
+    {
+        30274,   3831,  -4036,   2972,  -1048,  -1002,   2477,  -3043,   2815,  -2231,
+        1753,  -1611,   1714,  -1775,   1543,  -1008,    429,   -169,    472,  -1264,
+        2176,  -2706,   2523,  -1621,    344,    826,  -1529,   1724,  -1657,   1701,
+        -2063,   2644,  -3060,   2897,  -1978,    557,    780,  -1369,    842,    655
+    };
+
+    extern const Word16 ph_imp_low[40] =
+    {
+        14690,  11518,   1268,  -2761,  -5671,   7514,    -35,  -2807,  -3040,   4823,
+        2952,  -8424,   3785,   1455,   2179,  -8637,   8051,  -2103,  -1454,    777,
+        1108,  -2385,   2254,   -363,   -674,  -2103,   6046,  -5681,   1072,   3123,
+        -5058,   5312,  -2329,  -3728,   6924,  -3889,    675,  -1775,     29,  10145
+    };
+    extern const Word16 ph_imp_mid[40] =
+    {
+        30274,   3831,  -4036,   2972,  -1048,  -1002,   2477,  -3043,   2815,  -2231,
+        1753,  -1611,   1714,  -1775,   1543,  -1008,    429,   -169,    472,  -1264,
+        2176,  -2706,   2523,  -1621,    344,    826,  -1529,   1724,  -1657,   1701,
+        -2063,   2644,  -3060,   2897,  -1978,    557,    780,  -1369,    842,    655
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ph_disp.tab, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/pow2.cpp b/media/libstagefright/codecs/amrnb/common/src/pow2.cpp
new file mode 100644
index 0000000..a8686f8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/pow2.cpp
@@ -0,0 +1,202 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/pow2.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag. Removed inclusion of "pow2.tab"
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pow2.h"
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Pow2
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    exponent = Integer part whose valid range is: 0 <= value <= 30 (Word16)
+    fraction = Fractional part whose valid range is 0 <= value < 1
+
+    pOverflow = pointer to overflow flag
+
+ Outputs:
+    L_x = Result of the Pow2() computation (Word32)
+    pOverflow -> 1 if the Pow2() function results in saturation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes  L_x = pow(2.0, exponent.fraction)
+
+ 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-exponent)     (with rounding)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ pow2.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 Pow2 (           // (o)  : result       (range: 0<=val<=0x7fffffff)
+    Word16 exponent,    // (i)  : Integer part.      (range: 0<=val<=30)
+    Word16 fraction     // (i)  : Fractional part.  (range: 0.0<=val<1.0)
+)
+{
+    Word16 exp, i, a, tmp;
+    Word32 L_x;
+
+    L_x = L_mult (fraction, 32);        // L_x = fraction<<6
+    i = extract_h (L_x);                // Extract b10-b16 of fraction
+    L_x = L_shr (L_x, 1);
+    a = extract_l (L_x);                // Extract b0-b9   of fraction
+    a = a & (Word16) 0x7fff;
+
+    L_x = L_deposit_h (table[i]);       // table[i] << 16
+    tmp = sub (table[i], table[i + 1]); // table[i] - table[i+1]
+    L_x = L_msu (L_x, tmp, a);          // L_x -= tmp*a*2
+
+    exp = sub (30, exponent);
+    L_x = L_shr_r (L_x, exp);
+
+    return (L_x);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Word32 Pow2(            /* (o)  : result       (range: 0<=val<=0x7fffffff) */
+    Word16 exponent,    /* (i)  : Integer part.      (range: 0<=val<=30)   */
+    Word16 fraction,    /* (i)  : Fractional part.  (range: 0.0<=val<1.0)  */
+    Flag *pOverflow
+)
+{
+    Word16 exp, i, a, tmp;
+    Word32 L_x;
+
+    L_x = L_mult(fraction, 32, pOverflow);      /* L_x = fraction<<6    */
+
+    /* Extract b0-b16 of fraction */
+
+    i = ((Word16)(L_x >> 16)) & 31;             /* ensure index i is bounded */
+    a = (Word16)((L_x >> 1) & 0x7fff);
+
+    L_x = L_deposit_h(pow2_tbl[i]);             /* pow2_tbl[i] << 16       */
+
+    /* pow2_tbl[i] - pow2_tbl[i+1] */
+    tmp = sub(pow2_tbl[i], pow2_tbl[i + 1], pOverflow);
+    L_x = L_msu(L_x, tmp, a, pOverflow);        /* L_x -= tmp*a*2        */
+
+    exp = sub(30, exponent, pOverflow);
+    L_x = L_shr_r(L_x, exp, pOverflow);
+
+    return (L_x);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/pow2_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/pow2_tbl.cpp
new file mode 100644
index 0000000..e0183a6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/pow2_tbl.cpp
@@ -0,0 +1,163 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/pow2_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for log2_tbl[] used by the Pow2() function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 pow2_tbl[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
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] pow2.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp b/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp
new file mode 100644
index 0000000..9163623
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/pred_lt.cpp
@@ -0,0 +1,349 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/pred_lt.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Deleted variables listed in the Local Stores Needed/Modified
+          sections.
+
+ Description: Updated file per comments from Phase 2/3 review.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Fixed typecasting issue with TI C compiler. Updated copyright
+              year.
+
+ Description:
+ (1) Removed instance of static in the const table "inter_6"
+ (2) Changed Overflow from a global to a parameter passed via a pointer.
+ (3) Made numerous small changes to bring code more in line with PV standards.
+
+ Description:  For pred_ltp()
+              1. Eliminated unused include files.
+              2. Replaced array addressing by pointers
+              3. Eliminated math operations that unnecessary checked for
+                 saturation
+              4. Unrolled loops to speed up processing, use decrement loops,
+                 loaded into memory filter coefficient in linear order for
+                 faster execution in main loop.
+              5. Eliminated call to round by proper initialization
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pred_lt.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define UP_SAMP_MAX  6
+#define L_INTER10    (L_INTERPOL-1)
+#define FIR_SIZE     (UP_SAMP_MAX*L_INTER10+1)
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* 1/6 resolution interpolation filter  (-3 dB at 3600 Hz) */
+/* Note: the 1/3 resolution filter is simply a subsampled
+ *       version of the 1/6 resolution filter, i.e. it uses
+ *       every second coefficient:
+ *
+ *          inter_3l[k] = inter_6[2*k], 0 <= k <= 3*L_INTER10
+ */
+
+const Word16 inter_6_pred_lt[FIR_SIZE] =
+{
+    29443,
+    28346, 25207, 20449, 14701,  8693,  3143,
+    -1352, -4402, -5865, -5850, -4673, -2783,
+    -672,  1211,  2536,  3130,  2991,  2259,
+    1170,     0, -1001, -1652, -1868, -1666,
+    -1147,  -464,   218,   756,  1060,  1099,
+    904,   550,   135,  -245,  -514,  -634,
+    -602,  -451,  -231,     0,   191,   308,
+    340,   296,   198,    78,   -36,  -120,
+    -163,  -165,  -132,   -79,   -19,    34,
+    73,    91,    89,    70,    38,     0
+};
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Pred_lt_3or6
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    exc = buffer containing the excitation (Word16)
+    T0 = integer pitch lag (Word16)
+    frac = fraction of lag (Word16)
+    L_subfr = number of samples per subframe (Word16)
+    flag3 = flag to indicate the upsampling rate; if set, upsampling
+            rate is 3, otherwise, upsampling rate is 6 (Word16)
+
+    pOverflow = pointer to overflow (Flag)
+
+ Returns:
+    None
+
+ Outputs:
+    exc buffer contains the newly formed adaptive codebook excitation
+    pOverflow -> 1 if the add operation resulted in overflow
+
+ Global Variables Used:
+    inter_6_pred_lt = (1/6) resolution interpolation filter table (Word16)
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes the result of long term prediction with fractional
+ interpolation of resolution 1/3 or 1/6. (Interpolated past excitation).
+
+ The past excitation signal at the given delay is interpolated at
+ the given fraction to build the adaptive codebook excitation.
+ On return exc[0..L_subfr-1] contains the interpolated signal
+ (adaptive codebook excitation).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ pred_lt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Pred_lt_3or6 (
+    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 flag3      // input : if set, upsampling rate = 3 (6 otherwise)
+)
+{
+    Word16 i, j, k;
+    Word16 *pX0, *pX1, *pX2;
+    const Word16 *pC1, *pC2;
+    Word32 s;
+
+    pX0 = &exc[-T0];
+
+    frac = negate (frac);
+    if (flag3 != 0)
+    {
+      frac = shl (frac, 1);   // inter_3l[k] = inter_6[2*k] -> k' = 2*k
+    }
+
+    if (frac < 0)
+    {
+        frac = add (frac, UP_SAMP_MAX);
+        pX0--;
+    }
+
+    for (j = 0; j < L_subfr; j++)
+    {
+        pX1 = pX0++;
+        pX2 = pX0;
+        pC1 = &inter_6[frac];
+        pC2 = &inter_6[sub (UP_SAMP_MAX, frac)];
+
+        s = 0;
+        for (i = 0, k = 0; i < L_INTER10; i++, k += UP_SAMP_MAX)
+        {
+            s = L_mac (s, pX1[-i], pC1[k]);
+            s = L_mac (s, pX2[i], pC2[k]);
+        }
+
+        exc[j] = pv_round (s);
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Pred_lt_3or6(
+    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 flag3,     /* input : if set, upsampling rate = 3 (6 otherwise)  */
+    Flag  *pOverflow  /* output: if set, overflow occurred in this function */
+)
+{
+    register Word16 i;
+    register Word16 j;
+    register Word16 k;
+
+    Word16 *pX0;
+    Word16 *pX2;
+    Word16 *pX3;
+    Word16 *p_exc;
+    Word16 *pC1;
+    const Word16 *pC1_ref;
+    const Word16 *pC2_ref;
+
+    Word16 Coeff_1[(L_INTER10<<1)];
+
+    Word32 s1;
+    Word32 s2;
+    OSCL_UNUSED_ARG(pOverflow);
+
+    pX0 = &(exc[-T0]);
+
+    /* frac goes between -3 and 3 */
+
+    frac = -frac;
+
+    if (flag3 != 0)
+    {
+        frac <<= 1;   /* inter_3l[k] = inter_6[2*k] -> k' = 2*k */
+    }
+
+    if (frac < 0)
+    {
+        frac += UP_SAMP_MAX;
+        pX0--;
+    }
+
+    pC1_ref = &inter_6_pred_lt[frac];
+    pC2_ref = &inter_6_pred_lt[UP_SAMP_MAX-frac];
+
+
+    pC1 = Coeff_1;
+
+    k = 0;
+
+    for (i = L_INTER10 >> 1; i > 0; i--)
+    {
+        *(pC1++) = pC1_ref[k];
+        *(pC1++) = pC2_ref[k];
+        k += UP_SAMP_MAX;
+        *(pC1++) = pC1_ref[k];
+        *(pC1++) = pC2_ref[k];
+        k += UP_SAMP_MAX;
+
+    }
+
+    p_exc = exc;
+
+    for (j = (L_subfr >> 1); j != 0 ; j--)
+    {
+        pX0++;
+        pX2 = pX0;
+        pX3 = pX0++;
+
+        pC1 = Coeff_1;
+
+        s1  = 0x00004000L;
+        s2  = 0x00004000L;
+
+        for (i = L_INTER10 >> 1; i > 0; i--)
+        {
+            s2 += ((Word32) * (pX3--)) * *(pC1);
+            s1 += ((Word32) * (pX3)) * *(pC1++);
+            s1 += ((Word32) * (pX2++)) * *(pC1);
+            s2 += ((Word32) * (pX2)) * *(pC1++);
+            s2 += ((Word32) * (pX3--)) * *(pC1);
+            s1 += ((Word32) * (pX3)) * *(pC1++);
+            s1 += ((Word32) * (pX2++)) * *(pC1);
+            s2 += ((Word32) * (pX2)) * *(pC1++);
+
+        } /* for (i = L_INTER10>>1; i > 0; i--) */
+
+        *(p_exc++) = (Word16)(s1 >> 15);
+        *(p_exc++) = (Word16)(s2 >> 15);
+
+    } /* for (j = (L_subfr>>1); j != 0 ; j--) */
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf.cpp
new file mode 100644
index 0000000..5d96baa
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf.cpp
@@ -0,0 +1,144 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : q_plsf.c
+*      Purpose          : common part (init, exit, reset) of LSF quantization
+*                         module (rest in q_plsf_3.c and q_plsf_5.c)
+*
+********************************************************************************
+*/
+
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+
+#include <stdlib.h>
+
+#include "q_plsf.h"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+
+/*
+**************************************************************************
+*
+*  Function    : Q_plsf_init
+*  Purpose     : Allocates memory and initializes state variables
+*
+**************************************************************************
+*/
+Word16 Q_plsf_init(Q_plsfState **state)
+{
+    Q_plsfState* s;
+
+    if (state == (Q_plsfState **) NULL)
+    {
+        /* fprintf(stderr, "Q_plsf_init: invalid parameter\n"); */
+        return -1;
+    }
+    *state = NULL;
+
+    /* allocate memory */
+    if ((s = (Q_plsfState *) malloc(sizeof(Q_plsfState))) == NULL)
+    {
+        /* fprintf(stderr, "Q_plsf_init: can not malloc state structure\n"); */
+        return -1;
+    }
+
+    Q_plsf_reset(s);
+    *state = s;
+
+    return 0;
+}
+
+/*
+**************************************************************************
+*
+*  Function    : Q_plsf_reset
+*  Purpose     : Resets state memory
+*
+**************************************************************************
+*/
+Word16 Q_plsf_reset(Q_plsfState *state)
+{
+    Word16 i;
+
+    if (state == (Q_plsfState *) NULL)
+    {
+        /* fprintf(stderr, "Q_plsf_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    for (i = 0; i < M; i++)
+        state->past_rq[i] = 0;
+
+    return 0;
+}
+
+/*
+**************************************************************************
+*
+*  Function    : Q_plsf_exit
+*  Purpose     : The memory used for state memory is freed
+*
+**************************************************************************
+*/
+void Q_plsf_exit(Q_plsfState **state)
+{
+    if (state == NULL || *state == NULL)
+        return;
+
+    /* deallocate memory */
+    free(*state);
+    *state = NULL;
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp
new file mode 100644
index 0000000..2b30bf4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3.cpp
@@ -0,0 +1,1226 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/q_plsf_3.c
+ Funtions: Vq_subvec4
+           Test_Vq_subvec4
+           Vq_subvec3
+           Test_Vq_subvec3
+           Q_plsf_3
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Updated modules per Phase 2/3 review comments. Updated
+          Vq_subvec3 pseudo-code to reflect the new restructured code.
+
+ Description: Added setting of Overflow flag in inlined code.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header file of the math functions
+              used in the file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Fixed typecasting issue with TI C compiler.
+              2. Optimized IF stament in Vq_subvec3() function.
+              3. Updated copyright year.
+
+ Description: Removed redundancy in the Vq_subvec4 function.
+
+ Description: Updated to accept new parameter, Flag *pOverflow.
+
+ Description: Per review comments, added pOverflow flag description
+ to the input/outputs section.
+
+ Description: Corrected missed Overflow global variables -- changed to
+ proper pOverflow.
+
+ Description: Optimized all functions to further reduce clock cycle usage.
+              Updated copyright year.
+
+ Description: Added left shift by 1 in line 1050 of Q_plsf_3().
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the functions that perform the quantization of LSF
+ parameters with first order MA prediction and split by 3 vector
+ quantization (split-VQ).
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include <string.h>
+
+#include "q_plsf.h"
+#include "typedef.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "lsfwt.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+#define PAST_RQ_INIT_SIZE 8
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    /* Codebooks of LSF prediction residual */
+    extern const Word16 mean_lsf_3[];
+
+    extern const Word16 pred_fac_3[];
+
+    extern const Word16 dico1_lsf_3[];
+    extern const Word16 dico2_lsf_3[];
+    extern const Word16 dico3_lsf_3[];
+
+    extern const Word16 mr515_3_lsf[];
+    extern const Word16 mr795_1_lsf[];
+
+    extern const Word16 past_rq_init[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Vq_subvec4
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
+    dico = pointer to the quantization codebook (Q15) (const Word16)
+    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
+    dico_size = size of quantization codebook (Q0) (Word16)
+
+ Outputs:
+    buffer pointed to by lsf_r1 contains the selected vector
+    pOverflow -- pointer to Flag -- Flag set when overflow occurs
+
+ Returns:
+    index = quantization index (Q0) (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the quantization of a 4-dimensional subvector.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word16
+Vq_subvec4(             // o: quantization index,            Q0
+    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
+    Word16 * dico,      // i: quantization codebook,         Q15
+    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
+    Word16 dico_size)   // i: size of quantization codebook, Q0
+{
+    Word16 i, index = 0;
+    Word16 *p_dico, temp;
+    Word32 dist_min, dist;
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+    for (i = 0; i < dico_size; i++)
+    {
+        temp = sub (lsf_r1[0], *p_dico++);
+        temp = mult (wf1[0], temp);
+        dist = L_mult (temp, temp);
+
+        temp = sub (lsf_r1[1], *p_dico++);
+        temp = mult (wf1[1], temp);
+        dist = L_mac (dist, temp, temp);
+
+        temp = sub (lsf_r1[2], *p_dico++);
+        temp = mult (wf1[2], temp);
+        dist = L_mac (dist, temp, temp);
+
+        temp = sub (lsf_r1[3], *p_dico++);
+        temp = mult (wf1[3], temp);
+        dist = L_mac (dist, temp, temp);
+
+
+        if (L_sub (dist, dist_min) < (Word32) 0)
+        {
+            dist_min = dist;
+            index = i;
+        }
+    }
+
+    // Reading the selected vector
+
+    p_dico = &dico[shl (index, 2)];
+    lsf_r1[0] = *p_dico++;
+    lsf_r1[1] = *p_dico++;
+    lsf_r1[2] = *p_dico++;
+    lsf_r1[3] = *p_dico;
+
+    return index;
+
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 Vq_subvec4( /* o: quantization index,            Q0  */
+    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
+    const Word16 * dico,  /* i: quantization codebook,         Q15 */
+    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
+    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
+    Flag  *pOverflow      /* o : Flag set when overflow occurs     */
+)
+{
+    register Word16 i;
+    Word16 temp;
+    const Word16 *p_dico;
+    Word16 index = 0;
+    Word32 dist_min;
+    Word32 dist;
+
+    Word16 lsf_r1_0;
+    Word16 lsf_r1_1;
+    Word16 lsf_r1_2;
+    Word16 lsf_r1_3;
+
+    Word16 wf1_0;
+    Word16 wf1_1;
+    Word16 wf1_2;
+    Word16 wf1_3;
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+    lsf_r1_0 = lsf_r1[0];
+    lsf_r1_1 = lsf_r1[1];
+    lsf_r1_2 = lsf_r1[2];
+    lsf_r1_3 = lsf_r1[3];
+
+    wf1_0 = wf1[0];
+    wf1_1 = wf1[1];
+    wf1_2 = wf1[2];
+    wf1_3 = wf1[3];
+
+    for (i = 0; i < dico_size; i++)
+    {
+        temp = lsf_r1_0 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
+        dist = ((Word32) temp) * temp;
+
+        temp = lsf_r1_1 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
+        dist += ((Word32) temp) * temp;
+
+        temp = lsf_r1_2 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
+        dist += ((Word32) temp) * temp;
+
+        temp = lsf_r1_3 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_3) * temp) >> 15);
+        dist += ((Word32) temp) * temp;
+
+        if (dist < dist_min)
+        {
+            dist_min = dist;
+            index = i;
+        }
+    }
+
+    /* Reading the selected vector */
+
+    p_dico = dico + (index << 2);
+    *lsf_r1++ = *p_dico++;
+    *lsf_r1++ = *p_dico++;
+    *lsf_r1++ = *p_dico++;
+    *lsf_r1 = *p_dico;
+
+    return(index);
+
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Test_Vq_subvec4
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
+    dico = pointer to the quantization codebook (Q15) (const Word16)
+    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
+    dico_size = size of quantization codebook (Q0) (Word16)
+
+ Outputs:
+    buffer pointed to by lsf_r1 contains the selected vector
+    pOverflow -- pointer to Flag -- Flag set when overflow occurs
+
+ Returns:
+    index = quantization index (Q0) (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calls the static function Vq_subvec4. It is used for testing
+ purposes only
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+ CALL Vq_subvec4(lsf_r1 = lsf_r1
+                 dico = dico
+                 wf1 = wf1
+                 dico_size = dico_size)
+   MODIFYING(nothing)
+   RETURNING(index = tst_index4)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Test_Vq_subvec4(
+    Word16 * lsf_r1,
+    const Word16 * dico,
+    Word16 * wf1,
+    Word16 dico_size,
+    Flag   *pOverflow)
+{
+    Word16  tst_index4 = 0;
+
+    /*------------------------------------------------------------------------
+     CALL Vq_subvec4(lsf_r1 = lsf_r1
+                     dico = dico
+                     wf1 = wf1
+                     dico_size = dico_size)
+       MODIFYING(nothing)
+       RETURNING(index = index)
+    ------------------------------------------------------------------------*/
+    tst_index4 =
+        Vq_subvec4(
+            lsf_r1,
+            dico,
+            wf1,
+            dico_size,
+            pOverflow);
+
+    return(tst_index4);
+
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Vq_subvec3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
+    dico = pointer to the quantization codebook (Q15) (const Word16)
+    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
+    dico_size = size of quantization codebook (Q0) (Word16)
+    use_half = flag to indicate use of every second entry in the
+               codebook (Flag)
+
+ Outputs:
+    buffer pointed to by lsf_r1 contains the selected vector
+    pOverflow -- pointer to Flag -- Flag set when overflow occurs
+
+ Returns:
+    index = quantization index (Q0) (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the quantization of a 3 dimensional subvector.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word16
+Vq_subvec3(             // o: quantization index,            Q0
+    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
+    Word16 * dico,      // i: quantization codebook,         Q15
+    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
+    Word16 dico_size,   // i: size of quantization codebook, Q0
+    Flag use_half)      // i: use every second entry in codebook
+{
+    Word16 i, index = 0;
+    Word16 *p_dico, temp;
+    Word32 dist_min, dist;
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+    if (use_half == 0) {
+       for (i = 0; i < dico_size; i++)
+       {
+          temp = sub(lsf_r1[0], *p_dico++);
+          temp = mult(wf1[0], temp);
+          dist = L_mult(temp, temp);
+
+          temp = sub(lsf_r1[1], *p_dico++);
+          temp = mult(wf1[1], temp);
+          dist = L_mac(dist, temp, temp);
+
+          temp = sub(lsf_r1[2], *p_dico++);
+          temp = mult(wf1[2], temp);
+          dist = L_mac(dist, temp, temp);
+
+          if (L_sub(dist, dist_min) < (Word32) 0) {
+             dist_min = dist;
+             index = i;
+          }
+       }
+       p_dico = &dico[add(index, add(index, index))];
+    }
+    else
+    {
+       for (i = 0; i < dico_size; i++)
+       {
+          temp = sub(lsf_r1[0], *p_dico++);
+          temp = mult(wf1[0], temp);
+          dist = L_mult(temp, temp);
+
+          temp = sub(lsf_r1[1], *p_dico++);
+          temp = mult(wf1[1], temp);
+          dist = L_mac(dist, temp, temp);
+
+          temp = sub(lsf_r1[2], *p_dico++);
+          temp = mult(wf1[2], temp);
+          dist = L_mac(dist, temp, temp);
+
+          if (L_sub(dist, dist_min) < (Word32) 0)
+          {
+             dist_min = dist;
+             index = i;
+          }
+          p_dico = p_dico + 3; add(0,0);
+       }
+       p_dico = &dico[shl(add(index, add(index, index)),1)];
+    }
+
+
+    // Reading the selected vector
+    lsf_r1[0] = *p_dico++;
+    lsf_r1[1] = *p_dico++;
+    lsf_r1[2] = *p_dico++;
+
+    return index;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 Vq_subvec3( /* o: quantization index,            Q0  */
+    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
+    const Word16 * dico,  /* i: quantization codebook,         Q15 */
+    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
+    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
+    Flag use_half,        /* i: use every second entry in codebook */
+    Flag  *pOverflow)     /* o : Flag set when overflow occurs     */
+{
+    register Word16 i;
+    Word16 temp;
+
+    const Word16 *p_dico;
+
+    Word16 p_dico_index = 0;
+    Word16 index = 0;
+
+    Word32 dist_min;
+    Word32 dist;
+
+    Word16 lsf_r1_0;
+    Word16 lsf_r1_1;
+    Word16 lsf_r1_2;
+
+    Word16 wf1_0;
+    Word16 wf1_1;
+    Word16 wf1_2;
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+    lsf_r1_0 = lsf_r1[0];
+    lsf_r1_1 = lsf_r1[1];
+    lsf_r1_2 = lsf_r1[2];
+
+    wf1_0 = wf1[0];
+    wf1_1 = wf1[1];
+    wf1_2 = wf1[2];
+
+    if (use_half != 0)
+    {
+        p_dico_index = 3;
+    }
+
+    for (i = 0; i < dico_size; i++)
+    {
+        temp = lsf_r1_0 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
+        dist = ((Word32) temp) * temp;
+
+        temp = lsf_r1_1 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
+        dist += ((Word32) temp) * temp;
+
+        temp = lsf_r1_2 - (*p_dico++);
+        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
+        dist += ((Word32) temp) * temp;
+
+        if (dist < dist_min)
+        {
+            dist_min = dist;
+            index = i;
+        }
+
+        p_dico = p_dico + p_dico_index;
+    }
+
+    p_dico = dico + (3 * index);
+
+    if (use_half != 0)
+    {
+        p_dico += (3 * index);
+    }
+
+    /* Reading the selected vector */
+    *lsf_r1++ = *p_dico++;
+    *lsf_r1++ = *p_dico++;
+    *lsf_r1 = *p_dico;
+
+    return(index);
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Test_Vq_subvec3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
+    dico = pointer to the quantization codebook (Q15) (const Word16)
+    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
+    dico_size = size of quantization codebook (Q0) (Word16)
+    use_half = flag to indicate use of every second entry in the
+               codebook (Flag)
+
+ Outputs:
+    buffer pointed to by lsf_r1 contains the selected vector
+    pOverflow -- pointer to Flag -- Flag set when overflow occurs
+
+ Returns:
+    index = quantization index (Q0) (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calls the static function Vq_subvec3. It is used for testing
+ purposes only
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ CALL Vq_subvec3(lsf_r1 = lsf_r1
+                 dico = dico
+                 wf1 = wf1
+                 dico_size = dico_size
+                 use_half = use_half)
+   MODIFYING(nothing)
+   RETURNING(index = tst_index3)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Test_Vq_subvec3(
+    Word16 * lsf_r1,
+    const Word16 * dico,
+    Word16 * wf1,
+    Word16 dico_size,
+    Flag use_half,
+    Flag *pOverflow)
+{
+    Word16  tst_index3 = 0;
+
+    /*------------------------------------------------------------------------
+     CALL Vq_subvec3(lsf_r1 = lsf_r1
+                     dico = dico
+                     wf1 = wf1
+                     dico_size = dico_size
+                     use_half = use_half)
+       MODIFYING(nothing)
+       RETURNING(index = index)
+    ------------------------------------------------------------------------*/
+    tst_index3 =
+        Vq_subvec3(
+            lsf_r1,
+            dico,
+            wf1,
+            dico_size,
+            use_half,
+            pOverflow);
+
+    return(tst_index3);
+
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Q_plsf_3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to structures of type Q_plsfState (Q_plsfState)
+    mode = coder mode (enum)
+    lsp1 = pointer to the first LSP vector (Word16)
+    lsp1_q = pointer to the quantized first LSP vector (Word16)
+    indice = pointer to the quantization indices of 3 vectors (Word16)
+    pred_init_i = pointer to the index of the initial value for
+                  MA prediction in DTX mode (Word16)
+
+ Outputs:
+    lsp1_q points to a vector containing the new quantized LSPs
+    indice points to the new quantization indices of 3 vectors
+    pred_init_i points to the new initial index for MA prediction
+      in DTX mode
+    past_rq field of structure pointed to by st contains the current
+      quantized LSF parameters
+    pOverflow -- pointer to Flag -- Flag set when overflow occurs
+
+ Returns:
+    None
+
+ Global Variables Used:
+    pred_fac = table containing prediction factors (const Word16)
+    dico1_lsf = quantization table for split_MQ of 2 sets of LSFs
+                in a 20 ms frame (const Word16)
+    dico2_lsf = quantization table for split_MQ of 2 sets of LSFs
+                in a 20 ms frame (const Word16)
+    dico3_lsf = quantization table for split_MQ of 2 sets of LSFs
+                in a 20 ms frame (const Word16)
+    mr515_3_lsf = third codebook for MR475 and MR515 modes (const Word16)
+    mr795_1_lsf = first codebook for MR795 mode (const Word16)
+    mean_lsf = table of mean LSFs (const Word16)
+    past_rq_init = initalization table for MA predictor in DTX mode
+                   (const Word16)
+
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs quantization of LSF parameters with 1st order MA
+ prediction and split by 3 vector quantization (split-VQ)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Q_plsf_3(
+    Q_plsfState *st,    // i/o: state struct
+    enum Mode mode,     // i  : coder mode
+    Word16 *lsp1,       // i  : 1st LSP vector                      Q15
+    Word16 *lsp1_q,     // o  : quantized 1st LSP vector            Q15
+    Word16 *indice,     // o  : quantization indices of 3 vectors   Q0
+    Word16 *pred_init_i // o  : init index for MA prediction in DTX mode
+)
+{
+    Word16 i, j;
+    Word16 lsf1[M], wf1[M], lsf_p[M], lsf_r1[M];
+    Word16 lsf1_q[M];
+
+    Word32 L_pred_init_err;
+    Word32 L_min_pred_init_err;
+    Word16 temp_r1[M];
+    Word16 temp_p[M];
+
+    // convert LSFs to normalize frequency domain 0..16384
+
+    Lsp_lsf(lsp1, lsf1, M);
+
+    // compute LSF weighting factors (Q13)
+
+    Lsf_wt(lsf1, wf1);
+
+    // Compute predicted LSF and prediction error
+    if (test(), sub(mode, MRDTX) != 0)
+    {
+       for (i = 0; i < M; i++)
+       {
+          lsf_p[i] = add(mean_lsf[i],
+                         mult(st->past_rq[i],
+                              pred_fac[i]));
+          lsf_r1[i] = sub(lsf1[i], lsf_p[i]);
+      }
+    }
+    else
+    {
+       // DTX mode, search the init vector that yields
+       // lowest prediction resuidual energy
+       *pred_init_i = 0;
+       L_min_pred_init_err = 0x7fffffff; // 2^31 - 1
+       for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
+       {
+          L_pred_init_err = 0;
+          for (i = 0; i < M; i++)
+          {
+             temp_p[i] = add(mean_lsf[i], past_rq_init[j*M+i]);
+             temp_r1[i] = sub(lsf1[i],temp_p[i]);
+             L_pred_init_err = L_mac(L_pred_init_err, temp_r1[i], temp_r1[i]);
+          }  // next i
+
+
+          if (L_sub(L_pred_init_err, L_min_pred_init_err) < (Word32) 0)
+          {
+             L_min_pred_init_err = L_pred_init_err;
+             Copy(temp_r1, lsf_r1, M);
+             Copy(temp_p, lsf_p, M);
+             // Set zerom
+             Copy(&past_rq_init[j*M], st->past_rq, M);
+             *pred_init_i = j;
+          } // endif
+       } // next j
+    } // endif MRDTX
+
+    //---- Split-VQ of prediction error ----
+    if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
+    {   // MR475, MR515
+
+
+      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
+
+      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE/2, 1);
+
+      indice[2] = Vq_subvec4(&lsf_r1[6], mr515_3_lsf, &wf1[6], MR515_3_SIZE);
+
+    }
+    else if (sub (mode, MR795) == 0)
+    {   // MR795
+
+
+      indice[0] = Vq_subvec3(&lsf_r1[0], mr795_1_lsf, &wf1[0], MR795_1_SIZE, 0);
+
+      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
+
+      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
+
+    }
+    else
+    {   // MR59, MR67, MR74, MR102 , MRDTX
+
+
+      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
+
+      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
+
+      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
+
+    }
+
+
+    // Compute quantized LSFs and update the past quantized residual
+
+    for (i = 0; i < M; i++)
+    {
+        lsf1_q[i] = add(lsf_r1[i], lsf_p[i]);
+        st->past_rq[i] = lsf_r1[i];
+    }
+
+    // verification that LSFs has mimimum distance of LSF_GAP Hz
+
+    Reorder_lsf(lsf1_q, LSF_GAP, M);
+
+    //  convert LSFs to the cosine domain
+
+    Lsf_lsp(lsf1_q, lsp1_q, M);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Q_plsf_3(
+    Q_plsfState *st,    /* i/o: state struct                             */
+    enum Mode mode,     /* i  : coder mode                               */
+    Word16 *lsp1,       /* i  : 1st LSP vector                      Q15  */
+    Word16 *lsp1_q,     /* o  : quantized 1st LSP vector            Q15  */
+    Word16 *indice,     /* o  : quantization indices of 3 vectors   Q0   */
+    Word16 *pred_init_i,/* o  : init index for MA prediction in DTX mode */
+    Flag  *pOverflow    /* o : Flag set when overflow occurs             */
+)
+{
+    register Word16 i, j;
+    Word16 lsf1[M];
+    Word16 wf1[M];
+    Word16 lsf_p[M];
+    Word16 lsf_r1[M];
+    Word16 lsf1_q[M];
+
+    Word32 L_pred_init_err;
+    Word32 L_min_pred_init_err;
+    Word32 L_temp;
+    Word16 temp_r1[M];
+    Word16 temp_p[M];
+    Word16 temp;
+
+    /* convert LSFs to normalize frequency domain 0..16384 */
+
+    Lsp_lsf(
+        lsp1,
+        lsf1,
+        M,
+        pOverflow);
+
+    /* compute LSF weighting factors (Q13) */
+
+    Lsf_wt(
+        lsf1,
+        wf1,
+        pOverflow);
+
+    /* Compute predicted LSF and prediction error */
+    if (mode != MRDTX)
+    {
+        for (i = 0; i < M; i++)
+        {
+            temp = (Word16)((((Word32) st->past_rq[i]) *
+                             (*(pred_fac_3 + i))) >> 15);
+
+            *(lsf_p + i) = *(mean_lsf_3 + i) + temp;
+
+            *(lsf_r1 + i) = *(lsf1 + i) - *(lsf_p + i);
+        }
+    }
+    else
+    {
+        /* DTX mode, search the init vector that yields */
+        /* lowest prediction resuidual energy           */
+        *pred_init_i = 0;
+        L_min_pred_init_err = 0x7fffffff; /* 2^31 - 1 */
+
+        for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
+        {
+            L_pred_init_err = 0;
+            for (i = 0; i < M; i++)
+            {
+                *(temp_p + i) = *(mean_lsf_3 + i) + *(past_rq_init + j * M + i);
+
+                *(temp_r1 + i) = *(lsf1 + i) - *(temp_p + i);
+
+                L_temp = ((Word32) * (temp_r1 + i)) * *(temp_r1 + i);
+
+                L_pred_init_err = L_pred_init_err + (L_temp << 1);
+
+            }  /* next i */
+
+
+            if (L_pred_init_err < L_min_pred_init_err)
+            {
+                L_min_pred_init_err = L_pred_init_err;
+
+                memcpy(
+                    lsf_r1,
+                    temp_r1,
+                    M*sizeof(Word16));
+
+                memcpy(
+                    lsf_p,
+                    temp_p,
+                    M*sizeof(Word16));
+
+                /* Set zerom */
+                memcpy(
+                    st->past_rq,
+                    &past_rq_init[j*M],
+                    M*sizeof(Word16));
+
+                *pred_init_i = j;
+
+            } /* endif */
+        } /* next j */
+    } /* endif MRDTX */
+
+    /*---- Split-VQ of prediction error ----*/
+    if ((mode == MR475) || (mode == MR515))
+    {   /* MR475, MR515 */
+
+        *indice =
+            Vq_subvec3(
+                lsf_r1,
+                dico1_lsf_3,
+                wf1,
+                DICO1_SIZE,
+                0,
+                pOverflow);
+
+        *(indice + 1) =
+            Vq_subvec3(
+                lsf_r1 + 3,
+                dico2_lsf_3,
+                wf1 + 3,
+                DICO2_SIZE / 2,
+                1,
+                pOverflow);
+
+        *(indice + 2) =
+            Vq_subvec4(
+                lsf_r1 + 6,
+                mr515_3_lsf,
+                wf1 + 6,
+                MR515_3_SIZE,
+                pOverflow);
+
+    }
+    else if (mode == MR795)
+    {   /* MR795 */
+
+        *indice =
+            Vq_subvec3(
+                lsf_r1,
+                mr795_1_lsf,
+                wf1,
+                MR795_1_SIZE,
+                0,
+                pOverflow);
+
+        *(indice + 1) =
+            Vq_subvec3(
+                lsf_r1 + 3,
+                dico2_lsf_3,
+                wf1 + 3,
+                DICO2_SIZE,
+                0,
+                pOverflow);
+
+        *(indice + 2) =
+            Vq_subvec4(
+                lsf_r1 + 6,
+                dico3_lsf_3,
+                wf1 + 6,
+                DICO3_SIZE,
+                pOverflow);
+
+    }
+    else
+    {   /* MR59, MR67, MR74, MR102 , MRDTX */
+
+        *indice =
+            Vq_subvec3(
+                lsf_r1,
+                dico1_lsf_3,
+                wf1,
+                DICO1_SIZE,
+                0,
+                pOverflow);
+
+        *(indice + 1) =
+            Vq_subvec3(
+                lsf_r1 + 3,
+                dico2_lsf_3,
+                wf1 + 3,
+                DICO2_SIZE,
+                0,
+                pOverflow);
+
+        *(indice + 2) =
+            Vq_subvec4(
+                lsf_r1 + 6,
+                dico3_lsf_3,
+                wf1 + 6,
+                DICO3_SIZE,
+                pOverflow);
+
+    }
+
+
+    /* Compute quantized LSFs and update the past quantized residual */
+
+    for (i = 0; i < M; i++)
+    {
+        *(lsf1_q + i) = *(lsf_r1 + i) + *(lsf_p + i);
+        st->past_rq[i] = *(lsf_r1 + i);
+    }
+
+    /* verification that LSFs has mimimum distance of LSF_GAP Hz */
+
+    Reorder_lsf(
+        lsf1_q,
+        LSF_GAP,
+        M,
+        pOverflow);
+
+    /*  convert LSFs to the cosine domain */
+
+    Lsf_lsp(
+        lsf1_q,
+        lsp1_q,
+        M,
+        pOverflow);
+
+    return;
+
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf_3_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3_tbl.cpp
new file mode 100644
index 0000000..56c13e7
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf_3_tbl.cpp
@@ -0,0 +1,2096 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/q_plsf_3_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, q_plsf_3_tbl.tab
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "q_plsf_3_tbl.h"
+
+/*--------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : q_plsf_3.tab
+*      Purpose          : Table for routine LSF VQ.
+*      $Id $
+*
+********************************************************************************
+*/
+
+
+/* initalization table for MA predictor in dtx mode */
+const Word16 past_rq_init[80] =
+{
+    -258, -318, -439, -634, -656, -773, -711, -502, -268, -193,
+    -2,  125,  122,  -39,   -9,  105,  129,  283,  372,  575,
+    -277, -324, -197, -487, -445, -362, -292,  -27,  177,  543,
+    342,  517,  516,  130,   27, -104, -120, -140,  -74,  -56,
+    -564, -943, -1520, -965, -814, -526, -322,   -2,  159,  657,
+    -312, -284, -386, -597, -493, -526, -418, -229,  105,  449,
+    -557, -870, -1075, -919, -950, -752, -709, -316,   62,  486,
+    -314, -191, -203, -330, -160, -103,  -51,  131,  338,  515
+};
+
+
+const Word16 mean_lsf_3[10] =
+{
+    1546,
+    2272,
+    3778,
+    5488,
+    6972,
+    8382,
+    10047,
+    11229,
+    12766,
+    13714
+};
+
+
+const Word16 pred_fac_3[10] =
+{
+    9556,
+    10769,
+    12571,
+    13292,
+    14381,
+    11651,
+    10588,
+    9767,
+    8593,
+    6484
+};
+
+
+
+/* first codebook from IS641 */
+
+const Word16 dico1_lsf_3[DICO1_SIZE*3] =
+{
+    6, 82, -131,
+    154, -56, -735,
+    183, -65, -265,
+    9, -210, -361,
+    113, 718, 1817,
+    1010, 1214, 1573,
+    857, 1333, 2276,
+    827, 1568, 1933,
+    717, 1989, 2206,
+    838, 1172, 1823,
+    721, 1000, 2154,
+    286, 476, 1509,
+    -247, -531, 230,
+    147, -82, 569,
+    26, -177, -944,
+    -27, -273, 692,
+    -164, -264, -183,
+    224, 790, 1039,
+    899, 946, 601,
+    485, 771, 1150,
+    524, 677, 903,
+    -140, 375, 778,
+    410, 676, 429,
+    301, 530, 1009,
+    719, 646, 38,
+    226, 367, 40,
+    145, -45, -505,
+    290, 121, -121,
+    302, 127, 166,
+    -124, -383, -956,
+    -358, -455, -977,
+    715, 878, 894,
+    978, 923, 211,
+    477, 272, 64,
+    188, -78, 17,
+    -143, -65, 38,
+    643, 586, 621,
+    -134, -426, -651,
+    347, 545, 2820,
+    1188, 2726, 2442,
+    142, -80, 1735,
+    283, 130, 461,
+    -262, -399, -1145,
+    -411, 155, 430,
+    329, 375, 779,
+    53, -226, -139,
+    -129, -236, 1682,
+    285, 744, 1327,
+    738, 697, 1664,
+    312, 409, 266,
+    325, 720, 135,
+    1, 221, 453,
+    8, 203, 145,
+    299, 640, 760,
+    29, 468, 638,
+    103, 429, 379,
+    420, 954, 932,
+    1326, 1210, 1258,
+    704, 1012, 1152,
+    -166, -444, -266,
+    -316, -130, -376,
+    191, 1151, 1904,
+    -240, -543, -1260,
+    -112, 268, 1207,
+    70, 1062, 1583,
+    278, 1360, 1574,
+    -258, -272, -768,
+    19, 563, 2240,
+    -3, -265, 135,
+    -295, -591, -388,
+    140, 354, -206,
+    -260, -504, -795,
+    -433, -718, -1319,
+    109, 331, 962,
+    -429, -87, 652,
+    -296, 426, 1019,
+    -239, 775, 851,
+    489, 1334, 1073,
+    -334, -332, 25,
+    543, 1206, 1807,
+    326, 61, 727,
+    578, 849, 1405,
+    -208, -277, 329,
+    -152, 64, 669,
+    -434, -678, -727,
+    -454, -71, 251,
+    605, 480, 254,
+    -482, 11, 996,
+    -289, 395, 486,
+    722, 1049, 1440,
+    -30, -316, -786,
+    -106, -115, -619,
+    861, 1474, 1412,
+    1055, 1366, 1184,
+    812, 1237, 925,
+    42, -251, -576,
+    342, 141, -454,
+    -168, -80, 1359,
+    -342, -656, -1763,
+    100, 821, 725,
+    990, 747, 800,
+    332, 440, 568,
+    663, 379, 852,
+    112, 165, -369,
+    597, 910, 282,
+    -8, 834, 1281,
+    -352, 572, 695,
+    462, 2246, 1806,
+    345, 190, 1374,
+    416, 915, 2166,
+    168, -82, 280,
+    -516, -446, 840,
+    47, 533, 44,
+    -362, -711, -1143,
+    22, 193, 1472,
+    -85, 233, 1813,
+    -62, 579, 1504,
+    550, 944, 1749,
+    723, 650, 1148,
+    972, 884, 1395,
+    -425, 643, 0,
+    1000, 952, 1098,
+    249, 1446, 672,
+    -334, -87, 2172,
+    -554, 1882, 2672,
+    140, 1826, 1853,
+    920, 1749, 2590,
+    1076, 1933, 2038,
+    -137, -443, -1555,
+    1269, 1174, 468,
+    -493, -122, 1521,
+    -451, 1033, 1214,
+    482, 1695, 1118,
+    815, 649, 384,
+    -446, -692, 107,
+    -319, -605, -118,
+    -207, -505, 525,
+    -468, -12, 2736,
+    75, 1934, 1305,
+    880, 2358, 2267,
+    1285, 1575, 2004,
+    -48, -304, -1186,
+    -435, -461, -251,
+    -366, -404, -547,
+    -289, -605, -597,
+    -538, -810, -165,
+    -120, 3, 356,
+    639, 1241, 1502,
+    96, 177, 750,
+    -435, -585, -1174,
+    -356, 109, -79,
+    -485, 288, 2005,
+    9, 1116, 731,
+    880, 2134, 946,
+    -265, 1585, 1065,
+    1157, 1210, 843,
+    -498, -668, 431,
+    374, 321, -229,
+    1440, 2101, 1381,
+    449, 461, 1155,
+    -105, 39, -384,
+    -263, 367, 182,
+    -371, -660, 773,
+    -188, 1151, 971,
+    1333, 1632, 1435,
+    774, 1267, 1221,
+    -482, -832, -1489,
+    -237, -210, 860,
+    890, 1615, 1064,
+    472, 1062, 1192,
+    185, 1077, 989,
+    -568, -992, -1704,
+    -449, -902, -2043,
+    -142, -377, -458,
+    -210, -554, -1029,
+    -11, 1133, 2265,
+    -329, -675, -893,
+    -250, 657, 1187,
+    519, 1510, 1779,
+    520, 539, 1403,
+    527, 1421, 1302,
+    -563, -871, -1248,
+    -147, -463, 879,
+    -76, 2334, 2840,
+    563, 2573, 2385,
+    632, 1926, 2920,
+    719, 2023, 1840,
+    -545, -723, 1108,
+    129, -125, 884,
+    1417, 1632, 925,
+    -94, 1566, 1751,
+    -341, 1533, 1551,
+    591, 395, -274,
+    -76, 981, 2831,
+    153, 2985, 1844,
+    1032, 2565, 2749,
+    1508, 2832, 1879,
+    791, 1199, 538,
+    -190, -453, 1489,
+    -278, -548, 1158,
+    -245, 1941, 2044,
+    1024, 1560, 1650,
+    512, 253, 466,
+    -62, -323, 1151,
+    -473, -376, 507,
+    -433, 1380, 2162,
+    899, 1943, 1445,
+    134, 704, 440,
+    460, 525, -28,
+    -450, 279, 1338,
+    0, 971, 252,
+    -445, -627, -991,
+    -348, -602, -1424,
+    398, 712, 1656,
+    -107, 314, -178,
+    93, 2226, 2238,
+    518, 849, 656,
+    -462, -711, -447,
+    174, -34, 1191,
+    -119, 42, 1005,
+    -372, 274, 758,
+    1036, 2352, 1838,
+    675, 1724, 1498,
+    430, 1286, 2133,
+    -129, -439, 0,
+    -373, 800, 2144,
+    6, 1587, 2478,
+    478, 596, 2128,
+    -428, -736, 1505,
+    385, 178, 980,
+    139, 449, 1225,
+    -526, -842, -982,
+    145, 1554, 1242,
+    623, 1448, 656,
+    349, 1016, 1482,
+    31, -280, 415,
+    -316, 724, 1641,
+    360, 1058, 556,
+    -436, -358, 1201,
+    -355, 1123, 1939,
+    401, 1584, 2248,
+    -527, -1012, 355,
+    233, 238, 2233,
+    -550, -897, -639,
+    -365, -501, 1957,
+    389, 1860, 1621,
+    162, 1132, 1264,
+    -237, 1174, 1390,
+    -640, -411, 116,
+    -228, 1694, 2298,
+    1639, 2186, 2267,
+    562, 1273, 2658,
+    323, 338, 1774,
+    578, 1107, 852,
+    22, 594, 934,
+    -143, 718, 446
+};
+
+
+/* second codebook from IS641 */
+
+const Word16 dico2_lsf_3[DICO2_SIZE*3] =
+{
+    50, 71, -9,
+    -338, -698, -1407,
+    102, -138, -820,
+    -310, -469, -1147,
+    414, 67, -267,
+    1060, 814, 1441,
+    1548, 1360, 1272,
+    1754, 1895, 1661,
+    2019, 2133, 1820,
+    1808, 2318, 1845,
+    644, -93, 454,
+    858, 329, -136,
+    489, -258, -128,
+    -198, -745, -41,
+    -52, -265, -985,
+    346, 137, 479,
+    -1741, -748, -684,
+    -1163, -1725, -367,
+    -895, -1145, -784,
+    -488, -946, -968,
+    -85, -390, -725,
+    215, -340, -171,
+    1020, 916, 1969,
+    564, 179, 746,
+    662, 977, 1734,
+    887, 622, 914,
+    939, 856, 1165,
+    309, 688, 803,
+    917, 161, 570,
+    118, -20, -283,
+    -816, -42, 204,
+    -1228, -325, -462,
+    -963, -202, -143,
+    -988, -484, -361,
+    -702, -978, -477,
+    -302, -790, -1188,
+    -100, -786, -1088,
+    -1054, -947, -1684,
+    -202, -843, -782,
+    -1039, -1378, -901,
+    -624, -110, -85,
+    356, 213, -10,
+    -493, 364, 774,
+    425, 822, 479,
+    -83, 557, 520,
+    -992, -1560, -572,
+    -603, -741, -26,
+    -502, -638, -903,
+    209, 306, 147,
+    -316, -593, -596,
+    -85, -211, -225,
+    -918, -529, 117,
+    233, -439, -738,
+    1101, 751, 633,
+    1457, 1716, 1511,
+    1765, 1457, 910,
+    1122, 1156, 849,
+    1354, 868, 470,
+    -871, -1150, -1796,
+    -871, -861, -992,
+    -118, 155, 212,
+    -1051, -849, -606,
+    -1117, -1849, -2750,
+    -1019, -1427, -1869,
+    370, -184, -414,
+    959, 493, 104,
+    958, 1039, 543,
+    154, 653, 201,
+    1249, 507, 150,
+    663, 503, 230,
+    623, 777, 675,
+    659, 88, -110,
+    843, 244, 224,
+    382, 541, 302,
+    724, 433, 666,
+    1166, 734, 341,
+    -138, 20, -397,
+    -1183, -424, -46,
+    -321, -352, -124,
+    1333, 1021, 1080,
+    262, 366, 723,
+    922, 283, -551,
+    31, -636, -611,
+    -689, -697, -415,
+    -952, -779, -201,
+    -1329, -598, -359,
+    -953, -1285, 166,
+    493, 305, 221,
+    846, 703, 610,
+    840, 936, 774,
+    -723, -1324, -1261,
+    -357, -1025, -1388,
+    -1096, -1376, -365,
+    -1416, -1881, -608,
+    -1798, -1727, -674,
+    -545, -1173, -703,
+    678, 786, 148,
+    -123, 696, 1288,
+    644, 350, -10,
+    414, 614, 15,
+    137, 344, -211,
+    -814, -1512, -819,
+    -391, -930, -588,
+    47, -591, -898,
+    -909, -1097, -163,
+    -1272, -1167, -157,
+    -1464, -1525, -389,
+    -1274, -1188, -624,
+    671, 213, 454,
+    124, -274, -525,
+    -729, -496, -152,
+    -1344, 122, 135,
+    -2905, -589, -394,
+    -1728, 441, -50,
+    1476, 904, 787,
+    316, 236, -440,
+    -347, 217, 413,
+    -911, -917, 121,
+    -455, -932, 202,
+    -92, -465, -375,
+    488, 390, 474,
+    876, 729, 316,
+    -1815, -1312, -669,
+    87, 962, 432,
+    563, -249, -1058,
+    250, 285, 1105,
+    1141, 427, 696,
+    -1038, -1664, -1582,
+    -948, 346, 160,
+    -309, -272, -858,
+    670, 624, 1250,
+    -944, -408, -666,
+    -606, -320, -384,
+    -492, 230, 65,
+    334, -50, -16,
+    -16, -690, -1397,
+    1791, 1716, 1399,
+    2478, 2063, 1404,
+    1245, 1471, 1426,
+    -382, -1037, -2,
+    173, -398, 1145,
+    1491, 2024, 1801,
+    772, 1274, 1506,
+    1429, 1735, 2001,
+    1079, 1218, 1273,
+    -1154, -1851, -1329,
+    -808, -1133, -1096,
+    -451, -1033, -1722,
+    65, 578, -84,
+    -1476, -2434, -1778,
+    -765, -1366, -494,
+    -218, -594, -931,
+    337, -236, 562,
+    2357, 2662, 1938,
+    1489, 1276, 874,
+    189, 358, 374,
+    -1519, -2281, -2346,
+    -967, -1271, -2095,
+    -628, -1188, -1542,
+    1661, 1043, 546,
+    565, 1061, 732,
+    -64, -836, -434,
+    -436, -96, 203,
+    1078, 1216, 1636,
+    907, 1534, 986,
+    326, 965, 845,
+    142, -84, 197,
+    470, 2379, 1570,
+    1133, 470, 1214,
+    395, 1376, 1200,
+    1125, 1042, 348,
+    -543, -1234, -376,
+    -215, -181, 481,
+    -1947, -1621, -210,
+    -750, -1185, 390,
+    29, -399, 27,
+    820, 1236, 755,
+    695, 979, 409,
+    -174, 1197, 1035,
+    912, 1356, 1846,
+    -992, -1437, 484,
+    -1485, -1700, 208,
+    -412, 1204, 1432,
+    -271, 896, 1144,
+    -416, 1777, 1434,
+    -1696, -2644, -204,
+    -1789, -1551, 1033,
+    -1656, -1559, 1303,
+    -1253, -1589, 1081,
+    -669, -1095, -66,
+    -682, 320, -345,
+    659, 305, 1069,
+    -1292, -804, -19,
+    -1635, -1291, 29,
+    -1683, -497, 71,
+    -287, -7, -100,
+    -494, -962, -237,
+    852, 1881, 1740,
+    -1217, -1387, 227,
+    -660, 302, 373,
+    96, 1087, 1257,
+    -1074, -1669, 160,
+    485, 2076, 1798,
+    -934, -220, 552,
+    -596, -612, 237,
+    336, 1720, 879,
+    643, 629, 434,
+    1267, 522, 1633,
+    15, 244, -441,
+    1475, 717, 184,
+    1819, 1590, 1709,
+    988, 261, 937,
+    2093, 2345, 1520,
+    2139, 1858, 1606,
+    -577, -579, -1203,
+    -956, 135, -488,
+    -464, 51, -338,
+    -629, -348, -723,
+    1146, 2073, 1442,
+    2192, 1466, 911,
+    -1444, -1572, -2278,
+    1400, 710, 1297,
+    1335, 633, 928,
+    1434, 2194, 2594,
+    2422, 2204, 1881,
+    982, 2242, 1854,
+    380, 792, 1145,
+    -63, -539, 414,
+    -252, -964, -314,
+    -1261, -683, -780,
+    -831, -526, -1005,
+    -1666, -1135, -424,
+    -1611, -452, -299,
+    1268, 1048, 642,
+    1147, 853, 856,
+    -675, -336, 139,
+    2268, 1343, 1418,
+    29, 768, 797,
+    -1224, 423, 564,
+    -1318, -1082, 245,
+    -1302, -812, 573,
+    -1298, -1617, 646,
+    -968, 834, 723,
+    993, 1652, 2027,
+    -191, -817, 432,
+    662, 60, 198,
+    626, 997, 1330,
+    1648, 1963, 1289,
+    -1597, -93, -45,
+    -1088, 37, -84,
+    1653, 2607, 2337,
+    1065, 2040, 2377,
+    1139, 2326, 2118,
+    859, 357, 1510,
+    664, 1227, 1099,
+    479, 1360, 912,
+    1897, 1754, 2019,
+    1168, 1909, 1784,
+    399, 34, 256,
+    -593, -304, -1053,
+    547, 1694, 1407,
+    647, -99, -341,
+    1492, 1647, 1190,
+    38, -644, -212,
+    395, 846, 222,
+    -704, -765, -716,
+    -724, -1964, -2804,
+    -150, 291, -82,
+    1233, 1459, 1007,
+    -140, -155, 153,
+    439, 297, 1568,
+    -1529, -410, -636,
+    1536, 455, -237,
+    -1328, -139, -260,
+    531, 554, 868,
+    269, 1264, 606,
+    -233, 883, 463,
+    742, 600, -120,
+    -73, 421, 212,
+    -439, -58, 804,
+    -1286, -1241, 728,
+    294, -490, 50,
+    -591, -905, -1254,
+    42, -687, 147,
+    -25, 273, 596,
+    -311, 1213, 601,
+    -754, 849, 584,
+    429, 607, 587,
+    -602, -166, 461,
+    -796, -823, 777,
+    1380, 910, 1755,
+    119, 1417, 972,
+    -219, -880, -1596,
+    -1049, -1010, 438,
+    -713, -1379, 78,
+    0, -447, -1179,
+    -1136, -1319, -1573,
+    2248, 1767, 1309,
+    946, 1583, 1432,
+    1150, 482, 436,
+    -469, -1108, 618,
+    -447, -966, 1088,
+    -1252, -1515, -114,
+    -1104, -2008, -579,
+    210, 613, 497,
+    -1975, -1437, 642,
+    -1269, -856, 1011,
+    -1646, -1185, 1063,
+    -1555, -672, 1204,
+    -1692, -1114, 623,
+    -979, -1326, -1277,
+    539, -147, 894,
+    -1354, -897, -434,
+    888, 475, 428,
+    153, -384, 338,
+    -1492, -511, 359,
+    -974, -1115, -470,
+    105, -550, 677,
+    -937, -1145, 877,
+    380, -260, 210,
+    1685, 924, 1256,
+    1775, 1190, 1095,
+    1419, 631, 533,
+    627, 299, -347,
+    -411, -534, 647,
+    -650, 29, -595,
+    -378, -1367, 1563,
+    1402, 1121, 1465,
+    1089, 1410, 648,
+    -2096, -1090, -6,
+    311, -194, -869,
+    -639, -831, 416,
+    -1162, -1224, 1349,
+    -1247, -941, 1813,
+    -2193, -1987, 453,
+    -619, -1367, -956,
+    -1606, -1972, -1507,
+    -1175, -1057, -1104,
+    -377, 601, 201,
+    1876, 825, 374,
+    -430, -1323, 29,
+    -1397, -1249, -1331,
+    -1007, -1504, 960,
+    -1401, -2009, 197,
+    -1379, -1949, -236,
+    -1077, 123, 422,
+    615, 1269, 546,
+    -306, 1526, 904,
+    1194, 1788, 1177,
+    -626, -884, -1526,
+    199, 766, 1504,
+    -1065, 862, 197,
+    -1034, -1773, -887,
+    -800, 145, 599,
+    -1134, -519, 626,
+    -1205, -1926, 500,
+    -910, -1041, -1395,
+    -1476, -1567, -969,
+    -523, 842, 34,
+    1794, 646, 862,
+    -1207, -1888, -1002,
+    -78, -9, -672,
+    1044, 759, 80,
+    -600, 1139, 1019,
+    57, 2000, 1422,
+    -833, 1414, 1121,
+    -1202, 1630, 1260,
+    -461, 1420, 1244,
+    1537, 975, 253,
+    -283, 324, -359,
+    599, -195, 106,
+    588, 62, -587,
+    -757, 645, 205,
+    51, 1201, 758,
+    -1209, 673, -390,
+    -624, 1581, 941,
+    -151, 1023, 735,
+    2820, 1301, 690,
+    -302, 524, -99,
+    -900, -1588, -1189,
+    1084, 251, 238,
+    2014, 1792, 1010,
+    1245, 1633, 1741,
+    -1227, -1540, -1208,
+    -621, 456, -109,
+    40, -65, 788,
+    -805, -699, -1350,
+    -583, 904, 832,
+    -801, 532, 594,
+    1972, 1408, 1351,
+    -1177, -1880, -2114,
+    -773, 568, 948,
+    -1015, 1079, 1260,
+    -1111, 482, -130,
+    1778, 1044, 780,
+    -1491, 245, 912,
+    -316, -1141, -917,
+    -536, -1442, -2346,
+    -785, -1546, -1988,
+    -2003, 257, 909,
+    -1849, -633, -1209,
+    -1538, -1918, -1054,
+    1606, 2239, 1576,
+    -567, -1500, -1544,
+    -1279, 195, 1369,
+    -817, 293, 1219,
+    -525, 630, 1197,
+    -1698, -2425, -1840,
+    -303, 731, 747,
+    -1169, -251, 269,
+    -950, -75, 1684,
+    -1182, -453, 1005,
+    -1599, 585, 378,
+    -2075, -571, -427,
+    -529, -1159, -1171,
+    -283, -205, -564,
+    -796, 1246, 717,
+    2277, 927, 539,
+    -454, 559, 440,
+    -717, 1460, 1615,
+    -1030, 1052, 1610,
+    -1169, -138, 847,
+    226, 39, -612,
+    -1251, -106, -729,
+    -651, 968, 1302,
+    -714, -636, 1727,
+    353, 1069, 410,
+    -798, -156, 1099,
+    -574, 918, 446,
+    -1310, 1012, 466,
+    1408, 1591, 765,
+    1429, 1380, 1757,
+    1949, 1956, 2378,
+    1578, 2047, 2148,
+    916, 98, -7,
+    1893, 1418, 2141,
+    348, 1405, 1579,
+    152, 1134, 1801,
+    -267, 154, 1395,
+    -1166, 469, 1054,
+    -1142, -405, -1073,
+    -1341, -2264, -1581,
+    -364, 869, 1706,
+    -1162, 549, 1550,
+    -1225, -1932, -1666,
+    -1485, -1977, -2055,
+    -1727, -906, -98,
+    -1897, 233, 1492,
+    892, 108, -331,
+    -1728, -1170, -1700,
+    -1060, 1980, 1790,
+    -1070, -1741, -1909,
+    -11, 1539, 1317,
+    -1600, 94, 497,
+    421, 443, -197,
+    -1578, -349, -994,
+    -599, -539, 1140,
+    -965, -1419, -129,
+    -1341, 175, -447,
+    -375, 1311, 2055,
+    -371, -650, -307,
+    -1073, 605, 365,
+    -2057, -113, 430,
+    652, 914, 967,
+    -1012, -1586, -2323,
+    1505, 1248, 559,
+    262, -486, -401,
+    -1727, 1342, 1546,
+    50, 56, 432,
+    -330, 119, -604,
+    -1517, -1080, -810,
+    946, 1127, 1055,
+    -1400, -1703, -1712,
+    -1270, -704, -1317,
+    807, 1821, 1143,
+    2760, 1606, 2171,
+    1120, 409, -150,
+    -147, 404, 959,
+    2439, 1911, 2189,
+    -906, -141, -866,
+    -904, -142, -458,
+    -557, -708, -1679,
+    -830, -1431, -1583,
+    -1842, -1346, -1086,
+    -1604, -272, 915,
+    -1196, 772, 1056,
+    -638, -1234, -1897,
+    -500, -81, -822,
+    -1289, -1613, -735,
+    -117, 785, 168,
+    -1090, 1133, 922,
+    -1096, -746, 1384,
+    287, -547, -1063,
+    -1376, -2201, -1204,
+    -2176, -1570, -1757,
+    -1511, -2241, -771,
+    -1737, 1099, 830,
+    -1588, 724, 1243,
+    -1542, 693, 805,
+    -1690, -240, 1665,
+    -1700, -4, -668,
+    2149, 816, 1042,
+    -818, -1841, 22,
+    -764, -507, 449,
+    -1151, -617, 289,
+    -843, -1596, -240,
+    498, -234, -657,
+    -752, 480, 1678,
+    -319, -481, 193,
+    -811, 171, -119,
+    -2128, -202, -848,
+    1717, 1140, 1700
+};
+
+
+/* third codebook from IS641 */
+
+const Word16 dico3_lsf_3[DICO3_SIZE*4] =
+{
+    67, -17, 66, -12,
+    -1690, -581, -104, -272,
+    -1076, -1186, -1845, -376,
+    -1140, -926, -420, -58,
+    -259, -656, -1134, -553,
+    1788, 1227, 455, 129,
+    462, 441, -240, -528,
+    840, 514, 130, -75,
+    1114, 623, 153, 216,
+    1068, 564, -6, -276,
+    1119, 727, 190, -68,
+    704, 306, 119, -264,
+    329, 61, -100, 156,
+    364, 123, 183, -208,
+    -171, -123, 220, -65,
+    -306, -62, 402, 17,
+    -660, -938, -266, 0,
+    385, 235, 276, 285,
+    320, 268, -336, -200,
+    -724, 17, -84, 381,
+    -544, 429, 494, 519,
+    -117, 288, 304, 329,
+    643, 157, 701, 508,
+    1200, 625, 796, 608,
+    998, 421, 492, 632,
+    1204, 780, 446, 132,
+    1257, 844, 547, 449,
+    829, 658, 541, 470,
+    1132, 1258, 918, 639,
+    547, 51, 423, 279,
+    9, 392, 83, 94,
+    542, 543, 229, -147,
+    -198, 129, 194, -185,
+    -863, -1321, -302, 30,
+    -597, -629, -19, 114,
+    -900, -1081, 466, 353,
+    -1483, -1573, 15, -143,
+    -1708, -2059, -751, 196,
+    -1876, -2067, -642, -258,
+    -2335, -1470, -450, -564,
+    -584, -186, -872, -414,
+    -1805, -988, -1125, -1310,
+    -726, -1129, 28, 169,
+    -1039, -864, -718, -246,
+    484, 36, -233, -49,
+    265, 67, 289, 467,
+    178, 543, 810, 540,
+    84, 282, 672, 703,
+    -975, -777, 129, 287,
+    -938, -227, 955, 595,
+    -1617, -289, 836, 649,
+    -1847, -215, 1106, 718,
+    -2034, -1085, 650, 440,
+    -2101, -529, 907, 575,
+    -2011, -336, 670, 204,
+    -2389, -692, 360, 137,
+    -2156, -2204, -9, 280,
+    -266, 119, 39, 193,
+    78, -59, -120, 226,
+    -975, -858, -781, -1095,
+    -619, -413, -451, -842,
+    -1216, -1321, -813, -883,
+    -1376, -1615, -394, -428,
+    -737, -1113, -549, -790,
+    -880, -975, -967, -642,
+    -985, -886, -1273, -1361,
+    -473, -804, -1401, -1407,
+    160, -265, -919, -275,
+    -248, -250, -718, -380,
+    97, -103, -375, -229,
+    -415, -193, -135, -555,
+    628, 361, 119, 216,
+    579, 364, 391, 209,
+    634, 522, -154, -148,
+    526, 389, 170, 33,
+    105, 267, 64, 380,
+    -1503, -1000, -30, -369,
+    -1070, 58, 647, 223,
+    -1520, -291, 621, 307,
+    -1531, 156, 762, 404,
+    -2029, 141, 734, 499,
+    -1849, -650, 306, 512,
+    -187, -104, -59, 438,
+    134, -230, 156, -186,
+    -61, -260, -16, 10,
+    -569, -3, -421, -297,
+    -1725, -521, -346, 178,
+    -1362, -59, -44, 157,
+    -2146, -461, -470, -349,
+    -2170, -1, -369, -121,
+    -1579, -373, -900, -1015,
+    -1117, -591, -613, -784,
+    -561, 122, -75, -449,
+    -4, -171, -123, -372,
+    192, 168, -76, -132,
+    252, -107, 340, 210,
+    392, 509, 272, 181,
+    -109, 145, 218, 119,
+    -416, -263, 485, 265,
+    -181, -8, -286, 226,
+    -244, -218, 69, -290,
+    -158, 191, -1, -64,
+    -592, -90, 213, -96,
+    255, 435, 178, -80,
+    -369, -18, -33, -80,
+    -42, 415, 140, -222,
+    1143, 651, 649, 329,
+    767, 556, 249, 235,
+    948, 413, 442, 279,
+    141, 339, 356, 557,
+    -470, -170, 99, 237,
+    -569, -800, 352, 565,
+    282, 473, 470, 332,
+    -199, -690, -1284, -917,
+    -193, -426, -800, -1122,
+    -26, -371, -490, -193,
+    637, 595, 519, 330,
+    408, -115, 79, 12,
+    477, 87, -103, -376,
+    -666, -347, -277, -291,
+    -510, -481, 169, 297,
+    -829, -738, -205, -171,
+    -320, -540, 328, 283,
+    -859, -958, 442, -2,
+    556, 686, 130, 56,
+    1383, 1012, 755, 427,
+    612, 741, 628, 553,
+    -339, -796, 134, 277,
+    -633, -1085, -2, -246,
+    -880, -1035, -1607, -1064,
+    -994, -474, -1138, -488,
+    -414, -795, 73, -206,
+    -8, -139, 439, 204,
+    -176, -578, 23, 131,
+    -269, -757, -191, 245,
+    -109, -338, 112, 316,
+    120, -406, -118, 611,
+    -180, -186, -645, 115,
+    -173, 34, -518, -489,
+    -151, 61, -583, -844,
+    220, -138, -681, -1020,
+    391, -17, -598, -321,
+    157, -295, 129, 155,
+    -926, -875, -987, 285,
+    241, -83, -125, -125,
+    620, 597, 432, 92,
+    393, 78, 409, 61,
+    -393, -739, -413, -748,
+    83, 54, 361, 27,
+    -1084, 130, -337, -694,
+    -1565, 297, 318, -19,
+    -1873, 36, 51, -317,
+    -2323, -246, 231, -84,
+    -2306, -783, 40, -179,
+    -2233, -930, -474, -462,
+    -754, -86, -288, -626,
+    -2411, -455, -63, 171,
+    -1099, -1094, -26, -143,
+    -1193, -455, -406, -381,
+    -605, -210, -96, -51,
+    -580, -476, -276, -15,
+    -1195, -634, -1203, -881,
+    -378, -221, -669, -952,
+    594, 178, -403, -676,
+    763, 327, 601, 290,
+    172, 300, 203, 157,
+    -56, -336, 356, 24,
+    -228, -296, -259, -29,
+    -186, 263, 416, 14,
+    -353, 373, -12, -216,
+    257, 96, 174, 57,
+    -1526, -616, -954, -499,
+    -497, -152, -333, 125,
+    105, 200, 179, -97,
+    -331, -224, 765, 697,
+    760, 256, 301, 59,
+    455, -85, 204, 288,
+    -514, 240, 251, -109,
+    256, 417, -34, -413,
+    101, 430, 384, 156,
+    -31, -10, 206, 426,
+    589, 145, 143, 71,
+    808, 906, 333, 349,
+    986, 938, 589, 331,
+    1300, 824, 187, 509,
+    1062, 653, 379, 466,
+    1462, 937, 401, 274,
+    787, 861, 265, 2,
+    609, 553, 28, 305,
+    926, 340, 106, 386,
+    241, -267, -147, 225,
+    -178, -534, 347, 502,
+    -643, -381, 397, 30,
+    -651, -733, -435, 398,
+    -407, -726, -484, -248,
+    -789, -914, -438, -476,
+    -498, -390, 75, -295,
+    -964, -590, -606, 150,
+    -121, -49, -155, -78,
+    935, 550, 389, 38,
+    -321, 127, 424, 315,
+    -285, -113, 283, 259,
+    658, 203, 322, 486,
+    903, 505, 748, 417,
+    611, 423, 555, 512,
+    239, -83, -578, -19,
+    -339, -731, 349, 13,
+    -934, -1399, -114, -360,
+    107, 692, 182, 90,
+    -1243, -1538, -1551, -725,
+    -568, -903, -1363, -525,
+    -517, -853, -861, -1004,
+    -168, -690, -835, 63,
+    -137, -556, -547, 144,
+    -286, -817, 485, 319,
+    -147, -408, 526, 246,
+    -347, -434, 297, -28,
+    -290, -471, -1110, -1285,
+    -460, -359, -988, -794,
+    1347, 1299, 690, 523,
+    1216, 1068, 1094, 757,
+    825, 1140, 752, 494,
+    1252, 1365, 1195, 898,
+    521, 1053, 532, 432,
+    -334, -216, -313, -263,
+    -160, 52, -472, -155,
+    127, 136, -380, 44,
+    851, 410, -162, -489,
+    123, -255, -796, -667,
+    1090, 917, 789, 493,
+    1397, 1197, 558, 202,
+    -51, -118, -342, -701,
+    83, 108, -42, -441,
+    61, 95, 287, 256,
+    -27, 89, 524, 531,
+    351, 227, 592, 545,
+    697, 155, -164, 307,
+    638, 274, -489, -50,
+    754, 240, -166, -124,
+    -116, -579, -1212, -63,
+    190, -295, -1040, -1296,
+    147, -376, -177, -113,
+    841, 1241, 1051, 668,
+    2, 293, 551, 304,
+    -1096, -953, -248, 376,
+    -750, -965, 87, 516,
+    -275, -516, 689, 391,
+    -379, -643, 876, 594,
+    -390, -1013, -645, 573,
+    -107, -568, -689, -826,
+    -1025, -27, -328, -203,
+    861, 749, 548, 233,
+    -1660, -1043, 451, 108,
+    -660, -620, 430, 236,
+    21, -396, -1158, -631,
+    1372, 1298, 967, 577,
+    1125, 1125, 589, 454,
+    -323, -865, -467, 153,
+    -468, -699, -804, -509,
+    -392, -718, -204, -35,
+    -603, -1093, -567, -162,
+    -505, -1004, -102, 350,
+    219, 224, 423, 252,
+    395, 591, 608, 363,
+    -746, -96, 373, 172,
+    171, 295, 714, 339,
+    233, 77, 107, 277,
+    157, 153, -499, -356,
+    1547, 1073, 576, 494,
+    -292, -339, -504, -592,
+    -903, -72, -619, -481,
+    -1594, -1117, -567, -254,
+    -793, -507, -564, -291,
+    -492, -532, 502, 560,
+    -382, 427, 600, 230,
+    -227, 477, 251, 75,
+    285, 842, 813, 476,
+    -1310, -1333, 186, 377,
+    -587, -917, 643, 381,
+    -1186, -553, 411, 82,
+    -1127, -820, -174, -540,
+    -604, 119, 543, 205,
+    -380, 657, 909, 567,
+    112, -298, -374, 114,
+    -857, -251, 56, 159,
+    401, 345, -34, -140,
+    -111, -607, 41, 614,
+    355, -114, -77, 474,
+    578, 56, 1450, 924,
+    1098, 1420, 741, 400,
+    246, 22, 588, 313,
+    -121, 327, 831, 472,
+    -1138, -608, 856, 552,
+    -1241, -1072, 638, 600,
+    -358, 254, -333, -303,
+    -646, 739, 358, 74,
+    1226, 1671, 1221, 849,
+    2241, 1624, 983, 636,
+    1841, 1477, 749, 384,
+    350, 263, 87, 128,
+    -1902, -941, -144, -64,
+    -1734, -255, 288, -31,
+    -2644, -1238, 366, 235,
+    -1643, -1092, -1344, -304,
+    -541, -1075, -1116, 123,
+    -1178, -252, -816, -180,
+    -1016, 533, 565, 233,
+    -487, -430, -188, 334,
+    867, 1236, 534, 171,
+    -1590, -1607, 635, 630,
+    -2196, 310, 924, 412,
+    -2358, -328, 956, 529,
+    -2639, -377, 630, 278,
+    -2602, 317, 799, 299,
+    -2406, 133, 340, 31,
+    -2156, -1468, 131, 125,
+    -1184, -490, -139, 46,
+    -744, 447, 891, 564,
+    67, -451, 646, 604,
+    -553, -429, -876, 396,
+    162, -66, 1305, 915,
+    479, 579, 1088, 794,
+    450, 278, 566, 324,
+    -1057, -154, 148, -177,
+    -2545, 168, 1070, 592,
+    -2351, -42, 819, 345,
+    -2344, -707, 721, 250,
+    -2175, -1497, -309, 122,
+    -78, -73, 120, 173,
+    -4, 262, -263, -261,
+    -431, -64, -405, -732,
+    -2609, 116, -83, -193,
+    -1525, -944, -477, -725,
+    -508, 307, 170, 172,
+    832, 417, 832, 686,
+    -225, 177, 894, 818,
+    -482, -389, 1279, 1039,
+    -383, 201, -350, 40,
+    730, 635, 226, 526,
+    503, 462, 338, 398,
+    535, 714, 40, -282,
+    1482, 1471, 1085, 731,
+    1561, 1072, 909, 693,
+    1419, 1282, 889, 879,
+    1153, 728, 1186, 840,
+    -226, 1130, 949, 689,
+    -494, -986, -1556, -128,
+    -568, -721, -713, -26,
+    317, 524, 70, 135,
+    -405, -865, -1766, -652,
+    -174, -801, 885, 773,
+    -153, -91, 1099, 751,
+    -506, -1149, 853, 646,
+    241, 782, 519, 539,
+    1853, 1700, 1101, 684,
+    -1249, -1486, -464, 188,
+    -893, -1409, -1312, -341,
+    -135, 438, -175, 18,
+    1111, 976, 319, 208,
+    -1430, -1768, 83, 458,
+    -530, -1000, 307, 129,
+    -840, -15, -29, -356,
+    -911, -924, -1147, -242,
+    -119, -528, 127, -133,
+    -761, -765, 190, -83,
+    -315, 895, 522, 231,
+    -222, 102, -63, -428,
+    316, 699, 379, 70,
+    25, 716, 314, -108,
+    507, 874, 566, 238,
+    108, 941, 519, 195,
+    425, -60, -427, 257,
+    139, -103, -630, 446,
+    334, 370, 412, 48,
+    -172, -690, -283, 557,
+    187, -286, 158, 483,
+    140, 270, -344, -631,
+    924, 579, -116, 132,
+    142, 466, -68, -64,
+    230, -145, -302, -542,
+    -803, -912, 1018, 737,
+    -773, 1015, 630, 297,
+    -2596, 95, 445, 336,
+    -2122, 491, 510, 191,
+    -1253, 161, -2, -324,
+    -1450, -633, -712, -105,
+    -842, -254, -411, 100,
+    -640, -290, 1010, 763,
+    -650, 313, 1169, 730,
+    140, 505, 1030, 766,
+    772, 287, 1067, 823,
+    495, 749, 305, 323,
+    -164, 462, 78, 399,
+    -342, -874, 69, 597,
+    -16, 620, 621, 337,
+    -138, -444, -265, 218,
+    84, -450, 953, 666,
+    -222, -803, 541, 604,
+    -921, -1376, 244, 116,
+    -841, -723, 630, 588,
+    140, 663, 294, 368,
+    935, 1046, 881, 759,
+    1746, 1464, 916, 628,
+    436, 963, 281, 1,
+    -119, 74, 542, 213,
+    1, -567, 301, 241,
+    260, 435, 222, 396,
+    936, 957, 1108, 703,
+    510, 506, 808, 478,
+    601, 694, 960, 620,
+    972, 741, 980, 600,
+    834, 717, 767, 684,
+    643, 972, 935, 638,
+    501, 661, 720, 851,
+    -105, -632, -303, -117,
+    -429, 130, 789, 442,
+    -522, -188, 704, 373,
+    -759, 42, 814, 523,
+    -531, -1137, 373, 578,
+    -682, -1203, -455, 285,
+    -1163, -1577, -1098, 44,
+    81, -82, 712, 363,
+    477, 246, 954, 622,
+    1604, 1622, 1277, 891,
+    1409, 859, 924, 892,
+    774, 1041, 947, 1142,
+    40, -546, -75, 288,
+    -616, -106, -697, -26,
+    -169, -160, -891, -739,
+    -279, -384, -1029, -350,
+    1781, 1308, 1046, 816,
+    1580, 1533, 1472, 1178,
+    1505, 1076, 1216, 899,
+    890, 904, 564, 654,
+    920, 692, 1021, 856,
+    -493, 132, 177, 505,
+    71, 195, -28, 97,
+    456, 351, -164, 88,
+    439, 278, -40, 350,
+    1395, 949, 234, -95,
+    -805, -472, 38, -163,
+    367, -98, 489, 523,
+    1025, 1178, 1212, 906,
+    319, 1314, 814, 461,
+    -123, -543, -804, 447,
+    -748, -324, -897, -1127,
+    -737, -501, -789, -713,
+    715, 777, 1239, 922,
+    1949, 1939, 1368, 865,
+    730, 880, 758, 388,
+    -871, 454, 17, -251,
+    -381, -810, -1583, 239,
+    -521, -966, -792, 259,
+    -890, -1358, -770, -73,
+    166, 349, -212, 323,
+    -840, -301, 473, 435,
+    -679, -464, 728, 351,
+    -156, -199, 667, 432,
+    29, -252, 415, 480,
+    -731, -379, 145, 559,
+    -528, -631, -1158, -159,
+    445, 273, 123, 639,
+    373, -126, 800, 568,
+    84, -162, 720, 712,
+    -830, -536, -185, 222,
+    408, 452, 501, 771,
+    -897, -1355, -67, 442,
+    -792, -1406, 566, 602,
+    167, -326, 509, 330,
+    -95, -626, -730, -344,
+    1668, 1217, 779, 455,
+    1316, 828, 584, 719,
+    404, -31, 1013, 789,
+    89, 107, 891, 549,
+    871, 1581, 917, 671,
+    866, 1479, 1289, 854,
+    391, 1068, 1122, 812,
+    78, -562, 345, 563,
+    429, -103, 417, 787,
+    -122, -437, 411, 788,
+    -913, -417, 602, 754,
+    -226, -16, 151, 760,
+    -700, 118, -104, -14,
+    -1128, 48, 284, 393,
+    -390, -419, -639, -116,
+    -910, 306, 316, -13,
+    1207, 984, 821, 669,
+    -1195, -693, 140, -213,
+    -884, -416, -199, -558,
+    -616, 245, -404, -664,
+    262, 56, -617, -724,
+    -85, -491, -320, -656,
+    -570, -831, -129, -528,
+    -1506, -63, -367, -385,
+    -358, -321, 4, 51,
+    -366, -214, 319, 511,
+    146, 671, -17, -291,
+    -110, 464, -139, -496,
+    -202, 220, -312, -631,
+    -660, -73, -655, -820,
+    -662, -653, -1288, -857,
+    -430, -953, -959, -264,
+    -49, -468, -72, -381,
+    -350, -563, -193, -407,
+    55, -408, -803, 11,
+    -309, 649, 188, -198,
+    -512, 461, -79, -458,
+    -1318, -263, -134, -523,
+    -1657, -435, -495, -765,
+    57, -347, -414, 434,
+    -1141, -242, -664, -857,
+    34, -68, -707, -338
+};
+
+
+
+/* third codebook for MR475, MR515 */
+
+const Word16 mr515_3_lsf[MR515_3_SIZE*4] =
+{
+    419,   163,   -30,  -262,
+    -455,  -789, -1430,  -721,
+    1006,   664,   269,    25,
+    619,   260,   183,    96,
+    -968, -1358,  -388,   135,
+    -693,   835,   456,   154,
+    1105,   703,   569,   363,
+    1625,  1326,   985,   748,
+    -220,   219,    76,  -208,
+    -1455, -1662,    49,   149,
+    -964,  -172,  -752,  -336,
+    625,   209,  -250,   -66,
+    -1017,  -838,    -2,   317,
+    -2168, -1485,  -138,   123,
+    -1876, -2099,  -521,    85,
+    -967,  -366,  -695,  -881,
+    -921, -1011,  -763,  -949,
+    -124,  -256,  -352,  -660,
+    178,   463,   354,   304,
+    -1744,  -591,  -282,    79,
+    -2249,   175,   867,   499,
+    -138,  -180,  -181,   -21,
+    -2291, -1241,  -460,  -520,
+    -771,   451,   -10,  -308,
+    271,   -65,     4,   214,
+    -279,  -435,   -43,  -348,
+    -670,    35,   -65,  -211,
+    806,   535,    85,   297,
+    57,   239,   722,   493,
+    225,   661,   840,   547,
+    -540,  -376,    14,   349,
+    469,   721,   331,   162,
+    -544,  -752,   -62,   -10,
+    398,   -88,   724,   701,
+    -19,  -533,   -94,   601,
+    136,   -71,  -681,  -747,
+    -166,  -344,   261,   -50,
+    161,   -52,   485,   337,
+    -1675,    50,   190,   -93,
+    -2282,  -231,  -194,   -82,
+    -95,  -595,  -154,   128,
+    894,   501,   588,   457,
+    -345,   206,   122,   110,
+    -631,  -227,  -569,     3,
+    408,   239,   397,   226,
+    -197,    -2,   128,   491,
+    1281,   904,   292,   215,
+    538,   306,   259,   509,
+    -677, -1047,    13,   321,
+    -679,  -588,  -358,  -212,
+    -558,   243,   646,   479,
+    486,   342,   634,   532,
+    107,   802,   331,   136,
+    -112,  -398, -1031,  -286,
+    -326,  -705,   288,   272,
+    1299,  1144,  1178,   860,
+    -423,   121,  -385,  -148,
+    -295,  -302,  -834,  -819,
+    16,   -24,  -201,  -476,
+    555,    91,  -245,   294,
+    -38,  -379,  -962, -1221,
+    -1191, -1518,  -273,  -395,
+    -390, -1013,  -645,   573,
+    -1843, -1030,   505,   468,
+    744,   947,   609,   493,
+    -689, -1172,  -628,  -135,
+    -1026,   195,   411,   196,
+    1582,  1147,   575,   337,
+    -1239,  -777,  -648,  -142,
+    595,   825,   967,   735,
+    -1206,  -970,   -81,  -342,
+    -745,    13,   -72,   375,
+    454,    19,  1407,   921,
+    -1647,  -172,   861,   562,
+    928,  1537,  1063,   740,
+    -2472,  -952,   264,    82,
+    -502,  -965, -1334,   123,
+    867,  1236,   534,   171,
+    -2320,  -460,   780,   363,
+    -1190,  -617,   252,   -61,
+    -174,    34,  1011,   788,
+    -2333,   247,   423,   153,
+    -16,  -355,   262,   449,
+    -1576, -1073,  -544,  -371,
+    -615,  -305,  1051,   805,
+    687,   528,     6,  -182,
+    935,   875,  1002,   809,
+    199,   257,   126,    76,
+    -584, -1138,   599,   556,
+    -1105, -1391, -1591,  -519,
+    -977, -1325,   108,   347,
+    -722,  -975,   365,   101,
+    -145,   681,   249,  -153,
+    0,  -334,  -570,   159,
+    412,   285,  -336,  -617,
+    -953,  -966,   887,   689,
+    -1251,    84,  -185,  -398,
+    -592,   433,  1044,   653,
+    85,   329,   -40,   361,
+    -433,  -705,   466,   574,
+    -154,   654,   592,   290,
+    -167,    72,   349,   175,
+    674,   297,   977,   720,
+    1235,  1204,   757,   488,
+    -400,  -269,   538,   372,
+    -1350, -1387, -1194,   -91,
+    1262,   876,   775,   700,
+    -599,   -38,  -430,  -722,
+    1976,  1630,   991,   608,
+    111,   276,  -226,   -96,
+    -947,  -388,   -11,    -7,
+    -303,  -531,  -839,   338,
+    1734,  1710,  1405,  1013,
+    -516,  -855,  -645,   210,
+    -688,  -416,   513,   230,
+    -822,  -637, -1146,  -320,
+    -952,  -658,  -694,   183,
+    -114,  -623,   818,   674,
+    -191,  -204,   731,   635,
+    51,  1221,   883,   576,
+    -954,  -431,   826,   598,
+    -342,  -755,  -900,  -407,
+    -1126,  -354,  -206,  -512,
+    -547,  -810,  -357,  -620,
+    66,   515,   -73,  -410,
+    -872,  -945, -1444, -1227,
+    191,   -17,  -544,  -231,
+    -1540,  -544,  -901,  -886
+};
+
+/* first codebook for MR795 */
+
+const Word16 mr795_1_lsf[MR795_1_SIZE*3] =
+{
+    -890, -1550, -2541,
+    -819,  -970,   175,
+    -826, -1234,  -762,
+    -599,   -22,   634,
+    -811,  -987,  -902,
+    -323,   203,    26,
+    -383,  -235,  -781,
+    -399,  1262,   906,
+    -932, -1399, -1380,
+    -624,    93,    87,
+    -414,  -539,  -691,
+    37,   633,   510,
+    -387,  -476, -1330,
+    399,    66,   263,
+    -407,   -49,  -335,
+    -417,  1041,  1865,
+    -779, -1089, -1440,
+    -746,  -858,   832,
+    -581,  -759,  -371,
+    -673,  -506,  2088,
+    -560,  -634, -1179,
+    271,   241,    14,
+    -438,  -244,  -397,
+    463,  1202,  1047,
+    -606,  -797, -1438,
+    -51,  -323,   481,
+    -224,  -584,  -527,
+    494,   881,   682,
+    -433,  -306, -1002,
+    554,   659,   222,
+    171,  -160,  -353,
+    681,  1798,  1565,
+    -852, -1181, -1695,
+    -336,  -666,   114,
+    -581,  -756,  -744,
+    -195,   375,   497,
+    -465,  -804, -1098,
+    154,   282,  -131,
+    -50,  -191,  -719,
+    323,   732,  1542,
+    -722,  -819, -1404,
+    105,  -250,   185,
+    -178,  -502,  -742,
+    321,   510,  1111,
+    -323,  -567,  -966,
+    127,   484,   338,
+    -160,    52,  -338,
+    732,  1367,  1554,
+    -626,  -802, -1696,
+    -286,  -586,   676,
+    -695,  -343,  -370,
+    -490,   295,  1893,
+    -630,  -574, -1014,
+    -80,   645,   -69,
+    -6,  -318,  -364,
+    782,  1450,  1038,
+    -313,  -733, -1395,
+    120,    60,   477,
+    -264,  -585,  -123,
+    711,  1245,   633,
+    -91,  -355, -1016,
+    771,   758,   261,
+    253,    81,  -474,
+    930,  2215,  1720,
+    -808, -1099, -1925,
+    -560,  -782,   169,
+    -804, -1074,  -188,
+    -626,   -55,  1405,
+    -694,  -716, -1194,
+    -660,   354,   329,
+    -514,   -55,  -543,
+    366,  1033,  1182,
+    -658,  -959, -1357,
+    -55,  -184,    93,
+    -605,  -286,  -662,
+    404,   449,   827,
+    -286,  -350, -1263,
+    628,   306,   227,
+    -16,   147,  -623,
+    186,   923,  2146,
+    -674,  -890, -1606,
+    -443,  -228,   339,
+    -369,  -790,  -409,
+    231,    86,  1469,
+    -448,  -581, -1061,
+    594,   450,  -177,
+    -124,  -170,  -447,
+    671,  1159,  1404,
+    -476,  -667, -1511,
+    -77,  -138,   716,
+    -177,  -372,  -381,
+    451,   934,   915,
+    -250,  -432,  -822,
+    272,   828,   446,
+    26,    19,   -31,
+    698,  1692,  2168,
+    -646,  -977, -1924,
+    -179,  -473,   268,
+    -379,  -745,  -691,
+    11,   127,  1033,
+    -488,  -917,  -825,
+    61,   323,   135,
+    147,  -145,  -686,
+    685,   786,  1682,
+    -506,  -848, -1297,
+    35,    90,   222,
+    -23,  -346,  -670,
+    455,   591,  1287,
+    -203,  -593, -1086,
+    652,   352,   437,
+    39,    63,  -457,
+    841,  1265,  2105,
+    -520,  -882, -1584,
+    -328,  -711,  1421,
+    -596,  -342,   -70,
+    209,   173,  1928,
+    -423,  -598,  -921,
+    421,   605,   -38,
+    -2,  -245,  -127,
+    896,  1969,  1135,
+    -379,  -518, -1579,
+    173,   118,   753,
+    -55,  -381,   -52,
+    985,  1021,   753,
+    -2,  -291,  -891,
+    753,   992,   423,
+    264,   131,  -196,
+    895,  2274,  2543,
+    -635, -1088, -2499,
+    -529,  -982,   526,
+    -764,  -830,  -548,
+    -436,   316,   599,
+    -675,  -940,  -746,
+    -57,   236,   -11,
+    -201,   -81,  -798,
+    16,   845,  1558,
+    -737,  -985, -1212,
+    -468,    17,   290,
+    -279,  -584,  -700,
+    183,   822,   705,
+    -265,  -492, -1187,
+    421,   152,   468,
+    -390,   166,  -268,
+    39,  1550,  1868,
+    -635,  -966, -1571,
+    -453,  -492,   910,
+    -284, -1027,   -75,
+    -181,  -133,  1852,
+    -445,  -624, -1174,
+    420,   367,   -49,
+    -389,  -212,  -169,
+    707,  1073,  1208,
+    -539,  -710, -1449,
+    83,  -163,   484,
+    -236,  -543,  -355,
+    338,  1175,   814,
+    -246,  -309,  -958,
+    606,   760,    60,
+    166,    -8,  -163,
+    -306,  1849,  2563,
+    -747, -1025, -1783,
+    -419,  -446,   209,
+    -718,  -566,  -534,
+    -506,   693,   857,
+    -463,  -697, -1082,
+    325,   431,  -206,
+    -15,    -8,  -763,
+    545,   919,  1518,
+    -611,  -783, -1313,
+    256,   -55,   208,
+    -165,  -348,  -662,
+    321,   680,   930,
+    -326,  -429,  -951,
+    484,   446,   570,
+    -197,    72,   -73,
+    909,  1455,  1741,
+    -563,  -737, -1974,
+    -124,  -416,   718,
+    -478,  -404,  -314,
+    -16,   446,  1636,
+    -551,  -537,  -750,
+    -58,   638,   214,
+    55,  -185,  -271,
+    1148,  1301,  1212,
+    -483,  -671, -1264,
+    117,   285,   543,
+    -204,  -391,  -111,
+    513,  1538,   854,
+    -114,  -190,  -978,
+    877,   595,   464,
+    260,   260,  -311,
+    748,  2283,  2216,
+    -517,  -945, -2171,
+    -326,  -708,   378,
+    -812,  -691,  -232,
+    -560,   687,  1409,
+    -732,  -690,  -836,
+    -359,   645,   386,
+    -265,    62,  -678,
+    145,  1644,  1208,
+    -555,  -988, -1233,
+    -78,    14,   114,
+    -327,  -358,  -489,
+    392,   677,   697,
+    -201,  -236, -1140,
+    693,   449,   178,
+    -243,   256,  -433,
+    611,  1385,  2456,
+    -612,  -901, -1464,
+    -307,   -17,   499,
+    -315,  -667,  -254,
+    256,   428,  1463,
+    -486,  -422, -1056,
+    655,   370,    18,
+    -102,  -185,  -276,
+    755,  1578,  1335,
+    -488,  -603, -1418,
+    182,   -93,   870,
+    -73,  -458,  -348,
+    835,   862,   957,
+    -282,  -333,  -746,
+    547,   839,   428,
+    273,   -89,    13,
+    940,  1708,  2576,
+    -418, -1084, -1758,
+    -44,  -358,   259,
+    -497,  -643,  -560,
+    99,   557,   961,
+    -421,  -766,  -917,
+    295,   326,   184,
+    175,    15,  -626,
+    532,   878,  1981,
+    -443,  -768, -1275,
+    221,   156,   268,
+    39,  -363,  -505,
+    695,   772,  1140,
+    -162,  -459,  -912,
+    709,   444,   658,
+    25,   303,  -312,
+    1268,  1410,  1715,
+    -297,  -766, -1836,
+    -263,  -108,  1070,
+    -406,   -13,  -129,
+    57,   438,  2734,
+    -374,  -487,  -835,
+    304,   696,   164,
+    104,  -235,     5,
+    1611,  1900,  1399,
+    -229,  -582, -1325,
+    405,   192,   817,
+    -87,  -438,   111,
+    1028,  1199,   993,
+    68,  -175,  -934,
+    1033,  1117,   451,
+    478,   200,  -248,
+    2127,  2696,  2042,
+    -835, -1323, -2131,
+    -799,  -692,   466,
+    -812, -1032,  -469,
+    -622,   288,   920,
+    -701,  -841, -1070,
+    -411,   512,     8,
+    -390,   -91,  -744,
+    -30,  1043,  1161,
+    -822, -1148, -1156,
+    -294,   -46,   110,
+    -411,  -374,  -678,
+    214,   531,   668,
+    -406,  -420, -1194,
+    487,   232,   303,
+    -318,    91,  -472,
+    123,  1232,  2445,
+    -722,  -952, -1495,
+    -738,  -675,  1332,
+    -543,  -606,  -211,
+    -95,   -98,  1508,
+    -549,  -514, -1193,
+    473,   211,    73,
+    -288,  -112,  -389,
+    537,  1332,  1258,
+    -567,  -755, -1545,
+    71,  -283,   632,
+    -170,  -481,  -493,
+    681,  1002,   817,
+    -356,  -331,  -877,
+    419,   706,   346,
+    241,   -34,  -326,
+    377,  1950,  1883,
+    -727, -1075, -1625,
+    -233,  -543,   116,
+    -524,  -806,  -585,
+    -73,   478,   729,
+    -288,  -925, -1143,
+    173,   447,   -52,
+    68,  -229,  -606,
+    449,   529,  1797,
+    -591,  -875, -1363,
+    183,  -144,   324,
+    -103,  -452,  -666,
+    623,   488,  1176,
+    -238,  -511, -1004,
+    326,   552,   458,
+    136,   108,  -319,
+    626,  1343,  1883,
+    -490,  -646, -1730,
+    -186,  -449,   984,
+    -738,   -76,  -170,
+    -550,   755,  2560,
+    -496,  -510,  -947,
+    210,   694,   -52,
+    84,  -322,  -199,
+    1090,  1625,  1224,
+    -376,  -603, -1396,
+    343,    74,   632,
+    -175,  -502,   -32,
+    972,  1332,   734,
+    52,  -295, -1113,
+    1065,   918,   160,
+    393,   107,  -397,
+    1214,  2649,  1741,
+    -632, -1201, -1891,
+    -719,  -277,   353,
+    -651,  -880,  -122,
+    -211,   209,  1338,
+    -562,  -714, -1059,
+    -208,   388,   159,
+    -320,   -61,  -551,
+    293,  1092,  1443,
+    -648,  -865, -1253,
+    -49,  -143,   305,
+    -401,  -227,  -585,
+    561,   532,   927,
+    -117,  -443, -1188,
+    507,   436,   292,
+    -79,   233,  -458,
+    671,  1025,  2396,
+    -633,  -842, -1525,
+    -308,  -286,   640,
+    -373,  -621,  -407,
+    418,   253,  1305,
+    -315,  -581, -1137,
+    572,   685,  -281,
+    61,   -68,  -371,
+    991,  1101,  1498,
+    -493,  -683, -1362,
+    -47,   164,   704,
+    -256,  -314,  -268,
+    631,   949,  1052,
+    -118,  -348,  -833,
+    68,  1180,   568,
+    152,   117,    34,
+    1113,  1902,  2239,
+    -601,  -959, -1706,
+    -143,  -489,   480,
+    -332,  -655,  -574,
+    54,   353,  1192,
+    -462,  -652,  -796,
+    150,   549,   112,
+    195,  -111,  -515,
+    679,  1108,  1647,
+    -558,  -749, -1217,
+    -9,   272,   341,
+    -53,  -265,  -535,
+    489,   843,  1298,
+    -120,  -482, -1032,
+    632,   543,   408,
+    179,   306,  -526,
+    1124,  1464,  2244,
+    -417,  -786, -1562,
+    -224,  -384,  1364,
+    -377,  -459,   -25,
+    385,   489,  2174,
+    -332,  -651,  -829,
+    544,   553,    61,
+    22,  -113,   -89,
+    1128,  1725,  1524,
+    -216,  -373, -1653,
+    161,   316,   908,
+    -165,  -222,   -67,
+    1362,  1175,   789,
+    73,  -252,  -767,
+    738,   932,   616,
+    362,   246,  -126,
+    787,  2654,  3027,
+    -691, -1106, -2190,
+    -565,  -588,   524,
+    -590,  -979,  -490,
+    -263,   397,   982,
+    -577,  -837,  -945,
+    -22,   435,   -49,
+    -190,  -118,  -629,
+    -88,  1240,  1513,
+    -636, -1051, -1019,
+    -291,   189,   259,
+    -257,  -470,  -629,
+    145,   945,   894,
+    -326,  -364, -1094,
+    543,   260,   630,
+    -202,   189,  -209,
+    357,  1379,  2091,
+    -569, -1075, -1449,
+    -714,  -239,   919,
+    -420,  -705,   -84,
+    -109,  -114,  2407,
+    -413,  -529, -1177,
+    482,   368,   131,
+    -186,   -72,  -131,
+    861,  1255,  1220,
+    -611,  -658, -1341,
+    227,  -121,   631,
+    -176,  -489,  -218,
+    745,  1175,   957,
+    -321,  -148,  -936,
+    671,   966,   216,
+    340,    -3,  -143,
+    469,  1848,  2437,
+    -729,  -961, -1683,
+    -213,  -254,   321,
+    -511,  -438,  -521,
+    -126,   725,   903,
+    -340,  -685, -1032,
+    316,   480,    20,
+    23,   -89,  -551,
+    353,  1051,  1789,
+    -544,  -757, -1364,
+    298,   -25,   436,
+    -100,  -392,  -519,
+    467,   754,  1078,
+    -210,  -398, -1078,
+    620,   658,   630,
+    33,   147,  -178,
+    921,  1687,  1921,
+    -325,  -528, -1978,
+    2,  -285,   910,
+    -371,  -490,  -230,
+    0,   597,  2010,
+    -496,  -395,  -834,
+    37,   945,   245,
+    181,  -160,  -144,
+    1481,  1373,  1357,
+    -355,  -601, -1270,
+    298,   322,   672,
+    -193,  -336,    77,
+    1089,  1533,   922,
+    177,   -39, -1125,
+    996,   781,   536,
+    456,   366,  -432,
+    1415,  2440,  2279,
+    -466,  -758, -2325,
+    -303,  -509,   387,
+    -727,  -557,    66,
+    -145,   643,  1248,
+    -544,  -676,  -916,
+    -225,   862,   588,
+    -152,    40,  -533,
+    423,  1423,  1558,
+    -572,  -843, -1145,
+    -128,    85,   461,
+    -238,  -257,  -584,
+    605,   748,   861,
+    24,  -202, -1409,
+    797,   487,   303,
+    -181,   364,  -182,
+    616,  1378,  2942,
+    -494,  -852, -1441,
+    -292,    61,   812,
+    -84,  -723,  -182,
+    555,   532,  1506,
+    -365,  -493, -1057,
+    822,   588,    11,
+    -14,   -18,  -230,
+    1001,  1401,  1451,
+    -474,  -569, -1292,
+    302,    62,  1062,
+    -70,  -376,  -222,
+    982,   974,  1149,
+    -196,  -234,  -795,
+    479,  1098,   499,
+    362,    58,    70,
+    1147,  2069,  2857,
+    -487,  -878, -1824,
+    73,  -288,   348,
+    -358,  -500,  -508,
+    199,   721,  1242,
+    -78,  -697,  -795,
+    361,   536,   196,
+    374,   110,  -735,
+    847,  1051,  1896,
+    -366,  -713, -1182,
+    315,   320,   429,
+    72,  -215,  -450,
+    759,   886,  1363,
+    -30,  -428,  -834,
+    861,   627,   796,
+    118,   468,  -279,
+    1355,  1883,  1893,
+    -188,  -642, -1612,
+    63,  -175,  1198,
+    -418,  -211,    51,
+    414,   587,  2601,
+    -234,  -557,  -858,
+    424,   889,   222,
+    136,  -101,    83,
+    1413,  2278,  1383,
+    -84,  -445, -1389,
+    414,   313,  1045,
+    29,  -343,    65,
+    1552,  1647,   980,
+    183,   -91,  -829,
+    1273,  1413,   360,
+    553,   272,  -107,
+    1587,  3149,  2603
+};
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf_5.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf_5.cpp
new file mode 100644
index 0000000..2f9e40e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf_5.cpp
@@ -0,0 +1,691 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/q_plsf_5.c
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed code in the PV standard template format.
+ Updated to accept new parameter, Flag *pOverflow.
+
+ Description:
+              Eliminated unused include files.
+              For Vq_subvec()
+              1. Eliminated math operations that unnecessary checked for
+                 saturation (number are bounded to 2^12)
+              2. Eliminated access to (slow) memory by using axiliar variables
+              3. Because this routine is looking for the minimum distance,
+                 introduced 3 check conditions inside the loop, so when the
+                 partial distance is bigger than the minimun distance, the
+                 loop is not completed and process continue with next iteration
+              For Vq_subvec_s()
+              1. Eliminated math operations that unnecessary checked for
+                 saturation (number are bounded to 2^12)
+              2. Combined increasing and decreasing loops to avoid double
+                 accesses to the same table element
+              3. Eliminated access to (slow) memory by using axiliar variables
+              4. Because this routine is looking for the minimum distance,
+                 introduced 2 check conditions inside the loop, so when the
+                 partial distance is bigger than the minimun distance, the
+                 loop is not completed and process continue with next iteration
+              For Q_plsf_5()
+              1. Eliminated math operations that unnecessary checked for
+                 saturation (number are bounded to 2^12)
+              2. Replaced array addressing by pointers
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "q_plsf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "lsfwt.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    /* Codebooks of LSF prediction residual */
+    extern const Word16 mean_lsf_5[];
+
+    extern const Word16 dico1_lsf_5[];
+    extern const Word16 dico2_lsf_5[];
+    extern const Word16 dico3_lsf_5[];
+    extern const Word16 dico4_lsf_5[];
+    extern const Word16 dico5_lsf_5[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Vq_subvec
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 -- array of type Word16 -- 1st LSF residual vector,  Q15
+    lsf_r2 -- array of type Word16 -- 2nd LSF residual vector,  Q15
+    dico -- pointer to const Word16 -- quantization codebook,   Q15
+    wf1 -- array of type Word16 -- 1st LSF weighting factors,   Q13
+    wf2 -- array of type Word16 -- 2nd LSF weighting factors,   Q13
+    dico_size -- Word16 -- size of quantization codebook,       Q0
+ Outputs:
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    Word16 -- quantization index, Q0
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the quantization of a 4-dimensional subvector.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_5.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+/* Quantization of a 4 dimensional subvector */
+
+static Word16 Vq_subvec( /* o : quantization index,            Q0  */
+    Word16 *lsf_r1,      /* i : 1st LSF residual vector,       Q15 */
+    Word16 *lsf_r2,      /* i : 2nd LSF residual vector,       Q15 */
+    const Word16 *dico,  /* i : quantization codebook,         Q15 */
+    Word16 *wf1,         /* i : 1st LSF weighting factors      Q13 */
+    Word16 *wf2,         /* i : 2nd LSF weighting factors      Q13 */
+    Word16 dico_size,    /* i : size of quantization codebook, Q0  */
+    Flag   *pOverflow    /* o : overflow indicator                 */
+)
+{
+    Word16 index = 0; /* initialization only needed to keep gcc silent */
+    Word16 i;
+    Word16 temp;
+    const Word16 *p_dico;
+    Word32 dist_min;
+    Word32 dist;
+    Word16 wf1_0;
+    Word16 wf1_1;
+    Word16 wf2_0;
+    Word16 wf2_1;
+    Word32 aux1;
+    Word32 aux2;
+    Word32 aux3;
+    Word32 aux4;
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+    wf1_0 = wf1[0];
+    wf1_1 = wf1[1];
+    wf2_0 = wf2[0];
+    wf2_1 = wf2[1];
+
+    aux1 = ((Word32) lsf_r1[0] * wf1_0);
+    aux2 = ((Word32) lsf_r1[1] * wf1_1);
+    aux3 = ((Word32) lsf_r2[0] * wf2_0);
+    aux4 = ((Word32) lsf_r2[1] * wf2_1);
+
+    for (i = 0; i < dico_size; i++)
+    {
+        temp  = (aux1 - ((Word32)wf1_0 * *(p_dico++))) >> 15;
+        dist  = ((Word32)temp * temp);
+
+        if (dist >= dist_min)
+        {
+            p_dico += 3;
+            continue;
+        }
+
+        temp  = (aux2 - ((Word32)wf1_1 * *(p_dico++))) >> 15;
+        dist += ((Word32)temp * temp);
+
+        if (dist >= dist_min)
+        {
+            p_dico += 2;
+            continue;
+        }
+
+        temp  = (aux3 - ((Word32)wf2_0 * *(p_dico++))) >> 15;
+        dist += ((Word32)temp * temp);
+
+        if (dist >= dist_min)
+        {
+            p_dico += 1;
+            continue;
+        }
+
+        temp  = (aux4 - ((Word32)wf2_1 * *(p_dico++))) >> 15;
+        dist += ((Word32)temp * temp);
+
+
+        if (dist < dist_min)
+        {
+            dist_min = dist;
+            index = i;
+        }
+    }
+
+
+
+    /* Reading the selected vector */
+
+    p_dico = &dico[ index<<2];
+    lsf_r1[0] = *p_dico++;
+    lsf_r1[1] = *p_dico++;
+    lsf_r2[0] = *p_dico++;
+    lsf_r2[1] = *p_dico;
+
+    return index;
+
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Vq_subvec_s
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_r1 -- array of type Word16 -- 1st LSF residual vector,  Q15
+    lsf_r2 -- array of type Word16 -- 2nd LSF residual vector,  Q15
+    dico -- pointer to const Word16 -- quantization codebook,   Q15
+    wf1 -- array of type Word16 -- 1st LSF weighting factors,   Q13
+    wf2 -- array of type Word16 -- 2nd LSF weighting factors,   Q13
+    dico_size -- Word16 -- size of quantization codebook,       Q0
+
+ Outputs:
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    Word16 -- quantization index, Q0
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the quantization of a 4-dimensional subvector.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_5.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+
+/* Quantization of a 4 dimensional subvector with a signed codebook */
+
+static Word16 Vq_subvec_s(  /* o : quantization index            Q0  */
+    Word16 *lsf_r1,         /* i : 1st LSF residual vector       Q15 */
+    Word16 *lsf_r2,         /* i : and LSF residual vector       Q15 */
+    const Word16 *dico,     /* i : quantization codebook         Q15 */
+    Word16 *wf1,            /* i : 1st LSF weighting factors     Q13 */
+    Word16 *wf2,            /* i : 2nd LSF weighting factors     Q13 */
+    Word16 dico_size,       /* i : size of quantization codebook Q0  */
+    Flag   *pOverflow)      /* o : overflow indicator                */
+{
+    Word16 index = 0;  /* initialization only needed to keep gcc silent */
+    Word16 sign = 0;   /* initialization only needed to keep gcc silent */
+    Word16 i;
+    Word16 temp;
+    Word16 temp1;
+    Word16 temp2;
+    const Word16 *p_dico;
+    Word32 dist_min;
+    Word32 dist1;
+    Word32 dist2;
+
+    Word16 lsf_r1_0;
+    Word16 lsf_r1_1;
+    Word16 lsf_r2_0;
+    Word16 lsf_r2_1;
+
+    Word16 wf1_0;
+    Word16 wf1_1;
+    Word16 wf2_0;
+    Word16 wf2_1;
+
+    OSCL_UNUSED_ARG(pOverflow);
+
+    dist_min = MAX_32;
+    p_dico = dico;
+
+
+    lsf_r1_0 = lsf_r1[0];
+    lsf_r1_1 = lsf_r1[1];
+    lsf_r2_0 = lsf_r2[0];
+    lsf_r2_1 = lsf_r2[1];
+
+    wf1_0 = wf1[0];
+    wf1_1 = wf1[1];
+    wf2_0 = wf2[0];
+    wf2_1 = wf2[1];
+
+    for (i = 0; i < dico_size; i++)
+    {
+        /* test positive */
+        temp = *p_dico++;
+        temp1 = lsf_r1_0 - temp;
+        temp2 = lsf_r1_0 + temp;
+        temp1 = ((Word32)wf1_0 * temp1) >> 15;
+        temp2 = ((Word32)wf1_0 * temp2) >> 15;
+        dist1 = ((Word32)temp1 * temp1);
+        dist2 = ((Word32)temp2 * temp2);
+
+        temp = *p_dico++;
+        temp1 = lsf_r1_1 - temp;
+        temp2 = lsf_r1_1 + temp;
+        temp1 = ((Word32)wf1_1 * temp1) >> 15;
+        temp2 = ((Word32)wf1_1 * temp2) >> 15;
+        dist1 += ((Word32)temp1 * temp1);
+        dist2 += ((Word32)temp2 * temp2);
+
+        if ((dist1 >= dist_min) && (dist2 >= dist_min))
+        {
+            p_dico += 2;
+            continue;
+        }
+
+        temp = *p_dico++;
+        temp1 = lsf_r2_0 - temp;
+        temp2 = lsf_r2_0 + temp;
+        temp1 = ((Word32)wf2_0 * temp1) >> 15;
+        temp2 = ((Word32)wf2_0 * temp2) >> 15;
+        dist1 += ((Word32)temp1 * temp1);
+        dist2 += ((Word32)temp2 * temp2);
+
+        temp = *p_dico++;
+        temp1 = lsf_r2_1 - temp;
+        temp2 = lsf_r2_1 + temp;
+        temp1 = ((Word32)wf2_1 * temp1) >> 15;
+        temp2 = ((Word32)wf2_1 * temp2) >> 15;
+        dist1 += ((Word32)temp1 * temp1);
+        dist2 += ((Word32)temp2 * temp2);
+
+        if (dist1 < dist_min)
+        {
+            dist_min = dist1;
+            index = i;
+            sign = 0;
+        }
+
+        /* test negative */
+
+        if (dist2 < dist_min)
+        {
+            dist_min = dist2;
+            index = i;
+            sign = 1;
+        }
+    }
+
+    /* Reading the selected vector */
+
+    p_dico = &dico[index<<2];
+    index <<= 1;
+    if (sign)
+    {
+        lsf_r1[0] = - (*p_dico++);
+        lsf_r1[1] = - (*p_dico++);
+        lsf_r2[0] = - (*p_dico++);
+        lsf_r2[1] = - (*p_dico);
+        index +=  1;
+    }
+    else
+    {
+        lsf_r1[0] = *p_dico++;
+        lsf_r1[1] = *p_dico++;
+        lsf_r2[0] = *p_dico++;
+        lsf_r2[1] = *p_dico;
+    }
+
+    return index;
+
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Q_plsf_5
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+ Inputs:
+    st   -- pointer to Q_plsfState -- state information
+    lsp1 -- array of type Word16 -- 1st LSP vector,  Q15
+    lsp2 -- array of type Word16 -- 2nd LSP vector,  Q15
+
+ Outputs:
+    lps1_q -- array of type Word16 -- quantized 1st LSP vector,   Q15
+    lps2_q -- array of type Word16 -- quantized 2nd LSP vector,   Q15
+    indices -- array of type Word16 -- quantization indices of 5 matrics, Q0
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    mean_lsf_5[];
+
+    dico1_lsf_5[];
+    dico2_lsf_5[];
+    dico3_lsf_5[];
+    dico4_lsf_5[];
+    dico5_lsf_5[];
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE:  Quantization of 2 sets of LSF parameters using 1st order MA
+           prediction and split by 5 matrix quantization (split-MQ)
+
+ DESCRIPTION:
+
+      p[i] = pred_factor*past_rq[i];   i=0,...,m-1
+      r1[i]= lsf1[i] - p[i];           i=0,...,m-1
+      r2[i]= lsf2[i] - p[i];           i=0,...,m-1
+ where:
+      lsf1[i]           1st mean-removed LSF vector.
+      lsf2[i]           2nd mean-removed LSF vector.
+      r1[i]             1st residual prediction vector.
+      r2[i]             2nd residual prediction vector.
+      past_r2q[i]       Past quantized residual (2nd vector).
+
+ The residual vectors r1[i] and r2[i] are jointly quantized using
+ split-MQ with 5 codebooks. Each 4th dimension submatrix contains 2
+ elements from each residual vector. The 5 submatrices are as follows:
+   {r1[0], r1[1], r2[0], r2[1]};  {r1[2], r1[3], r2[2], r2[3]};
+   {r1[4], r1[5], r2[4], r2[5]};  {r1[6], r1[7], r2[6], r2[7]};
+                  {r1[8], r1[9], r2[8], r2[9]}
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ q_plsf_5.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Q_plsf_5(
+    Q_plsfState *st,
+    Word16 *lsp1,      /* i : 1st LSP vector,                     Q15 */
+    Word16 *lsp2,      /* i : 2nd LSP vector,                     Q15 */
+    Word16 *lsp1_q,    /* o : quantized 1st LSP vector,           Q15 */
+    Word16 *lsp2_q,    /* o : quantized 2nd LSP vector,           Q15 */
+    Word16 *indice,    /* o : quantization indices of 5 matrices, Q0  */
+    Flag   *pOverflow  /* o : overflow indicator                      */
+)
+{
+    Word16 i;
+    Word16 lsf1[M];
+    Word16 lsf2[M];
+    Word16 wf1[M];
+    Word16 wf2[M];
+    Word16 lsf_p[M];
+    Word16 lsf_r1[M];
+    Word16 lsf_r2[M];
+    Word16 lsf1_q[M];
+    Word16 lsf2_q[M];
+
+    Word16 *p_lsf_p;
+    Word16 *p_lsf1;
+    Word16 *p_lsf2;
+    Word16 *p_lsf_r1;
+    Word16 *p_lsf_r2;
+
+    /* convert LSFs to normalize frequency domain 0..16384  */
+
+    Lsp_lsf(lsp1, lsf1, M, pOverflow);
+    Lsp_lsf(lsp2, lsf2, M, pOverflow);
+
+    /* Compute LSF weighting factors (Q13) */
+
+    Lsf_wt(lsf1, wf1, pOverflow);
+    Lsf_wt(lsf2, wf2, pOverflow);
+
+    /* Compute predicted LSF and prediction error */
+
+    p_lsf_p  = &lsf_p[0];
+    p_lsf1   = &lsf1[0];
+    p_lsf2   = &lsf2[0];
+    p_lsf_r1 = &lsf_r1[0];
+    p_lsf_r2 = &lsf_r2[0];
+
+    for (i = 0; i < M; i++)
+    {
+        *(p_lsf_p) = mean_lsf_5[i] +
+                     (((Word32)st->past_rq[i] * LSP_PRED_FAC_MR122) >> 15);
+
+        *(p_lsf_r1++) = *(p_lsf1++) - *(p_lsf_p);
+        *(p_lsf_r2++) = *(p_lsf2++) - *(p_lsf_p++);
+    }
+
+    /*---- Split-MQ of prediction error ----*/
+
+    indice[0] = Vq_subvec(&lsf_r1[0], &lsf_r2[0], dico1_lsf_5,
+                          &wf1[0], &wf2[0], DICO1_5_SIZE, pOverflow);
+
+    indice[1] = Vq_subvec(&lsf_r1[2], &lsf_r2[2], dico2_lsf_5,
+                          &wf1[2], &wf2[2], DICO2_5_SIZE, pOverflow);
+
+    indice[2] = Vq_subvec_s(&lsf_r1[4], &lsf_r2[4], dico3_lsf_5,
+                            &wf1[4], &wf2[4], DICO3_5_SIZE, pOverflow);
+
+    indice[3] = Vq_subvec(&lsf_r1[6], &lsf_r2[6], dico4_lsf_5,
+                          &wf1[6], &wf2[6], DICO4_5_SIZE, pOverflow);
+
+    indice[4] = Vq_subvec(&lsf_r1[8], &lsf_r2[8], dico5_lsf_5,
+                          &wf1[8], &wf2[8], DICO5_5_SIZE, pOverflow);
+
+    /* Compute quantized LSFs and update the past quantized residual */
+
+    p_lsf_r1 = &lsf_r1[0];
+    p_lsf_r2 = &lsf_r2[0];
+    p_lsf_p  = &lsf_p[0];
+    p_lsf1   = &lsf1_q[0];
+    p_lsf2   = &lsf2_q[0];
+
+
+    for (i = 0; i < M; i++)
+    {
+        *(p_lsf1++) = *(p_lsf_r1++) + *(p_lsf_p);
+        *(p_lsf2++) = *(p_lsf_r2) + *(p_lsf_p++);
+        st->past_rq[i] = *(p_lsf_r2++);
+    }
+
+    /* verification that LSFs has minimum distance of LSF_GAP */
+
+    Reorder_lsf(lsf1_q, LSF_GAP, M, pOverflow);
+    Reorder_lsf(lsf2_q, LSF_GAP, M, pOverflow);
+
+    /*  convert LSFs to the cosine domain */
+
+    Lsf_lsp(lsf1_q, lsp1_q, M, pOverflow);
+    Lsf_lsp(lsf2_q, lsp2_q, M, pOverflow);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/q_plsf_5_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/q_plsf_5_tbl.cpp
new file mode 100644
index 0000000..ceb1e1e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/q_plsf_5_tbl.cpp
@@ -0,0 +1,1163 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/q_plsf_5_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, q_plsf_5_tbl.tab
+
+ Description: Changed #defines of DICO_SIZE to DICO_5_SIZE, to avoid name
+ conflicts.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+#define NB_QUA_PITCH 16
+#define NB_QUA_CODE 32
+
+
+#define DICO1_5_SIZE  128
+#define DICO2_5_SIZE  256
+#define DICO3_5_SIZE  256
+#define DICO4_5_SIZE  256
+#define DICO5_5_SIZE  64
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    /* LSF means ->normalize frequency domain */
+
+    extern const Word16 mean_lsf_5[10] =
+    {
+        1384,
+        2077,
+        3420,
+        5108,
+        6742,
+        8122,
+        9863,
+        11092,
+        12714,
+        13701
+    };
+
+    extern const Word16 dico1_lsf_5[DICO1_5_SIZE * 4] =
+    {
+        -451, -1065, -529, -1305,
+        -450, -756, -497, -863,
+        -384, -619, -413, -669,
+        -317, -538, -331, -556,
+        -414, -508, -424, -378,
+        -274, -324, -434, -614,
+        -226, -500, -232, -514,
+        -263, -377, -298, -410,
+        -151, -710, -174, -818,
+        -149, -412, -156, -429,
+        -288, -462, -186, -203,
+        -170, -302, -191, -321,
+        -131, -147, -297, -395,
+        -228, -214, -245, -192,
+        -67, -316, -71, -327,
+        -104, -205, -94, -183,
+        -143, -38, -193, -95,
+        16, -76, -124, -248,
+        23, -237, 24, -244,
+        18, -136, 44, -111,
+        -33, -24, -25, 0,
+        149, 19, 23, -143,
+        158, -169, 174, -181,
+        133, -55, 165, -26,
+        111, 84, 98, 75,
+        87, 183, -115, -11,
+        -8, 130, 11, 170,
+        254, 77, 205, 17,
+        183, 112, 262, 194,
+        202, 287, 95, 189,
+        -42, -105, 234, 179,
+        39, 186, 163, 345,
+        332, 199, 299, 161,
+        -54, 285, -78, 281,
+        -133, 141, -182, 111,
+        249, 341, 271, 364,
+        93, 403, 75, 391,
+        92, 510, -138, 220,
+        -185, -29, -34, 361,
+        -115, 320, 3, 554,
+        99, 286, 218, 591,
+        -245, 406, -268, 453,
+        0, 580, 25, 606,
+        275, 532, 148, 450,
+        -73, 739, -285, 518,
+        -288, 94, -203, 674,
+        -140, -74, 205, 714,
+        -114, 299, 176, 923,
+        182, 557, 240, 705,
+        -16, 513, 485, 593,
+        293, 384, 451, 617,
+        -38, 50, 563, 529,
+        303, 209, 459, 363,
+        433, 452, 450, 454,
+        367, 606, 477, 741,
+        432, 353, 368, 267,
+        361, 716, 273, 583,
+        453, 166, 510, 172,
+        201, 629, 274, 191,
+        568, 639, 302, 298,
+        634, 387, 643, 350,
+        587, 560, 612, 565,
+        600, 788, 487, 672,
+        512, 1015, 321, 333,
+        357, 854, -125, 413,
+        474, 712, 17, -151,
+        564, 285, 270, -241,
+        971, 889, 489, 220,
+        510, 896, 549, 924,
+        327, 825, 290, 911,
+        540, 1108, 158, 805,
+        199, 957, 511, 730,
+        100, 874, 13, 791,
+        435, 632, 676, 972,
+        249, 900, 467, 1218,
+        781, 1074, 585, 785,
+        -23, 669, 267, 1043,
+        619, 1084, 615, 1145,
+        622, 905, 916, 1049,
+        80, 331, 584, 1075,
+        89, 639, 988, 961,
+        770, 720, 798, 699,
+        492, 447, 899, 627,
+        271, 1188, 725, 1333,
+        87, 603, 832, 1603,
+        616, 1127, 890, 1505,
+        1000, 1156, 866, 1009,
+        995, 827, 1149, 858,
+        817, 1450, 773, 1320,
+        500, 1389, 312, 1153,
+        -20, 1084, 64, 1283,
+        2, 1172, 399, 1869,
+        514, 1706, 502, 1636,
+        886, 1522, 416, 600,
+        1131, 1350, 1275, 1390,
+        889, 1795, 914, 1766,
+        227, 1183, 1250, 1826,
+        505, 1854, 919, 2353,
+        -199, 431, 152, 1735,
+        -213, -28, 392, 1334,
+        -153, -52, 978, 1151,
+        -323, -400, 813, 1703,
+        -136, 84, 1449, 2015,
+        -331, -143, -137, 1192,
+        -256, 534, -157, 1031,
+        -307, -439, 542, 731,
+        -329, -420, -97, 616,
+        -362, -168, -322, 366,
+        -247, -110, -211, 89,
+        -196, -309, 20, 59,
+        -364, -463, -286, 89,
+        -336, 175, -432, 141,
+        -379, -190, -434, -196,
+        -79, 150, -278, -227,
+        -280, 166, -555, -422,
+        -155, 541, -366, 54,
+        -29, -83, -301, -774,
+        186, 628, -397, -264,
+        242, 293, -197, -585,
+        124, 410, 53, -133,
+        10, 340, -570, -1065,
+        65, -446, 68, -493,
+        383, 937, -357, -711,
+        -359, -250, -677, -1068,
+        292, -26, 363, 6,
+        607, 1313, -127, -10,
+        1513, 1886, 713, 972,
+        1469, 2181, 1443, 2016
+    };
+
+    extern const Word16 dico2_lsf_5[DICO2_5_SIZE * 4] =
+    {
+        -1631, -1600, -1796, -2290,
+        -1027, -1770, -1100, -2025,
+        -1277, -1388, -1367, -1534,
+        -947, -1461, -972, -1524,
+        -999, -1222, -1020, -1172,
+        -815, -987, -992, -1371,
+        -1216, -1006, -1289, -1094,
+        -744, -1268, -755, -1293,
+        -862, -923, -905, -984,
+        -678, -1051, -685, -1050,
+        -1087, -985, -1062, -679,
+        -989, -641, -1127, -976,
+        -762, -654, -890, -806,
+        -833, -1091, -706, -629,
+        -621, -806, -640, -812,
+        -775, -634, -779, -543,
+        -996, -565, -1075, -580,
+        -546, -611, -572, -619,
+        -760, -290, -879, -526,
+        -823, -462, -795, -253,
+        -553, -415, -589, -439,
+        -533, -340, -692, -935,
+        -505, -772, -702, -1131,
+        -263, -306, -971, -483,
+        -445, -74, -555, -548,
+        -614, -129, -693, -234,
+        -396, -246, -475, -250,
+        -265, -404, -376, -514,
+        -417, -510, -300, -313,
+        -334, -664, -463, -814,
+        -386, -704, -337, -615,
+        -234, -201, -233, -239,
+        -167, -567, -203, -619,
+        -147, -415, -115, -352,
+        -166, -750, -171, -761,
+        -270, -879, -264, -903,
+        -367, -744, 43, -475,
+        14, -653, 43, -670,
+        11, -448, -59, -521,
+        -126, -119, -155, -613,
+        -42, -863, -27, -931,
+        136, -483, 183, -468,
+        55, -298, 55, -304,
+        313, -609, 313, -720,
+        322, -167, 100, -541,
+        -3, -119, -111, -187,
+        233, -236, 260, -234,
+        26, -165, 134, -45,
+        -40, -549, 360, -203,
+        378, -388, 450, -383,
+        275, 20, 182, -103,
+        246, -111, 431, 37,
+        462, -146, 487, -157,
+        -284, -59, 503, -184,
+        24, 53, -3, 54,
+        122, 259, 333, 66,
+        484, 104, 436, 68,
+        195, 116, 190, 206,
+        269, -9, 482, 352,
+        382, 285, 399, 277,
+        452, 256, 69, 186,
+        13, 297, -13, 259,
+        -95, 30, 56, 394,
+        196, 425, 205, 456,
+        281, 577, 15, 191,
+        375, 290, 407, 576,
+        -56, 227, 544, 405,
+        0, 549, -92, 528,
+        -229, 351, -245, 338,
+        -362, 435, 167, 527,
+        -75, 302, 91, 824,
+        129, 599, 496, 679,
+        186, 749, 153, 737,
+        -281, 600, -348, 615,
+        -236, 769, 41, 881,
+        38, 890, -220, 841,
+        -357, 883, -393, 903,
+        -634, 474, -444, 850,
+        -175, 678, -493, 242,
+        -519, 785, -714, 582,
+        -541, 366, -543, 434,
+        -597, 500, -765, 222,
+        -702, 917, -743, 962,
+        -869, 501, -899, 548,
+        -379, 200, -435, 157,
+        -819, 214, -861, 157,
+        -614, 40, -632, 94,
+        -883, -54, -741, 516,
+        -501, 298, -614, -171,
+        -870, -161, -865, -23,
+        -818, 93, -1015, -267,
+        -662, -359, -549, 2,
+        -442, -121, -377, 0,
+        -227, 33, -414, -126,
+        -129, 212, -934, 34,
+        -1082, -282, -1119, -268,
+        -710, -825, -420, -191,
+        -1076, -928, -917, -93,
+        -628, -358, 97, 7,
+        -206, -393, -101, 24,
+        -203, 38, -168, 83,
+        -599, -423, -279, 426,
+        -700, 118, -75, 206,
+        -981, -673, -680, 417,
+        -367, 37, -279, 474,
+        -129, -318, 319, 296,
+        -626, -39, 343, 602,
+        -696, -39, -303, 940,
+        104, 233, -380, 137,
+        -36, 269, -75, -214,
+        120, 43, -529, -477,
+        459, 164, -202, -229,
+        -49, -167, 609, 792,
+        98, -220, 915, 148,
+        293, 283, 869, 91,
+        575, 394, 326, -78,
+        717, 67, 365, -323,
+        616, -36, 731, 27,
+        619, 238, 632, 273,
+        448, 99, 801, 476,
+        869, 273, 685, 64,
+        789, 72, 1021, 217,
+        793, 459, 734, 360,
+        646, 480, 360, 322,
+        429, 464, 638, 430,
+        756, 363, 1000, 404,
+        683, 528, 602, 615,
+        655, 413, 946, 687,
+        937, 602, 904, 604,
+        555, 737, 786, 662,
+        467, 654, 362, 589,
+        929, 710, 498, 478,
+        415, 420, 693, 883,
+        813, 683, 781, 925,
+        913, 939, 726, 732,
+        491, 853, 531, 948,
+        734, 963, 315, 808,
+        761, 755, 1144, 760,
+        655, 1076, 826, 1057,
+        1091, 838, 1003, 808,
+        1047, 1133, 659, 1101,
+        992, 1050, 1074, 1075,
+        971, 694, 1226, 1054,
+        571, 841, 884, 1404,
+        1379, 1096, 1080, 861,
+        1231, 735, 1284, 760,
+        1272, 991, 1367, 1053,
+        1257, 700, 1050, 534,
+        988, 453, 1264, 599,
+        1140, 679, 1621, 815,
+        1384, 521, 1317, 393,
+        1564, 805, 1448, 686,
+        1068, 648, 875, 307,
+        1083, 361, 1047, 317,
+        1417, 964, 675, 571,
+        1152, 79, 1114, -47,
+        1530, 311, 1721, 314,
+        1166, 689, 514, -94,
+        349, 282, 1412, 328,
+        1025, 487, -65, 57,
+        805, 970, 36, 62,
+        769, -263, 791, -346,
+        637, 699, -137, 620,
+        534, 541, -735, 194,
+        711, 300, -268, -863,
+        926, 769, -708, -428,
+        506, 174, -892, -630,
+        435, 547, -1435, -258,
+        621, 471, -1018, -1368,
+        -393, 521, -920, -686,
+        -25, 20, -982, -1156,
+        340, 9, -1558, -1135,
+        -352, 48, -1579, -402,
+        -887, 6, -1156, -888,
+        -548, -352, -1643, -1168,
+        -159, 610, -2024, -963,
+        -225, 193, -1656, -1960,
+        -245, -493, -964, -1680,
+        -936, -635, -1299, -1744,
+        -1388, -604, -1540, -835,
+        -1397, -135, -1588, -290,
+        -1670, -712, -2011, -1632,
+        -1663, -27, -2258, -811,
+        -1157, 184, -1265, 189,
+        -1367, 586, -2011, 201,
+        -790, 712, -1210, 3,
+        -1033, 808, -1251, 830,
+        -111, 635, -1636, 447,
+        -463, -949, -445, -928,
+        -504, -1162, -501, -1211,
+        144, -351, -372, -1052,
+        -283, -1059, -279, -1123,
+        -575, -1438, -587, -1614,
+        -935, -984, 229, 690,
+        -921, -719, -403, 1362,
+        -685, -465, 874, 397,
+        -509, -46, 317, 1334,
+        -485, 456, 813, 439,
+        -411, 339, 898, 1067,
+        -425, 46, 1441, 497,
+        -909, -800, 1465, 1046,
+        -254, -321, 1430, 1165,
+        68, 350, 1034, 666,
+        370, 11, 1311, 790,
+        143, 232, 1041, 1562,
+        -114, 663, 1616, 1078,
+        454, 579, 1275, 1040,
+        -76, 909, 752, 1067,
+        153, 512, 348, 1214,
+        614, 385, 1843, 808,
+        269, 1034, 203, 1086,
+        652, 1017, 1783, 1130,
+        429, 1327, 387, 1384,
+        -49, 1183, -72, 1215,
+        -416, 1001, 544, 1749,
+        -352, 1223, -502, 1199,
+        -589, 569, -227, 1630,
+        -142, 1578, -230, 1715,
+        -714, 1288, -838, 1398,
+        1131, 1357, -208, 1232,
+        437, 965, -929, 818,
+        811, 1410, 859, 1507,
+        164, 1212, 1387, 1793,
+        484, 1874, 456, 2063,
+        996, 1170, 1326, 1402,
+        1316, 1360, 1135, 1262,
+        1234, 1618, 1361, 1768,
+        1421, 1227, 1584, 1347,
+        854, 672, 1685, 1566,
+        1139, 1270, 2016, 1825,
+        1773, 1581, 1532, 1460,
+        1487, 946, 1659, 1021,
+        1744, 1212, 1392, 977,
+        1772, 1161, 1826, 1164,
+        1718, 1429, 1973, 1591,
+        1185, 864, 2132, 1061,
+        1799, 814, 1838, 757,
+        2104, 1315, 2054, 1258,
+        2113, 915, 2331, 930,
+        1467, 1147, 2590, 1439,
+        2245, 1744, 2090, 1620,
+        2358, 1454, 2666, 1506,
+        1876, 1837, 2070, 1975,
+        1739, 1577, 682, 1289,
+        1584, 2045, 1454, 2098,
+        2498, 2004, 2711, 2066,
+        726, 1588, 2756, 2336,
+        228, 847, 2456, 1659,
+        36, 301, 1942, 1957,
+        -446, -96, 2154, 1396,
+        1533, 1101, 14, 608,
+        -923, -732, 1383, 1982,
+        1345, 952, -680, 321,
+        1281, 1268, -1594, 365,
+        941, 946, -1737, -822,
+        2374, 2787, 1821, 2788
+    };
+
+    extern const Word16 dico3_lsf_5[DICO3_5_SIZE * 4] =
+    {
+        -1812, -2275, -1879, -2537,
+        -1640, -1848, -1695, -2004,
+        -1220, -1912, -1221, -2106,
+        -1559, -1588, -1573, -1556,
+        -1195, -1615, -1224, -1727,
+        -1359, -1151, -1616, -1948,
+        -1274, -1391, -1305, -1403,
+        -1607, -1179, -1676, -1311,
+        -1443, -1478, -1367, -898,
+        -1256, -1059, -1331, -1134,
+        -982, -1133, -1149, -1504,
+        -1080, -1308, -1020, -1183,
+        -980, -1486, -967, -1495,
+        -988, -922, -1047, -1077,
+        -838, -1179, -858, -1222,
+        -1131, -1041, -1064, -767,
+        -872, -1157, -701, -880,
+        -706, -906, -774, -1016,
+        -578, -1080, -801, -1478,
+        -591, -1111, -592, -1146,
+        -713, -1388, -640, -1376,
+        -597, -1059, -416, -903,
+        -686, -832, -661, -708,
+        -444, -868, -490, -921,
+        -374, -776, -619, -1170,
+        -585, -549, -769, -795,
+        -435, -659, -530, -741,
+        -498, -837, -357, -597,
+        -279, -871, -243, -887,
+        -282, -665, -280, -667,
+        -165, -560, -394, -903,
+        -362, -410, -448, -583,
+        -409, -574, -313, -357,
+        -637, -548, -570, -436,
+        -896, -504, -382, -757,
+        -58, -481, -165, -618,
+        -191, -374, -234, -382,
+        -222, -683, -25, -480,
+        -418, -359, -730, -353,
+        -324, -157, -432, -322,
+        -394, -303, -284, -104,
+        -601, -289, -556, -196,
+        -588, -150, -659, -608,
+        -473, -24, -68, -448,
+        -474, -8, -506, -45,
+        -748, -184, -844, -252,
+        -901, -91, -584, -97,
+        -652, 138, -764, -131,
+        -678, -12, -670, 165,
+        -259, -3, -840, -107,
+        -909, 37, -992, 44,
+        -854, -415, -839, 13,
+        -1001, -271, -1026, -309,
+        -798, -478, -832, -488,
+        -943, 168, -1112, -387,
+        -1185, -101, -1183, -40,
+        -941, -316, -1030, -770,
+        -1044, -625, -1081, -538,
+        -1224, -299, -1312, -436,
+        -1197, -663, -1167, -161,
+        -1216, -690, -1237, -831,
+        -1432, -720, -1403, -493,
+        -898, -740, -922, -801,
+        -1102, -402, -1579, -964,
+        -1061, -638, -1269, -1438,
+        -1499, -934, -1502, -895,
+        -1598, -564, -1723, -717,
+        -606, -597, -1166, -1085,
+        -1369, -468, -1946, -1493,
+        -1838, -953, -1932, -931,
+        -1499, -188, -1635, -421,
+        -1457, -338, -1448, -22,
+        -1942, -422, -2006, -249,
+        -496, -114, -1910, -755,
+        -1289, 174, -1451, -109,
+        -482, -257, -1221, -508,
+        -1617, 151, -1694, 208,
+        -654, 107, -1651, 29,
+        -1141, 279, -1215, 306,
+        -1228, -506, -730, -175,
+        -1236, -101, -969, 551,
+        -870, 278, -823, 315,
+        -563, 376, -1051, 228,
+        -507, 280, -599, 281,
+        -758, 253, -305, 379,
+        -755, -134, -611, 660,
+        -824, 536, -817, 646,
+        -413, 49, -341, 177,
+        -453, 526, -482, 589,
+        -71, 339, -657, 264,
+        -244, 295, -237, 315,
+        -387, 569, -506, -9,
+        -377, 14, -160, 661,
+        -216, 40, -308, -46,
+        95, 214, -242, 167,
+        -86, 192, -56, 27,
+        -76, 31, 36, 309,
+        -106, -182, -113, 74,
+        -441, -22, 23, 139,
+        81, -11, 44, 15,
+        -87, -137, -118, -207,
+        -158, -58, 272, -92,
+        -156, -441, 8, -136,
+        128, -221, 101, -218,
+        40, -197, -76, -456,
+        9, -445, 33, -423,
+        226, 60, 73, -222,
+        156, -399, 280, -318,
+        245, -341, 166, -499,
+        339, -190, 327, -219,
+        325, -137, -89, -596,
+        100, -627, 144, -677,
+        487, 28, 252, -391,
+        214, -41, 282, -28,
+        99, -286, 331, 49,
+        459, -388, 565, -369,
+        436, 28, 336, -9,
+        397, -167, 618, 34,
+        596, -17, 561, -140,
+        299, 79, 522, 125,
+        203, 2, 244, 288,
+        255, 211, 175, 82,
+        596, 187, 517, 108,
+        381, 255, 365, 297,
+        497, 352, 327, -82,
+        25, 210, 371, 245,
+        261, 3, 545, 449,
+        140, 294, 44, 295,
+        212, 347, 244, 494,
+        331, 528, 201, 307,
+        349, 411, 613, 284,
+        614, 413, 464, 322,
+        624, 397, 97, 200,
+        -160, 384, 149, 362,
+        495, 525, 269, 585,
+        33, 491, -121, 433,
+        427, 611, 498, 516,
+        171, 443, 497, 666,
+        440, 275, 566, 575,
+        146, 639, 155, 670,
+        -33, 173, 212, 696,
+        -166, 601, -191, 695,
+        -489, 503, 175, 742,
+        214, 476, 372, 1083,
+        578, 530, 586, 777,
+        425, 874, 315, 841,
+        374, 848, -165, 565,
+        35, 991, -39, 1062,
+        329, 712, 786, 840,
+        645, 795, 661, 676,
+        571, 918, 632, 1079,
+        673, 817, 318, 388,
+        874, 1012, 564, 848,
+        880, 620, 557, 479,
+        671, 453, 692, 468,
+        840, 642, 844, 645,
+        506, 428, 897, 567,
+        837, 387, 962, 499,
+        691, 561, 939, 926,
+        783, 296, 790, 268,
+        1028, 530, 874, 329,
+        548, 143, 675, 291,
+        503, 66, 1041, 359,
+        786, 97, 805, 33,
+        837, 470, 511, 49,
+        1092, 327, 1174, 323,
+        3, 242, 872, 474,
+        689, 429, 1329, 678,
+        1042, 620, 1109, 664,
+        321, 193, 889, 950,
+        1153, 874, 893, 635,
+        877, 862, 948, 913,
+        1293, 665, 1320, 639,
+        997, 793, 1402, 1030,
+        1176, 1012, 1110, 959,
+        1410, 925, 1403, 915,
+        543, 862, 1116, 1222,
+        835, 1190, 835, 1190,
+        959, 1148, 1147, 1376,
+        1300, 1193, 1415, 1231,
+        1335, 1341, 746, 1092,
+        1711, 1283, 1389, 1073,
+        1334, 1566, 1153, 1475,
+        1645, 1137, 1825, 1220,
+        1056, 1382, 1521, 1730,
+        1632, 1545, 1620, 1542,
+        855, 1596, 865, 1667,
+        693, 885, 1716, 1519,
+        1167, 1296, 2209, 1760,
+        1952, 1493, 2020, 1482,
+        1534, 1866, 1694, 2008,
+        1566, 748, 1761, 825,
+        294, 1392, 1084, 2058,
+        621, 1315, 365, 1287,
+        198, 1028, 488, 1408,
+        249, 403, 1014, 1561,
+        324, 363, 1645, 1044,
+        193, 367, 2034, 1859,
+        -251, 579, 750, 994,
+        -243, 30, 1325, 879,
+        -28, -169, 624, 917,
+        -453, 159, 186, 1370,
+        -614, 6, 537, 392,
+        -94, -291, 781, 229,
+        -128, -298, 245, 491,
+        -701, -648, 972, 789,
+        -501, -640, 178, 255,
+        -365, -390, -255, 317,
+        -958, -294, -191, 228,
+        -775, -447, 157, -237,
+        -657, -720, -407, 92,
+        -117, -611, 334, -230,
+        -679, -1084, -144, -317,
+        -901, -861, -738, -360,
+        -85, -727, -90, -787,
+        100, -22, -391, -263,
+        -56, -73, -337, -754,
+        5, -189, -706, -624,
+        89, -344, -135, -1113,
+        -353, -237, -684, -1135,
+        -275, -1102, -269, -1203,
+        152, 145, -722, -1232,
+        49, 80, -1248, -776,
+        -248, 391, -732, -547,
+        469, 218, -255, -864,
+        69, 366, -166, -485,
+        -688, 191, -1212, -1196,
+        -170, -169, -1308, -1631,
+        321, 470, -1419, -1243,
+        -64, 272, -1361, -248,
+        492, 565, -721, -609,
+        195, 485, -573, -133,
+        427, 202, -171, -118,
+        199, 575, 2, -31,
+        694, 755, -1366, -39,
+        552, 557, -489, 271,
+        680, 537, 13, -453,
+        855, 954, -133, -52,
+        -81, 738, -1169, 637,
+        1055, 1059, -95, 676,
+        1259, 1081, 489, 305,
+        -449, 954, -534, 996,
+        -969, 866, -1058, 1059,
+        -1294, 618, -1416, 617,
+        -458, 1366, -159, 1821,
+        -774, -528, -14, 1110,
+        -1202, -901, -772, 433,
+        -1256, -1255, -1011, -302,
+        -602, -585, -759, -1618,
+        -760, -1549, -840, -1921,
+        -816, -539, -1769, -2235,
+        -227, -36, -2034, -1831,
+        -2107, -1126, -2471, -1816,
+        -1470, 252, -2701, -415,
+        -571, -467, 1509, 1554,
+        2180, 1975, 2326, 2020
+    };
+
+    extern const Word16 dico4_lsf_5[DICO4_5_SIZE * 4] =
+    {
+        -1857, -1681, -1857, -1755,
+        -2056, -1150, -2134, -1654,
+        -1619, -1099, -1704, -1131,
+        -1345, -1608, -1359, -1638,
+        -1338, -1293, -1325, -1265,
+        -1664, -1649, -1487, -851,
+        -1346, -1832, -1413, -2188,
+        -1282, -681, -1785, -1649,
+        -966, -1082, -1183, -1676,
+        -1054, -1073, -1142, -1158,
+        -1207, -744, -1274, -997,
+        -934, -1383, -927, -1416,
+        -1010, -1305, -783, -955,
+        -1049, -900, -993, -817,
+        -737, -823, -972, -1189,
+        -738, -1094, -738, -1154,
+        -784, -801, -810, -786,
+        -892, -520, -1000, -818,
+        -644, -965, -577, -882,
+        -541, -694, -671, -917,
+        -595, -642, -646, -615,
+        -956, -621, -925, -515,
+        -727, -483, -815, -485,
+        -840, -578, -440, -713,
+        -578, -325, -657, -670,
+        -386, -570, -441, -666,
+        -514, -787, -392, -529,
+        -522, -453, -487, -423,
+        -616, -585, -617, -157,
+        -662, -268, -680, -348,
+        -322, -323, -632, -444,
+        -304, -430, -332, -458,
+        -277, -468, -659, -793,
+        -319, -636, -227, -554,
+        -373, -347, -334, -210,
+        -456, -192, -530, -242,
+        -216, -198, -366, -370,
+        -338, -161, -409, -748,
+        -107, -380, -294, -643,
+        -223, -665, -234, -741,
+        -141, -496, -130, -510,
+        -139, -327, -172, -305,
+        -306, -580, -164, -263,
+        -262, -172, -67, -402,
+        31, -366, -10, -436,
+        -86, -527, 71, -377,
+        -22, -609, -12, -678,
+        -67, -319, 63, -191,
+        35, -181, -39, -242,
+        126, -167, -140, -544,
+        155, -297, 174, -297,
+        38, -8, 117, -380,
+        197, -452, 240, -522,
+        223, -103, 110, -187,
+        87, -155, 169, -47,
+        157, 26, -83, -100,
+        128, 80, 209, -62,
+        6, 7, 22, 5,
+        318, -20, 248, -45,
+        -200, -63, 156, -69,
+        250, -183, 369, -126,
+        -113, -76, -142, -122,
+        -64, -254, -31, 35,
+        -177, -71, -7, 171,
+        93, 27, 108, 212,
+        -330, -209, -123, -70,
+        -279, 95, -96, 20,
+        -188, -61, -314, 87,
+        -300, -78, -354, -134,
+        11, 122, -140, 122,
+        -275, 152, -293, 140,
+        -82, 138, -321, -111,
+        -480, -156, -359, 76,
+        -254, -40, -635, -96,
+        -522, 79, -507, 8,
+        -268, 303, -539, 68,
+        -446, 61, -522, 306,
+        111, 189, -435, 122,
+        -379, 166, -571, -398,
+        -632, -74, -747, -95,
+        -455, 194, -952, 83,
+        -798, 192, -755, 192,
+        -781, -162, -619, 234,
+        -663, -297, -488, -109,
+        -964, -132, -838, -68,
+        -843, 58, -1112, -86,
+        -805, -299, -944, -253,
+        -778, -50, -965, -549,
+        -352, -98, -992, -343,
+        -1117, -315, -1117, -307,
+        -1155, -374, -637, -230,
+        -1166, -43, -1299, -100,
+        -925, -393, -1274, -600,
+        -689, -130, -1479, -312,
+        -1321, -254, -1464, -442,
+        -1292, -613, -1261, -503,
+        -1501, -368, -1322, 26,
+        -1432, -66, -1743, -161,
+        -1644, -467, -1760, -548,
+        -1393, -568, -1556, -871,
+        -1495, -1034, -1387, -571,
+        -1917, -528, -1783, -123,
+        -1897, -231, -2054, -323,
+        -2052, -906, -1976, -567,
+        -1917, -620, -2047, -989,
+        -1077, -370, -2031, -704,
+        -2355, -749, -2740, -1089,
+        -1909, 159, -2012, 248,
+        -626, -123, -2339, -962,
+        -669, -408, -1379, -1174,
+        -452, -364, -1044, -735,
+        -132, 183, -1620, -752,
+        -547, -307, -777, -1261,
+        -98, 41, -880, -1091,
+        -257, 97, -1602, -1833,
+        31, -26, -644, -561,
+        -180, -546, -385, -1095,
+        -410, -802, -414, -827,
+        -457, -970, -490, -1109,
+        -215, -916, -144, -937,
+        -493, -1269, -517, -1507,
+        181, 101, -332, -889,
+        -836, -937, -559, -429,
+        -629, -547, -183, -337,
+        -545, -82, -250, -286,
+        5, -132, -348, -252,
+        -293, -472, -158, 100,
+        -29, 197, -236, -424,
+        -861, -213, -140, -7,
+        -427, -443, 187, -97,
+        -684, -736, -293, 258,
+        -368, -152, -150, 392,
+        -609, 175, -142, 299,
+        -138, 152, -119, 329,
+        -486, -52, 293, 198,
+        -183, 117, 175, 331,
+        -58, -274, 231, 300,
+        -288, 330, -305, 372,
+        -111, 409, -9, 423,
+        83, 256, 67, 367,
+        -19, 248, 91, 113,
+        -35, 406, -191, 154,
+        238, 296, 5, 197,
+        141, 221, 313, 198,
+        211, 421, 244, 334,
+        88, 426, -243, 454,
+        202, 552, -5, 403,
+        291, 185, 219, 301,
+        251, 138, 128, 69,
+        197, 288, -140, -61,
+        188, 361, 197, 598,
+        442, 273, 290, 143,
+        472, 482, 157, 370,
+        415, 321, 372, 385,
+        402, 552, 155, 24,
+        550, 263, -11, 21,
+        360, 227, 147, -254,
+        424, 97, 366, -13,
+        375, 141, 449, 232,
+        396, 507, 474, 272,
+        701, 324, 362, -47,
+        587, 148, 543, 69,
+        400, -51, 561, 59,
+        220, -10, 352, 147,
+        206, 211, 653, 185,
+        563, 297, 565, 284,
+        594, 121, 766, 192,
+        398, 118, 642, 434,
+        233, 264, 481, 467,
+        129, -165, 699, 239,
+        90, 26, 342, 474,
+        -55, 27, 388, 94,
+        -172, 0, 725, 379,
+        -60, 337, 370, 465,
+        95, 319, 806, 595,
+        78, 260, 497, 851,
+        210, 560, 458, 574,
+        -464, 202, 497, 625,
+        -202, 152, 48, 712,
+        -20, 566, 100, 715,
+        455, 468, 411, 605,
+        319, 646, 195, 615,
+        401, 538, 680, 739,
+        201, 667, 434, 954,
+        454, 425, 646, 491,
+        606, 681, 416, 508,
+        497, 822, 426, 815,
+        660, 647, 628, 716,
+        697, 466, 618, 457,
+        685, 460, 365, 309,
+        721, 567, 836, 601,
+        609, 300, 825, 459,
+        943, 687, 681, 533,
+        915, 598, 591, 243,
+        876, 451, 874, 420,
+        786, 317, 732, 220,
+        922, 317, 1108, 367,
+        531, 466, 1028, 649,
+        1053, 615, 1034, 553,
+        829, 602, 1021, 799,
+        927, 803, 878, 763,
+        799, 496, 1373, 773,
+        585, 770, 803, 930,
+        1099, 793, 1222, 862,
+        1209, 895, 1025, 727,
+        772, 845, 1172, 1115,
+        867, 1021, 830, 1013,
+        841, 910, 506, 703,
+        1239, 1077, 620, 819,
+        1196, 1083, 1155, 1081,
+        1142, 907, 1547, 1121,
+        1309, 648, 1343, 612,
+        1484, 988, 1479, 937,
+        985, 1328, 955, 1341,
+        429, 910, 841, 1338,
+        564, 1179, 412, 1156,
+        1427, 1320, 1434, 1330,
+        640, 760, 1726, 1410,
+        190, 555, 1073, 1005,
+        426, 257, 839, 980,
+        235, 231, 1520, 1167,
+        109, 293, 1014, 1569,
+        305, 142, 1148, 539,
+        -291, -108, 1213, 972,
+        22, -216, 667, 828,
+        -482, 438, 453, 1431,
+        -581, -422, 789, 387,
+        -358, -454, 174, 780,
+        -36, -372, 390, -134,
+        -629, 160, -306, 751,
+        -1258, -331, 177, 522,
+        -248, 574, -251, 639,
+        -531, 407, -596, 394,
+        -419, 789, -617, 801,
+        -986, 399, -857, 727,
+        -7, 518, -703, 310,
+        -1143, -24, -1002, 287,
+        -960, 363, -1299, 312,
+        -1534, 245, -1557, 305,
+        28, 153, -859, -175,
+        -33, 332, -1398, -154,
+        212, 410, -593, -197,
+        -1092, -704, -904, -65,
+        282, 367, -918, -686,
+        345, 93, -258, -357,
+        696, 644, -693, -28,
+        448, 493, -273, 193,
+        527, 546, -243, -513,
+        384, -136, 273, -353,
+        512, -142, 537, -198,
+        941, 750, 83, 248,
+        578, 861, -56, 592,
+        842, 44, 892, 24,
+        33, 890, -16, 982,
+        831, 1398, 1535, 1898,
+        1716, 1376, 1948, 1465
+    };
+
+    extern const Word16 dico5_lsf_5[DICO5_5_SIZE * 4] =
+    {
+        -1002, -929, -1096, -1203,
+        -641, -931, -604, -961,
+        -779, -673, -835, -788,
+        -416, -664, -458, -766,
+        -652, -521, -662, -495,
+        -1023, -509, -1023, -428,
+        -444, -552, -368, -449,
+        -479, -211, -1054, -903,
+        -316, -249, -569, -591,
+        -569, -275, -541, -191,
+        -716, -188, -842, -264,
+        -333, -248, -318, -228,
+        -275, 1, -567, -228,
+        -115, -221, -238, -374,
+        -197, -507, -222, -579,
+        -258, -432, -61, -244,
+        -345, 2, -338, 39,
+        -215, -169, -58, 0,
+        -56, -6, -203, -131,
+        1, -186, -5, -211,
+        6, -380, 11, -418,
+        -116, 131, -134, 113,
+        89, -4, 71, -2,
+        -19, -192, 262, 24,
+        189, 151, -133, -109,
+        186, -153, 166, -219,
+        37, 139, 193, 171,
+        337, 124, 158, -61,
+        141, 226, -13, 190,
+        231, 34, 354, 109,
+        316, 201, 244, 164,
+        330, -85, 390, -84,
+        254, 327, 257, 335,
+        491, 147, 476, 105,
+        54, 77, 437, 370,
+        421, 314, 449, 342,
+        329, 126, 673, 292,
+        571, 388, 243, 193,
+        653, 320, 621, 280,
+        194, 380, 517, 581,
+        45, 323, 111, 422,
+        489, 395, 734, 534,
+        622, 546, 486, 502,
+        318, 572, 189, 550,
+        385, 422, -157, 153,
+        -125, 382, -197, 386,
+        -263, 334, 228, 697,
+        -188, 1, 51, 297,
+        -507, 213, -376, 397,
+        -24, 255, -547, 89,
+        -502, -94, 387, 179,
+        -620, 68, -684, 112,
+        -642, -350, -260, 172,
+        -438, -324, 264, 648,
+        -964, -4, -1121, 7,
+        -134, 134, -1133, -306,
+        143, 96, -420, -497,
+        -1221, -350, -1527, -685,
+        -161, 72, 873, 691,
+        732, 283, 921, 353,
+        334, 475, 1095, 821,
+        864, 524, 843, 497,
+        714, 711, 788, 750,
+        1076, 714, 1204, 753
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] q_plsf_5.tab,  UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/qua_gain_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/qua_gain_tbl.cpp
new file mode 100644
index 0000000..52f77e9
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/qua_gain_tbl.cpp
@@ -0,0 +1,390 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/qua_gain_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, qua_gain.tab
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                               Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "qua_gain.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    /* The tables contains the following data:
+     *
+     *    g_pitch        (Q14),
+     *    g_fac          (Q12), (g_code = g_code0*g_fac),
+     *    qua_ener_MR122 (Q10), (log2(g_fac))
+     *    qua_ener       (Q10)  (20*log10(g_fac))
+     *
+     *    The log2() and log10() values are calculated on the fixed point value
+     *    (g_fac Q12) and not on the original floating point value of g_fac
+     *    to make the quantizer/MA predictdor use corresponding values.
+     */
+
+    /* table used in 'high' rates: MR67 MR74 */
+
+    extern const Word16 table_gain_highrates[VQ_SIZE_HIGHRATES*4] =
+    {
+
+        /*
+         * Note: column 4 (qua_ener) contains the original values from IS641
+         *       to ensure bit-exactness; however, they are not exactly the
+         *       rounded value of (20*log10(g_fac))
+         *
+         */
+
+        /*g_pit,    g_fac,  qua_ener_MR122, qua_ener */
+        577,      662,           -2692,   -16214,
+        806,     1836,           -1185,    -7135,
+        3109,     1052,           -2008,   -12086,
+        4181,     1387,           -1600,    -9629,
+        2373,     1425,           -1560,    -9394,
+        3248,     1985,           -1070,    -6442,
+        1827,     2320,            -840,    -5056,
+        941,     3314,            -313,    -1885,
+        2351,     2977,            -471,    -2838,
+        3616,     2420,            -777,    -4681,
+        3451,     3096,            -414,    -2490,
+        2955,     4301,              72,      434,
+        1848,     4500,             139,      836,
+        3884,     5416,             413,     2484,
+        1187,     7210,             835,     5030,
+        3083,     9000,            1163,     7002,
+        7384,      883,           -2267,   -13647,
+        5962,     1506,           -1478,    -8900,
+        5155,     2134,            -963,    -5800,
+        7944,     2009,           -1052,    -6335,
+        6507,     2250,            -885,    -5327,
+        7670,     2752,            -588,    -3537,
+        5952,     3016,            -452,    -2724,
+        4898,     3764,            -125,     -751,
+        6989,     3588,            -196,    -1177,
+        8174,     3978,             -43,     -260,
+        6064,     4404,             107,      645,
+        7709,     5087,             320,     1928,
+        5523,     6021,             569,     3426,
+        7769,     7126,             818,     4926,
+        6060,     7938,             977,     5885,
+        5594,    11487,            1523,     9172,
+        10581,     1356,           -1633,    -9831,
+        9049,     1597,           -1391,    -8380,
+        9794,     2035,           -1033,    -6220,
+        8946,     2415,            -780,    -4700,
+        10296,     2584,            -681,    -4099,
+        9407,     2734,            -597,    -3595,
+        8700,     3218,            -356,    -2144,
+        9757,     3395,            -277,    -1669,
+        10177,     3892,             -75,     -454,
+        9170,     4528,             148,      891,
+        10152,     5004,             296,     1781,
+        9114,     5735,             497,     2993,
+        10500,     6266,             628,     3782,
+        10110,     7631,             919,     5534,
+        8844,     8727,            1117,     6728,
+        8956,    12496,            1648,     9921,
+        12924,      976,           -2119,   -12753,
+        11435,     1755,           -1252,    -7539,
+        12138,     2328,            -835,    -5024,
+        11388,     2368,            -810,    -4872,
+        10700,     3064,            -429,    -2580,
+        12332,     2861,            -530,    -3192,
+        11722,     3327,            -307,    -1848,
+        11270,     3700,            -150,     -904,
+        10861,     4413,             110,      663,
+        12082,     4533,             150,      902,
+        11283,     5205,             354,     2132,
+        11960,     6305,             637,     3837,
+        11167,     7534,             900,     5420,
+        12128,     8329,            1049,     6312,
+        10969,    10777,            1429,     8604,
+        10300,    17376,            2135,    12853,
+        13899,     1681,           -1316,    -7921,
+        12580,     2045,           -1026,    -6179,
+        13265,     2439,            -766,    -4610,
+        14033,     2989,            -465,    -2802,
+        13452,     3098,            -413,    -2482,
+        12396,     3658,            -167,    -1006,
+        13510,     3780,            -119,     -713,
+        12880,     4272,              62,      374,
+        13533,     4861,             253,     1523,
+        12667,     5457,             424,     2552,
+        13854,     6106,             590,     3551,
+        13031,     6483,             678,     4084,
+        13557,     7721,             937,     5639,
+        12957,     9311,            1213,     7304,
+        13714,    11551,            1532,     9221,
+        12591,    15206,            1938,    11667,
+        15113,     1540,           -1445,    -8700,
+        15072,     2333,            -832,    -5007,
+        14527,     2511,            -723,    -4352,
+        14692,     3199,            -365,    -2197,
+        15382,     3560,            -207,    -1247,
+        14133,     3960,             -50,     -300,
+        15102,     4236,              50,      298,
+        14332,     4824,             242,     1454,
+        14846,     5451,             422,     2542,
+        15306,     6083,             584,     3518,
+        14329,     6888,             768,     4623,
+        15060,     7689,             930,     5602,
+        14406,     9426,            1231,     7413,
+        15387,     9741,            1280,     7706,
+        14824,    14271,            1844,    11102,
+        13600,    24939,            2669,    16067,
+        16396,     1969,           -1082,    -6517,
+        16817,     2832,            -545,    -3283,
+        15713,     2843,            -539,    -3248,
+        16104,     3336,            -303,    -1825,
+        16384,     3963,             -49,     -294,
+        16940,     4579,             165,      992,
+        15711,     4599,             171,     1030,
+        16222,     5448,             421,     2537,
+        16832,     6382,             655,     3945,
+        15745,     7141,             821,     4944,
+        16326,     7469,             888,     5343,
+        16611,     8624,            1100,     6622,
+        17028,    10418,            1379,     8303,
+        15905,    11817,            1565,     9423,
+        16878,    14690,            1887,    11360,
+        16515,    20870,            2406,    14483,
+        18142,     2083,            -999,    -6013,
+        19401,     3178,            -375,    -2257,
+        17508,     3426,            -264,    -1589,
+        20054,     4027,             -25,     -151,
+        18069,     4249,              54,      326,
+        18952,     5066,             314,     1890,
+        17711,     5402,             409,     2461,
+        19835,     6192,             610,     3676,
+        17950,     7014,             795,     4784,
+        21318,     7877,             966,     5816,
+        17910,     9289,            1210,     7283,
+        19144,     9290,            1210,     7284,
+        20517,    11381,            1510,     9089,
+        18075,    14485,            1866,    11234,
+        19999,    17882,            2177,    13108,
+        18842,    32764,            3072,    18494
+    };
+
+
+    /* table used in 'low' rates: MR475, MR515, MR59 */
+
+    extern const Word16 table_gain_lowrates[VQ_SIZE_LOWRATES*4] =
+    {
+        /*g_pit,    g_fac,  qua_ener_MR122, qua_ener */
+        10813,    28753,            2879,    17333,
+        20480,     2785,            -570,    -3431,
+        18841,     6594,             703,     4235,
+        6225,     7413,             876,     5276,
+        17203,    10444,            1383,     8325,
+        21626,     1269,           -1731,   -10422,
+        21135,     4423,             113,      683,
+        11304,     1556,           -1430,    -8609,
+        19005,    12820,            1686,    10148,
+        17367,     2498,            -731,    -4398,
+        17858,     4833,             244,     1472,
+        9994,     2498,            -731,    -4398,
+        17530,     7864,             964,     5802,
+        14254,     1884,           -1147,    -6907,
+        15892,     3153,            -387,    -2327,
+        6717,     1802,           -1213,    -7303,
+        18186,    20193,            2357,    14189,
+        18022,     3031,            -445,    -2678,
+        16711,     5857,             528,     3181,
+        8847,     4014,             -30,     -180,
+        15892,     8970,            1158,     6972,
+        18022,     1392,           -1594,    -9599,
+        16711,     4096,               0,        0,
+        8192,      655,           -2708,   -16305,
+        15237,    13926,            1808,    10884,
+        14254,     3112,            -406,    -2444,
+        14090,     4669,             193,     1165,
+        5406,     2703,            -614,    -3697,
+        13434,     6553,             694,     4180,
+        12451,      901,           -2237,   -13468,
+        12451,     2662,            -637,    -3833,
+        3768,      655,           -2708,   -16305,
+        14745,    23511,            2582,    15543,
+        19169,     2457,            -755,    -4546,
+        20152,     5079,             318,     1913,
+        6881,     4096,               0,        0,
+        20480,     8560,            1089,     6556,
+        19660,      737,           -2534,   -15255,
+        19005,     4259,              58,      347,
+        7864,     2088,            -995,    -5993,
+        11468,    12288,            1623,     9771,
+        15892,     1474,           -1510,    -9090,
+        15728,     4628,             180,     1086,
+        9175,     1433,           -1552,    -9341,
+        16056,     7004,             793,     4772,
+        14827,      737,           -2534,   -15255,
+        15073,     2252,            -884,    -5321,
+        5079,     1228,           -1780,   -10714,
+        13271,    17326,            2131,    12827,
+        16547,     2334,            -831,    -5002,
+        15073,     5816,             518,     3118,
+        3932,     3686,            -156,     -938,
+        14254,     8601,            1096,     6598,
+        16875,      778,           -2454,   -14774,
+        15073,     3809,            -107,     -646,
+        6062,      614,           -2804,   -16879,
+        9338,     9256,            1204,     7251,
+        13271,     1761,           -1247,    -7508,
+        13271,     3522,            -223,    -1343,
+        2457,     1966,           -1084,    -6529,
+        11468,     5529,             443,     2668,
+        10485,      737,           -2534,   -15255,
+        11632,     3194,            -367,    -2212,
+        1474,      778,           -2454,   -14774
+    };
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] qua_gain.tab,  UMTS GSM AMR speech codec,
+                    R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/reorder.cpp b/media/libstagefright/codecs/amrnb/common/src/reorder.cpp
new file mode 100644
index 0000000..b1e4711
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/reorder.cpp
@@ -0,0 +1,199 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Filename: /audio/gsm_amr/c/src/reorder.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+              1. Eliminated unused include file add.h.
+              2. Replaced array addressing by pointers
+              3. Eliminated math operations that unnecessary checked for
+                 saturation
+              4. Replaced loop counter with decrement loops
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "reorder.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Reorder_lsf
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf = vector of LSFs   (range: 0<=val<=0.5)(Word16)
+    min_dist = minimum required distance (Word16)
+    n = LPC order (Word16)
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the add operation called by Reorder_lsf() results in
+     overflow
+    lsf -> reordered vector of LSFs (Word16)
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function makes sure that the LSFs are properly ordered keeps a certain
+ minimum distance between adjacent LSFs.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] reorder.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Reorder_lsf (
+    Word16 *lsf,        // (i/o)     : vector of LSFs   (range: 0<=val<=0.5)
+    Word16 min_dist,    // (i)       : minimum required distance
+    Word16 n            // (i)       : LPC order
+)
+{
+    Word16 i;
+    Word16 lsf_min;
+
+// The reference ETSI code uses a global flag for Overflow. In the actual
+// implementation a pointer to Overflow flag is passed into the function
+// for use by the math functions add() and sub()
+
+    lsf_min = min_dist;
+    for (i = 0; i < n; i++)
+    {
+        if (sub (lsf[i], lsf_min) < 0)
+        {
+            lsf[i] = lsf_min;
+        }
+        lsf_min = add (lsf[i], min_dist);
+    }
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void Reorder_lsf(
+    Word16 *lsf,        /* (i/o)    : vector of LSFs   (range: 0<=val<=0.5) */
+    Word16 min_dist,    /* (i)      : minimum required distance             */
+    Word16 n,           /* (i)      : LPC order                             */
+    Flag   *pOverflow   /* (i/o)    : Overflow flag                         */
+)
+{
+    Word16 i;
+    Word16 lsf_min;
+    Word16 *p_lsf = &lsf[0];
+    OSCL_UNUSED_ARG(pOverflow);
+
+    lsf_min = min_dist;
+    for (i = 0; i < n; i++)
+    {
+        if (*(p_lsf) < lsf_min)
+        {
+            *(p_lsf++) = lsf_min;
+            lsf_min +=  min_dist;
+        }
+        else
+        {
+            lsf_min = *(p_lsf++) + min_dist;
+        }
+    }
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/residu.cpp b/media/libstagefright/codecs/amrnb/common/src/residu.cpp
new file mode 100644
index 0000000..b25d3be
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/residu.cpp
@@ -0,0 +1,255 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/residu.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing code.
+
+ Description: Deleted stores listed in the Local Stores Needed/Modified
+          section.
+
+ Description: Updated file per comments gathered from Phase 2/3 review.
+
+ Description: Updating to reflect variable name changes made in residu.asm
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Modified FOR loops to count down.
+              2. Fixed typecasting issue with TI C compiler.
+
+ Description: Made the following changes
+              1. Unrolled the convolutional loop.
+              2. Performed 4 convolution per pass to avoid recalling the same
+                 filter coefficient as many times.
+              2. Eliminated math operations that check for saturation.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "residu.h"
+#include "typedef.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Residu
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    coef_ptr = pointer to buffer containing the prediction coefficients
+    input_ptr = pointer to buffer containing the speech signal
+    input_len = filter order
+    residual_ptr = pointer to buffer of residual signal
+
+ Outputs:
+    residual_ptr buffer contains the newly calculated the residual signal
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes the LP residual by filtering the input speech through
+ the LP inverse filter A(z).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ residu.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Note: Input argument names were changed to be more descriptive. Shown below
+       are the original names. Shown below are the name changes:
+           a[]  <-->  coef_ptr[]
+           x[]  <-->  input_ptr[]
+           y[]  <-->  residual_ptr[]
+           lg   <-->  input_len
+
+
+void Residu (
+    Word16 a[], // (i)     : prediction coefficients
+    Word16 x[], // (i)     : speech signal
+    Word16 y[], // (o)     : residual signal
+    Word16 lg   // (i)     : size of filtering
+)
+{
+    Word16 i, j;
+    Word32 s;
+
+    for (i = 0; i < lg; i++)
+    {
+        s = L_mult (x[i], a[0]);
+        for (j = 1; j <= M; j++)
+        {
+            s = L_mac (s, a[j], x[i - j]);
+        }
+        s = L_shl (s, 3);
+        y[i] = pv_round (s);
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Residu(
+    Word16 coef_ptr[],      /* (i)     : prediction coefficients*/
+    Word16 input_ptr[],     /* (i)     : speech signal          */
+    Word16 residual_ptr[],  /* (o)     : residual signal        */
+    Word16 input_len        /* (i)     : size of filtering      */
+)
+{
+
+
+    register Word16 i, j;
+    Word32 s1;
+    Word32 s2;
+    Word32 s3;
+    Word32 s4;
+    Word16 *p_input1;
+    Word16 *p_input2;
+    Word16 *p_input3;
+    Word16 *p_input4;
+    Word16 *p_coef;
+    Word16 *p_residual_ptr = &residual_ptr[input_len-1];
+    Word16 *p_input_ptr    = &input_ptr[input_len-1-M];
+
+    for (i = input_len >> 2; i != 0; i--)
+    {
+        s1       = 0x0000800L;
+        s2       = 0x0000800L;
+        s3       = 0x0000800L;
+        s4       = 0x0000800L;
+        p_coef  = &coef_ptr[M];
+        p_input1 = p_input_ptr--;
+        p_input2 = p_input_ptr--;
+        p_input3 = p_input_ptr--;
+        p_input4 = p_input_ptr--;
+
+        for (j = M >> 1; j != 0; j--)
+        {
+            s1 += ((Word32) * (p_coef) * *(p_input1++));
+            s2 += ((Word32) * (p_coef) * *(p_input2++));
+            s3 += ((Word32) * (p_coef) * *(p_input3++));
+            s4 += ((Word32) * (p_coef--) * *(p_input4++));
+            s1 += ((Word32) * (p_coef) * *(p_input1++));
+            s2 += ((Word32) * (p_coef) * *(p_input2++));
+            s3 += ((Word32) * (p_coef) * *(p_input3++));
+            s4 += ((Word32) * (p_coef--) * *(p_input4++));
+        }
+
+        s1 += (((Word32) * (p_coef)) * *(p_input1));
+        s2 += (((Word32) * (p_coef)) * *(p_input2));
+        s3 += (((Word32) * (p_coef)) * *(p_input3));
+        s4 += (((Word32) * (p_coef)) * *(p_input4));
+
+        *(p_residual_ptr--) = (Word16)(s1 >> 12);
+        *(p_residual_ptr--) = (Word16)(s2 >> 12);
+        *(p_residual_ptr--) = (Word16)(s3 >> 12);
+        *(p_residual_ptr--) = (Word16)(s4 >> 12);
+
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/round.cpp b/media/libstagefright/codecs/amrnb/common/src/round.cpp
new file mode 100644
index 0000000..71d1702
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/round.cpp
@@ -0,0 +1,195 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/round.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the round function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Made changes based on review meeting:
+              1. Removed long in Inputs Definitions.
+              2. Changed L_var1 to var_out and description in
+                 Output Definitions.
+
+ Description: Added a parameter to the function interface, pOverflow which is
+              a pointer to the overflow flag. This flag is required by the
+              L_add() function invoked by round().
+              Removed code that updates the MOPS counter.
+              Created a new return variable result.
+
+ Description: Removed embedded tabs. Included comment in the Pseudo code
+              Section about using pointer to overflow flag in the actual
+              implementation instead of using a global flag.
+
+ Description: Changed function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Rounding function with saturation.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: pv_round
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_var1 = 32 bit signed integer (Word32) whose value falls
+             in the range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    None
+
+ Returns:
+        result = MS 16 bits of rounded input L_var1.
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function rounds 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:
+    pv_round(L_var1) = extract_h(L_add(L_var1,32768))
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] round() function in basic_op2.c,  UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 pv_round (Word32 L_var1)
+{
+    Word16 var_out;
+    Word32 L_rounded;
+
+* The reference ETSI code uses a global flag for Overflow in the L_add() function.
+* In the actual implementation a pointer to Overflow flag is passed in as a
+* parameter to the function.
+
+    L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+#if (WMOPS)
+    multiCounter[currCounter].L_add--;
+#endif
+    var_out = extract_h (L_rounded);
+#if (WMOPS)
+    multiCounter[currCounter].extract_h--;
+    multiCounter[currCounter].round++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 pv_round(register Word32 L_var1, Flag *pOverflow)
+{
+    Word16  result;
+
+    L_var1 = L_add(L_var1, (Word32) 0x00008000L, pOverflow);
+    result = (Word16)(L_var1 >> 16);
+
+    return (result);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/set_zero.cpp b/media/libstagefright/codecs/amrnb/common/src/set_zero.cpp
new file mode 100644
index 0000000..be23b25
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/set_zero.cpp
@@ -0,0 +1,74 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : set_zero.h
+*
+********************************************************************************
+*/
+/*
+********************************************************************************
+*                         MODULE INCLUDE FILE AND VERSION ID
+********************************************************************************
+*/
+#include "set_zero.h"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+#include "basic_op.h"
+
+/*
+********************************************************************************
+*                         PUBLIC PROGRAM CODE
+********************************************************************************
+*/
+void Set_zero(
+    Word16 x[],         /* (o)    : vector to clear     */
+    Word16 L            /* (i)    : length of vector    */
+)
+{
+    Word16 i;
+
+    for (i = 0; i < L; i++)
+    {
+        x[i] = 0;
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/shr.cpp b/media/libstagefright/codecs/amrnb/common/src/shr.cpp
new file mode 100644
index 0000000..775dc69
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/shr.cpp
@@ -0,0 +1,258 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/shr.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the shr function. Sync'ed up with
+          the current template and fixed tabs.
+
+ Description: 1. Modified code by seperating var2=0 condition.
+              2. Changed Input range definitions.
+
+ Description: Made changes based on review meeting.
+              1. Changed Overflow definition.
+              2. Removed pseudo-code.
+              3. Deleted (var2>15&&var1!=0) condition.
+              4. Moved var2>0 condition in front of var2<0 condition.
+
+ Description: Changed the function prototype to pass in a pointer to the
+              overflow flag instead of using global data.
+
+ Description: Made changes per formal review. Updated template.
+              Removed code that updates MOPS counter.
+              Changed parameter name from "overflow" and "pOverflow".
+              Optimized code by eliminating unnecessary typecasting.
+              Filled in the PSEUDO CODE section
+
+ Description: Further optimized typecasting for overflow case
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+ Shift right function with overflow control
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: shr
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ 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 <= var2 <= 0x0000 7fff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the shift operation resulted in overflow
+
+ Returns:
+    product = Shifted result limited to 16 bits (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function arithmetically shifts 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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+ None
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] shr() function in basic_op2.c,  UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 shr_std (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 < 0)
+    {
+        if (var2 < -16)
+            var2 = -16;
+        var_out = shl_std (var1, -var2);
+#if (WMOPS)
+        mult_stdiCounter[currCounter].shl_std--;
+#endif
+    }
+    else
+    {
+        if (var2 >= 15)
+        {
+            var_out = (var1 < 0) ? -1 : 0;
+        }
+        else
+        {
+            if (var1 < 0)
+            {
+                var_out = ~((~var1) >> var2);
+            }
+            else
+            {
+                var_out = var1 >> var2;
+            }
+        }
+    }
+
+#if (WMOPS)
+    mult_stdiCounter[currCounter].shr_std++;
+#endif
+    return (var_out);
+}
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 shr(register Word16 var1, register Word16 var2, Flag *pOverflow)
+{
+    register Word16 result;
+    register Word32 temp_res;
+
+    if (var2 != 0)
+    {
+        if (var2 > 0)
+        {
+            if (var2 >= 15)
+            {
+                result = ((var1 < 0) ? -1 : 0);
+            }
+            else
+            {
+                if (var1 < 0)
+                {
+                    result = (~((~var1) >> var2));
+                }
+                else
+                {
+                    result = (var1 >> var2);
+                }
+            }
+        }
+        else
+        {
+            if (var2 < -16)
+            {
+                var2 = -16;
+            }
+
+            var2 = -var2;   /* Shift right negative is equivalent */
+            /*   to shifting left positive.       */
+
+            temp_res = ((Word32) var1) << var2;
+            result = (Word16)(temp_res);
+
+            if (temp_res != (Word32) result)
+            {
+                *pOverflow = 1;
+                result = ((var1 > 0) ? MAX_16 : MIN_16);
+            }
+        }
+
+    }
+    else
+    {
+        result = var1;
+    }
+
+    return (result);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/shr_r.cpp b/media/libstagefright/codecs/amrnb/common/src/shr_r.cpp
new file mode 100644
index 0000000..6656f93
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/shr_r.cpp
@@ -0,0 +1,226 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./gsm-amr/c/src/shr_r.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the shr_r function. Sync'ed up
+          with the current template and fixed tabs.
+
+ Description: Passing around pOverflow as per EPOC changes.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ 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 <= var2 <= 0x0000 7fff.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    var_out = shifted input w/ rounding (Word16)
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function arithmetically shifts the 16 bit input var1 right var2 positions
+ with rounding. If var2 is negative, arithmetically shift var1 left by
+ -var2 with rounding. Saturate the result in case of underflows or
+ overflows.
+
+    - If var2 is greater than zero :
+        if (sub(shl(shr(var1,var2),1),shr(var1,sub(var2,1))))
+        is equal to zero
+        then
+            shr_r(var1,var2) = shr(var1,var2)
+        else
+            shr_r(var1,var2) = add(shr(var1,var2),1)
+    - If var2 is less than or equal to zero :
+        shr_r(var1,var2) = shr(var1,var2).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] basicop2.c, ETS Version 2.0.0, February 8, 1999
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 shr_r (Word16 var1, Word16 var2)
+{
+    Word16 var_out;
+
+    if (var2 > 15)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        var_out = shr (var1, var2);
+#if (WMOPS)
+        multiCounter[currCounter].shr--;
+#endif
+
+        if (var2 > 0)
+        {
+            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+            {
+                var_out++;
+            }
+        }
+    }
+#if (WMOPS)
+    multiCounter[currCounter].shr_r++;
+#endif
+    return (var_out);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+Word16 shr_r(register Word16 var1, register Word16 var2, Flag *pOverflow)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Word16 var_out;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    if (var2 > 15)
+    {
+        var_out = 0;
+    }
+    else
+    {
+        var_out = shr(var1, var2, pOverflow);
+        if (var2 > 0)
+        {
+            if ((var1 & ((Word16) 1 << (var2 - 1))) != 0)
+            {
+                var_out++;
+            }
+        }
+    }
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return (var_out);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/sqrt_l.cpp b/media/libstagefright/codecs/amrnb/common/src/sqrt_l.cpp
new file mode 100644
index 0000000..8f74aa6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/sqrt_l.cpp
@@ -0,0 +1,266 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/sqrt_l.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Updated template. Changed function interface to pass in a
+              pointer to overflow flag into the function instead of using a
+              global flag. Changed name of an input pointer from "exp" to "pExp"
+              for clarity. Removed inclusion of unwanted header files.
+
+ Description: Removed inclusion of sqrt_l.tab file. Changed the array name
+              "table" to "sqrt_l_tbl". Fixed typos.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "sqrt_l.h"
+#include    "typedef.h"
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: sqrt_l_exp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    L_x = input value (Word32)
+    pExp = pointer to right shift to be applied to result
+    pOverflow = pointer to overflow flag
+
+ Outputs:
+    pOverflow -> if the Inv_sqrt operation resulted in an overflow.
+
+ Returns:
+    L_y = squareroot of L_x (Word32)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function computes sqrt(L_x),  where  L_x is positive.
+ If L_var is negative or zero, the result is 0
+
+ The function sqrt(L_x) is approximated by a table and linear
+ interpolation. The square root is computed using the
+ following steps:
+    1- Normalization of L_x.
+    2- If exponent is even then shift right once.
+    3- exponent = exponent/2
+    4- i = bit25-b31 of L_x;  16<=i<=63  because of normalization.
+    5- a = bit10-b24
+    6- i -=16
+    7- L_y = table[i]<<16 - (table[i] - table[i+1]) * a * 2
+    8- return L_y and exponent so caller can do denormalization
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ sqrt_l.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word32 sqrt_l_exp (     // o : output value
+    Word32 L_x,         // i : input value
+    Word16 *exp         // o : right shift to be applied to result
+)
+{
+
+//          y = sqrt(x)
+//          x = f * 2^-e,   0.5 <= f < 1   (normalization)
+//          y = sqrt(f) * 2^(-e/2)
+//
+//          a) e = 2k   --> y = sqrt(f)   * 2^-k  (k = e div 2,
+//                                                 0.707 <= sqrt(f) < 1)
+//          b) e = 2k+1 --> y = sqrt(f/2) * 2^-k  (k = e div 2,
+                                                 0.5 <= sqrt(f/2) < 0.707)
+
+
+    Word16 e, i, a, tmp;
+    Word32 L_y;
+
+    if (L_x <= (Word32) 0)
+    {
+        *exp = 0;
+        return (Word32) 0;
+    }
+
+* The reference ETSI code uses a global Overflow flag. In the actual
+* implementation a pointer to the overflow flag is passed into the function.
+* This pointer is in turn passed into the basic math functions such as add(),
+* L_shl(), L_shr(), sub() called by this module.
+
+    e = norm_l (L_x) & 0xFFFE;              // get next lower EVEN norm. exp
+    L_x = L_shl (L_x, e);                   // L_x is normalized to [0.25..1)
+    *exp = e;                               // return 2*exponent (or Q1)
+
+    L_x = L_shr (L_x, 9);
+    i = extract_h (L_x);                    // Extract b25-b31, 16 <= i <= 63
+                                                because of normalization
+    L_x = L_shr (L_x, 1);
+    a = extract_l (L_x);                    // Extract b10-b24
+    a = a & (Word16) 0x7fff;
+
+    i = sub (i, 16);                        // 0 <= i <= 47
+
+    L_y = L_deposit_h (table[i]);           // table[i] << 16
+    tmp = sub (table[i], table[i + 1]);     // table[i] - table[i+1])
+    L_y = L_msu (L_y, tmp, a);              // L_y -= tmp*a*2
+
+    return (L_y);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word32 sqrt_l_exp(      /* o : output value,                          Q31 */
+    Word32 L_x,         /* i : input value,                           Q31 */
+    Word16 *pExp,       /* o : right shift to be applied to result,   Q1  */
+    Flag   *pOverflow   /* i : pointer to overflow flag */
+)
+
+{
+    Word16 e;
+    Word16 i;
+    Word16 a;
+    Word16 tmp;
+    Word32 L_y;
+
+    /*
+          y = sqrt(x)
+          x = f * 2^-e,   0.5 <= f < 1   (normalization)
+          y = sqrt(f) * 2^(-e/2)
+          a) e = 2k   --> y = sqrt(f)   * 2^-k  (k = e div 2,
+                                                 0.707 <= sqrt(f) < 1)
+          b) e = 2k+1 --> y = sqrt(f/2) * 2^-k  (k = e div 2,
+                                                 0.5 <= sqrt(f/2) < 0.707)
+     */
+
+    if (L_x <= (Word32) 0)
+    {
+        *pExp = 0;
+        return (Word32) 0;
+    }
+
+    e = norm_l(L_x) & 0xFFFE;               /* get next lower EVEN norm. exp  */
+    L_x = L_shl(L_x, e, pOverflow);         /* L_x is normalized to [0.25..1) */
+    *pExp = e;                              /* return 2*exponent (or Q1)      */
+
+    L_x >>= 10;
+    i = (Word16)(L_x >> 15) & 63;            /* Extract b25-b31, 16<= i <=63  */
+    /* because of normalization       */
+
+    a = (Word16)(L_x);                      /* Extract b10-b24 */
+    a &= (Word16) 0x7fff;
+
+    if (i > 15)
+    {
+        i -= 16;                              /* 0 <= i <= 47                   */
+    }
+
+    L_y = L_deposit_h(sqrt_l_tbl[i]);       /* sqrt_l_tbl[i] << 16            */
+
+    /* sqrt_l_tbl[i] - sqrt_l_tbl[i+1]) */
+    tmp = sub(sqrt_l_tbl[i], sqrt_l_tbl[i + 1], pOverflow);
+
+    L_y = L_msu(L_y, tmp, a, pOverflow);    /* L_y -= tmp*a*2                 */
+
+    /* L_y = L_shr (L_y, *exp); */          /* denormalization done by caller */
+
+    return (L_y);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/sqrt_l_tbl.cpp b/media/libstagefright/codecs/amrnb/common/src/sqrt_l_tbl.cpp
new file mode 100644
index 0000000..5e9898c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/sqrt_l_tbl.cpp
@@ -0,0 +1,170 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/sqrt_l_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed the table name to sqrt_l_tbl.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the declaration for sqrt_l_table[] used by the sqrt_l_exp
+ function.
+
+    sqrt_l_tbl[i] = sqrt((i+16)*2^-6) * 2^15, i.e. sqrt(x) scaled Q15
+
+ ------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+    extern const Word16 sqrt_l_tbl[50] =
+    {
+        16384, 16888, 17378, 17854, 18318, 18770, 19212, 19644, 20066, 20480,
+        20886, 21283, 21674, 22058, 22435, 22806, 23170, 23530, 23884, 24232,
+        24576, 24915, 25249, 25580, 25905, 26227, 26545, 26859, 27170, 27477,
+        27780, 28081, 28378, 28672, 28963, 29251, 29537, 29819, 30099, 30377,
+        30652, 30924, 31194, 31462, 31727, 31991, 32252, 32511, 32767, 32767
+    };
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] inv_sqrt.tab file,  UMTS GSM AMR speech codec, R99 - Version 3.2.0,
+ March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/sub.cpp b/media/libstagefright/codecs/amrnb/common/src/sub.cpp
new file mode 100644
index 0000000..d936128
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/sub.cpp
@@ -0,0 +1,218 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: /audio/gsm_amr/c/src/sub.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created separate file for the sub function. Sync'ed up with the
+          current template and fixed tabs.
+
+ Description: Changed all occurrences of L_diff to diff, deleted "short" in
+          the definition of var1 and var2, and fixed the range values.
+
+ Description: Changed function prototype passing in a pointer to overflow flag
+              instead of using global data.
+
+ Description: Changes made per formal review comments.
+              1. Changed the parameter name fron "overflow" to "pOverflow"
+              2. Updated template
+              3. Updated reference section
+
+ Description: Removed conditional code that updates WMOPS counter
+
+ Description:
+              1. Modified if-else structure to save cycles by processing
+                 the most common case faster.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Subtraction function with overflow control
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: sub
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ 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 <= var2 <= 0x0000 7fff.
+
+    pOverflow = pointer to overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the subtract operation resulted in overflow
+
+ Returns:
+    diff = 16-bit limited difference between var1 and var2 (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the subtraction (var1-var2) with overflow control and
+ saturation; the 16 bit result is set at +32767 when overflow occurs or at
+ -32768 when underflow occurs.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] sub() function in basicop2.c, UMTS GSM AMR speech codec, R99 -
+ Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+
+ PSEUDO-CODE
+
+ Word16 sub (Word16 var1, Word16 var2)
+ {
+    Word16 var_out;
+    Word32 diff;
+
+    diff = (Word32) var1 - var2;
+
+* The reference ETSI code uses a global flag for Overflow inside the function
+* saturate(). In the actual implementation a pointer to Overflow flag is passed
+* in as a parameter to the function
+
+    var_out = saturate (diff);
+
+ #if (WMOPS)
+    multiCounter[currCounter].sub++;
+ #endif
+
+    return (var_out);
+ }
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Word16 sub(Word16 var1, Word16 var2, Flag *pOverflow)
+{
+
+    Word32 diff;
+
+    diff = (Word32) var1 - var2;
+
+    /* Saturate result (if necessary). */
+    /* Replaced function call with in-line code             */
+    /*  to conserve MIPS, i.e., var_out = saturate (diff)  */
+
+
+    if ((UWord32)(diff - 0xFFFF8000L) > 0x000FFFF)
+    {
+        if (diff > (Word32) 0x0007FFFL)
+        {
+            diff = MAX_16;
+        }
+        else
+        {
+            diff = MIN_16;
+        }
+
+        *pOverflow = 1;
+    }
+
+
+    return ((Word16) diff);
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/syn_filt.cpp b/media/libstagefright/codecs/amrnb/common/src/syn_filt.cpp
new file mode 100644
index 0000000..bcdc696
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/syn_filt.cpp
@@ -0,0 +1,399 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/syn_filt.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Making changes based on comments from the review meeting.
+
+ Description: Added typedef to Input/Output Definition section.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template.
+
+ Description: Fixed typecasting issue with the TI C compiler.
+
+ Description: Modified FOR loops to count down.
+
+ Description: Modified FOR loop to count up again so that the correct values
+              are stored in the tmp buffer. Updated copyright year.
+
+ Description:
+        - Modified for loop and introduced pointers to avoid adding
+          offsets
+        - Eliminated check for saturation given that the max values of input
+          data and coefficients will not saturate the multiply and
+          accumulation
+        - eliminated memcpy to update history buffer in every pass. This is
+          done now just updating the pointers.
+
+ Description:
+              1. Eliminated unused include files.
+              2. Unrolled loops to process twice as many samples as before,
+                 this saves on memory accesses to the vector coeff. a[] and
+                 elements in the history buffer of this recursive filter
+
+ Description:
+              1. Added overflow check inside both loops. (this is needed just
+                 to satisfy bit exactness on the decoder, a faster
+                 implementation will add an extra shift, do the same,
+                 but will not be bit exact, and it may have better audio
+                 quality because will avoid clipping)
+              2. Added include file for constant definitions
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description: Using fxp_arithmetic.h that includes inline assembly functions
+              for ARM and linux-arm.
+
+ Description: Replacing fxp_arithmetic.h with basic_op.h.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include <string.h>
+
+#include    "syn_filt.h"
+#include    "cnst.h"
+#include    "basic_op.h"
+
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Syn_filt
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    a = buffer containing the prediction coefficients (Word16)  max 2^12
+    x = input signal buffer (Word16)                            max 2^15
+    y = output signal buffer (Word16)
+    lg = size of filtering (Word16)
+    mem = memory buffer associated with this filtering (Word16)
+    update = flag to indicate memory update; 0=no update, 1=update memory
+             (Word16)
+
+ Outputs:
+    mem buffer is changed to be the last M data points of the output signal
+      if update was set to 1
+    y buffer contains the newly calculated filter output
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Perform synthesis filtering through 1/A(z)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ syn_filt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Syn_filt (
+    Word16 a[],     // (i)     : a[M+1] prediction coefficients   (M=10)
+    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.
+)
+{
+    Word16 i, j;
+    Word32 s;
+    Word16 tmp[80];   // This is usually done by memory allocation (lg+M)
+    Word16 *yy;
+
+    // Copy mem[] to yy[]
+
+    yy = tmp;
+
+    for (i = 0; i < M; i++)
+    {
+        *yy++ = mem[i];
+    }
+
+    // Do the filtering.
+
+    for (i = 0; i < lg; i++)
+    {
+        s = L_mult (x[i], a[0]);
+        for (j = 1; j <= M; j++)
+        {
+            s = L_msu (s, a[j], yy[-j]);
+        }
+        s = L_shl (s, 3);
+        *yy++ = pv_round (s);
+    }
+
+    for (i = 0; i < lg; i++)
+    {
+        y[i] = tmp[i + M];
+    }
+
+    // Update of memory if update==1
+
+    if (update != 0)
+    {
+        for (i = 0; i < M; i++)
+        {
+            mem[i] = y[lg - M + i];
+        }
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Syn_filt(
+    Word16 a[],     /* (i)   : a[M+1] prediction coefficients   (M=10)  */
+    Word16 x[],     /* (i)   : input signal                             */
+    Word16 y[],     /* (o)   : output signal                            */
+    Word16 lg,      /* (i)   : size of filtering   (40)                 */
+    Word16 mem[],   /* (i/o) : memory associated with this filtering.   */
+    Word16 update   /* (i)   : 0=no update, 1=update of memory.         */
+)
+{
+    Word16 i, j;
+    Word32 s1;
+    Word32 s2;
+    Word16 tmp[2*M]; /* This is usually done by memory allocation (lg+M) */
+    Word16 *yy;
+
+    Word16 *p_a;
+    Word16 *p_yy1;
+    Word16 *p_y;
+    Word16 *p_x;
+    Word16 temp;
+    /* Copy mem[] to yy[] */
+
+    yy = tmp;
+
+    memcpy(yy, mem, M*sizeof(Word16));
+
+    yy = yy + M;
+
+    /* Do the filtering. */
+
+    p_y  = y;
+    p_x  = x;
+    p_yy1 = &yy[-1];
+
+    for (i = M >> 1; i != 0; i--)
+    {
+        p_a  = a;
+
+        s1 = amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_a), 0x00000800L);
+        s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_a++), 0x00000800L);
+        s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+
+        for (j = (M >> 1) - 2; j != 0; j--)
+        {
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+        }
+
+        /* check for overflow on s1 */
+        if ((UWord32)(s1 - 0xf8000000L) < 0x0fffffffL)
+        {
+            temp = (Word16)(s1 >> 12);
+        }
+        else if (s1 > 0x07ffffffL)
+        {
+            temp = MAX_16;
+        }
+        else
+        {
+            temp = MIN_16;
+        }
+
+        s2 = amrnb_fxp_msu_16_by_16bb((Word32)a[1], (Word32)temp, s2);
+
+        *(yy++)  = temp;
+        *(p_y++) = temp;
+
+        p_yy1 = yy;
+
+        /* check for overflow on s2 */
+        if ((UWord32)(s2 - 0xf8000000L) < 0x0fffffffL)
+        {
+            temp = (Word16)(s2 >> 12);
+        }
+        else if (s2 > 0x07ffffffL)
+        {
+            temp = MAX_16;
+        }
+        else
+        {
+            temp = MIN_16;
+        }
+
+        *(yy++)  = temp;
+        *(p_y++) = temp;
+    }
+
+    p_yy1 = &y[M-1];
+
+    for (i = (lg - M) >> 1; i != 0; i--)
+    {
+        p_a  = a;
+
+        s1 = amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_a), 0x00000800L);
+        s2 = amrnb_fxp_mac_16_by_16bb((Word32) * (p_x++), (Word32) * (p_a++), 0x00000800L);
+        s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+
+        for (j = (M >> 1) - 2; j != 0; j--)
+        {
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+            s2 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a), (Word32) * (p_yy1--), s2);
+            s1 = amrnb_fxp_msu_16_by_16bb((Word32) * (p_a++), (Word32) * (p_yy1), s1);
+        }
+
+        if ((UWord32)(s1 - 0xf8000000L) < 0x0fffffffL)
+        {
+            temp = (Word16)(s1 >> 12);
+        }
+        else if (s1 > 0x07ffffffL)
+        {
+            temp = MAX_16;
+        }
+        else
+        {
+            temp = MIN_16;
+        }
+
+        s2 = amrnb_fxp_msu_16_by_16bb((Word32)a[1], (Word32)temp, s2);
+
+        *(p_y++) = temp;
+        p_yy1 = p_y;
+
+        if ((UWord32)(s2 - 0xf8000000L) < 0x0fffffffL)
+        {
+            *(p_y++) = (Word16)(s2 >> 12);
+        }
+        else if (s2 > 0x07ffffffL)
+        {
+            *(p_y++) = MAX_16;
+        }
+        else
+        {
+            *(p_y++) = MIN_16;
+        }
+    }
+
+    /* Update of memory if update==1 */
+    if (update != 0)
+    {
+        memcpy(mem, &y[lg-M], M*sizeof(Word16));
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/common/src/vad1.cpp b/media/libstagefright/codecs/amrnb/common/src/vad1.cpp
new file mode 100644
index 0000000..a6e1131
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/vad1.cpp
@@ -0,0 +1,2330 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: ./audio/gsm-amr/c/src/vad1.c
+ Functions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template.
+ Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description: Made changes per review comments
+ (1) Removed include of "count.h"
+ (2) Replaced "basic_op.h" with individual include files
+ (3) Removed some unnecessary instances of sub().
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "vad.h"
+#include "typedef.h"
+#include "shr.h"
+#include "basic_op.h"
+#include "cnst_vad.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: first_filter_stage
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    data -- array of type Word16 -- filter memory
+    in   -- array of type Word16 -- input signal
+
+ Outputs:
+    data -- array of type Word16 -- filter memory
+    out  -- array of type Word16 -- output values, every other
+                                    output is low-pass part and
+                                    other is high-pass part every
+
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Scale input down by one bit. Calculate 5th order
+                half-band lowpass/highpass filter pair with
+                decimation.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void first_filter_stage(
+    Word16 in[],      /* i   : input signal                  */
+    Word16 out[],     /* o   : output values, every other    */
+    /*       output is low-pass part and   */
+    /*       other is high-pass part every */
+    Word16 data[],    /* i/o : filter memory                 */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
+)
+{
+    Word16 temp0;
+    Word16 temp1;
+    Word16 temp2;
+    Word16 temp3;
+    Word16 i;
+    Word16 data0;
+    Word16 data1;
+
+    data0 = data[0];
+    data1 = data[1];
+
+    for (i = 0; i < FRAME_LEN / 4; i++)
+    {
+        temp0 = mult(COEFF5_1, data0, pOverflow);
+        temp1 = shr(in[4*i+0], 2, pOverflow);
+        temp0 = sub(temp1, temp0, pOverflow);
+
+        temp1 = mult(COEFF5_1, temp0, pOverflow);
+        temp1 = add(data0, temp1, pOverflow);
+
+        temp3 = mult(COEFF5_2, data1, pOverflow);
+        temp2 = shr(in[4*i+1], 2, pOverflow);
+
+        temp3 = sub(temp2, temp3, pOverflow);
+
+        temp2 = mult(COEFF5_2, temp3, pOverflow);
+        temp2 = add(data1, temp2, pOverflow);
+
+        out[4*i+0] = add(temp1, temp2, pOverflow);
+        out[4*i+1] = sub(temp1, temp2, pOverflow);
+
+        temp1 = mult(COEFF5_1, temp0, pOverflow);
+        temp2 = shr(in[4*i+2], 2, pOverflow);
+        data0 = sub(temp2, temp1, pOverflow);
+
+        temp1 = mult(COEFF5_1, data0, pOverflow);
+        temp1 = add(temp0, temp1, pOverflow);
+
+        data1 = mult(COEFF5_2, temp3, pOverflow);
+        temp2 = shr(in[4*i+3], 2, pOverflow);
+        data1 = sub(temp2, data1, pOverflow);
+
+        temp2 = mult(COEFF5_2, data1, pOverflow);
+        temp2 = add(temp3, temp2, pOverflow);
+
+        out[4*i+2] = add(temp1, temp2, pOverflow);
+        out[4*i+3] = sub(temp1, temp2, pOverflow);
+    }
+
+    data[0] = data0;
+    data[1] = data1;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: filter5
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    in0 -- array of type Word16 -- input values; output low-pass part
+    in1 -- array of type Word16 -- input values; output high-pass part
+    data -- array of type Word16 -- updated filter memory
+
+ Outputs:
+    in0 -- array of type Word16 -- input values; output low-pass part
+    in1 -- array of type Word16 -- input values; output high-pass part
+    data -- array of type Word16 -- updated filter memory
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Fifth-order half-band lowpass/highpass filter pair with
+                decimation.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+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 : updated filter memory               */
+                    Flag  *pOverflow  /* o : Flag set when overflow occurs       */
+                   )
+{
+    Word16 temp0;
+    Word16 temp1;
+    Word16 temp2;
+
+    temp0 = mult(COEFF5_1, data[0], pOverflow);
+    temp0 = sub(*in0, temp0, pOverflow);
+
+    temp1 = mult(COEFF5_1, temp0, pOverflow);
+    temp1 = add(data[0], temp1, pOverflow);
+    data[0] = temp0;
+
+    temp0 = mult(COEFF5_2, data[1], pOverflow);
+    temp0 = sub(*in1, temp0, pOverflow);
+
+    temp2 = mult(COEFF5_2, temp0, pOverflow);
+    temp2 = add(data[1], temp2, pOverflow);
+
+    data[1] = temp0;
+
+    temp0 = add(temp1, temp2, pOverflow);
+    *in0 = shr(temp0, 1, pOverflow);
+
+    temp0 = sub(temp1, temp2, pOverflow);
+    *in1 = shr(temp0, 1, pOverflow);
+}
+
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: filter3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+ Inputs:
+    in0 -- array of type Word16 -- input values; output low-pass part
+    in1 -- array of type Word16 -- input values; output high-pass part
+    data -- array of type Word16 -- updated filter memory
+
+ Outputs:
+    in0 -- array of type Word16 -- input values; output low-pass part
+    in1 -- array of type Word16 -- input values; output high-pass part
+    data -- array of type Word16 -- updated filter memory
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Third-order half-band lowpass/highpass filter pair with
+                decimation.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+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 : updated filter memory               */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs         */
+)
+{
+    Word16 temp1;
+    Word16 temp2;
+
+    temp1 = mult(COEFF3, *data, pOverflow);
+    temp1 = sub(*in1, temp1, pOverflow);
+
+    temp2 = mult(COEFF3, temp1, pOverflow);
+    temp2 = add(*data, temp2, pOverflow);
+
+    *data = temp1;
+
+    temp1 = sub(*in0, temp2, pOverflow);
+
+    *in1 = shr(temp1, 1, pOverflow);
+
+    temp1 = add(*in0, temp2, pOverflow);
+
+    *in0 = shr(temp1, 1, pOverflow);
+}
+
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: level_calculation
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    data -- array of type Word16 -- signal buffer
+    sub_level -- pointer to type Word16 -- level calculated at the end of
+                                           the previous frame
+
+    count1 -- Word16 -- number of samples to be counted
+    count2 -- Word16 -- number of samples to be counted
+    ind_m  -- Word16 -- step size for the index of the data buffer
+    ind_a  -- Word16 -- starting index of the data buffer
+    scale  -- Word16 -- scaling for the level calculation
+
+ Outputs:
+    sub_level -- pointer to tyep Word16 -- level of signal calculated from the
+                                           last (count2 - count1) samples.
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    signal level
+
+ Global Variables Used:
+
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Calculate signal level in a sub-band. Level is calculated
+                by summing absolute values of the input data.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 level_calculation(
+    Word16 data[],     /* i   : signal buffer                                */
+    Word16 *sub_level, /* i   : level calculate 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            */
+    Flag  *pOverflow   /* o : Flag set when overflow occurs                  */
+)
+{
+    Word32 l_temp1;
+    Word32 l_temp2;
+    Word16 level;
+    Word16 i;
+
+    l_temp1 = 0L;
+
+    for (i = count1; i < count2; i++)
+    {
+        l_temp1 = L_mac(l_temp1, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
+    }
+
+    l_temp2 = L_add(l_temp1, L_shl(*sub_level, sub(16, scale, pOverflow), pOverflow), pOverflow);
+    *sub_level = extract_h(L_shl(l_temp1, scale, pOverflow));
+
+    for (i = 0; i < count1; i++)
+    {
+        l_temp2 = L_mac(l_temp2, 1, abs_s(data[ind_m*i+ind_a]), pOverflow);
+    }
+    level = extract_h(L_shl(l_temp2, scale, pOverflow));
+
+    return level;
+}
+
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: filter_bank
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    in -- array of type Word16 -- input frame
+
+ Outputs:
+    level -- array of type Word16 -- signal levels at each band
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Divides input signal into 9-bands and calculas level of
+                the signal in each band
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void filter_bank(
+    vadState1 *st,    /* i/o : State struct                    */
+    Word16 in[],      /* i   : input frame                     */
+    Word16 level[],   /* 0   : signal levels at each band      */
+    Flag  *pOverflow  /* o   : Flag set when overflow occurs   */
+)
+{
+    Word16 i;
+    Word16 tmp_buf[FRAME_LEN];
+
+    /* calculate the filter bank */
+
+    first_filter_stage(in, tmp_buf, st->a_data5[0], pOverflow);
+
+    for (i = 0; i < FRAME_LEN / 4; i++)
+    {
+        filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1], pOverflow);
+        filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2], pOverflow);
+    }
+    for (i = 0; i < FRAME_LEN / 8; i++)
+    {
+        filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0], pOverflow);
+        filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1], pOverflow);
+        filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4], pOverflow);
+    }
+
+    for (i = 0; i < FRAME_LEN / 16; i++)
+    {
+        filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2], pOverflow);
+        filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3], pOverflow);
+    }
+
+    /* calculate levels in each frequency band */
+
+    /* 3000 - 4000 Hz*/
+    level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN / 4 - 8,
+                                 FRAME_LEN / 4, 4, 1, 15, pOverflow);
+    /* 2500 - 3000 Hz*/
+    level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN / 8 - 4,
+                                 FRAME_LEN / 8, 8, 7, 16, pOverflow);
+    /* 2000 - 2500 Hz*/
+    level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN / 8 - 4,
+                                 FRAME_LEN / 8, 8, 3, 16, pOverflow);
+    /* 1500 - 2000 Hz*/
+    level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN / 8 - 4,
+                                 FRAME_LEN / 8, 8, 2, 16, pOverflow);
+    /* 1000 - 1500 Hz*/
+    level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN / 8 - 4,
+                                 FRAME_LEN / 8, 8, 6, 16, pOverflow);
+    /* 750 - 1000 Hz*/
+    level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN / 16 - 2,
+                                 FRAME_LEN / 16, 16, 4, 16, pOverflow);
+    /* 500 - 750 Hz*/
+    level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN / 16 - 2,
+                                 FRAME_LEN / 16, 16, 12, 16, pOverflow);
+    /* 250 - 500 Hz*/
+    level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN / 16 - 2,
+                                 FRAME_LEN / 16, 16, 8, 16, pOverflow);
+    /* 0 - 250 Hz*/
+    level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN / 16 - 2,
+                                 FRAME_LEN / 16, 16, 0, 16, pOverflow);
+}
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: update_cntrl
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    level -- array of type Word16 -- sub-band levels of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose    : Control update of the background noise estimate.
+ Inputs     : pitch:      flags for pitch detection
+              stat_count: stationary counter
+              tone:       flags indicating presence of a tone
+              complex:      flags for complex  detection
+              vadreg:     intermediate VAD flags
+ Output     : stat_count: stationary counter
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void update_cntrl(
+    vadState1 *st,   /* i/o : State struct                       */
+    Word16 level[],  /* i   : sub-band levels of the input frame */
+    Flag  *pOverflow /* o   : Flag set when overflow occurs      */
+)
+{
+    Word16 i;
+    Word16 temp;
+    Word16 stat_rat;
+    Word16 exp;
+    Word16 num;
+    Word16 denom;
+    Word16 alpha;
+
+    /* handle highband complex signal input  separately       */
+    /* if ther has been highband correlation for some time    */
+    /* make sure that the VAD update speed is low for a while */
+    if (st->complex_warning != 0)
+    {
+        if (st->stat_count < CAD_MIN_STAT_COUNT)
+        {
+            st->stat_count = CAD_MIN_STAT_COUNT;
+        }
+    }
+    /* NB stat_count is allowed to be decreased by one below again  */
+    /* deadlock in speech is not possible unless the signal is very */
+    /* complex and need a high rate                                 */
+
+    /* if fullband pitch or tone have been detected for a while, initialize stat_count */
+    if (((Word16)(st->pitch & 0x6000) == 0x6000) ||
+            ((Word16)(st->tone & 0x7c00) == 0x7c00))
+    {
+        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 = shl(denom, exp, pOverflow);
+
+                /* stat_rat = num/denom * 64 */
+                temp = shr(num, 1, pOverflow);
+                temp = div_s(temp, denom);
+
+                stat_rat = add(stat_rat, shr(temp, sub(8, exp, pOverflow), pOverflow), pOverflow);
+            }
+
+            /* 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 = sub(st->stat_count, 1, pOverflow);
+                    }
+                }
+            }
+        }
+    }
+
+    /* 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++)
+    {
+        temp = sub(level[i], st->ave_level[i], pOverflow);
+        temp = mult_r(alpha, temp, pOverflow);
+
+        st->ave_level[i] =
+            add(
+                st->ave_level[i],
+                temp,
+                pOverflow);
+    }
+}
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: hangover_addition
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    noise_level -- Word16 -- average level of the noise estimates
+    low_power   -- Word16 -- flag power of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicato
+
+ Returns:
+    VAD_flag indicating final VAD decision (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Function     : hangover_addition
+ Purpose      : Add hangover for complex signal or after speech bursts
+ Inputs       : burst_count:  counter for the length of speech bursts
+                hang_count:   hangover counter
+                vadreg:       intermediate VAD decision
+ Outputs      : burst_count:  counter for the length of speech bursts
+                hang_count:   hangover counter
+ Return value : VAD_flag indicating final VAD decision
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 hangover_addition(
+    vadState1 *st,      /* i/o : State struct                     */
+    Word16 noise_level, /* i   : average level of the noise       */
+    /*       estimates                        */
+    Word16 low_power,   /* i   : flag power of the input frame    */
+    Flag  *pOverflow    /* o   : Flag set when overflow occurs    */
+)
+{
+    Word16 hang_len;
+    Word16 burst_len;
+
+    /*
+       Calculate burst_len and hang_len
+       burst_len: number of consecutive intermediate vad flags with "1"-decision
+                  required for hangover addition
+       hang_len:  length of the hangover
+       */
+
+    if (noise_level > HANG_NOISE_THR)
+    {
+        burst_len = BURST_LEN_HIGH_NOISE;
+        hang_len = HANG_LEN_HIGH_NOISE;
+    }
+    else
+    {
+        burst_len = BURST_LEN_LOW_NOISE;
+        hang_len = HANG_LEN_LOW_NOISE;
+    }
+
+    /* if the input power (pow_sum) is lower than a threshold, clear
+       counters and set VAD_flag to "0"  "fast exit"                 */
+    if (low_power != 0)
+    {
+        st->burst_count = 0;
+        st->hang_count = 0;
+        st->complex_hang_count = 0;
+        st->complex_hang_timer = 0;
+        return 0;
+    }
+
+    if (st->complex_hang_timer > CVAD_HANG_LIMIT)
+    {
+        if (st->complex_hang_count < CVAD_HANG_LENGTH)
+        {
+            st->complex_hang_count = CVAD_HANG_LENGTH;
+        }
+    }
+
+    /* long time very complex signal override VAD output function */
+    if (st->complex_hang_count != 0)
+    {
+        st->burst_count = BURST_LEN_HIGH_NOISE;
+        st->complex_hang_count = sub(st->complex_hang_count, 1, pOverflow);
+        return 1;
+    }
+    else
+    {
+        /* let hp_corr work in from a noise_period indicated by the VAD */
+        if (((st->vadreg & 0x3ff0) == 0) &&
+                (st->corr_hp_fast > CVAD_THRESH_IN_NOISE))
+        {
+            return 1;
+        }
+    }
+
+    /* update the counters (hang_count, burst_count) */
+    if ((st->vadreg & 0x4000) != 0)
+    {
+        st->burst_count = add(st->burst_count, 1, pOverflow);
+
+        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 = sub(st->hang_count, 1, pOverflow);
+            return 1;
+        }
+    }
+    return 0;
+}
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: noise_estimate_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    level -- array of type Word16 -- sub-band levels of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose    : Update of background noise estimate
+ Inputs     : bckr_est:   background noise estimate
+              pitch:      flags for pitch detection
+              stat_count: stationary counter
+ Outputs    : bckr_est:   background noise estimate
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void noise_estimate_update(
+    vadState1 *st,    /* i/o : State struct                       */
+    Word16 level[],   /* i   : sub-band levels of the input frame */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
+)
+{
+    Word16 i;
+    Word16 alpha_up;
+    Word16 alpha_down;
+    Word16 bckr_add;
+
+    /* Control update of bckr_est[] */
+    update_cntrl(st, level, pOverflow);
+
+    /* Choose update speed */
+    bckr_add = 2;
+
+    if (((0x7800 & st->vadreg) == 0) &&
+            ((st->pitch & 0x7800) == 0)
+            && (st->complex_hang_count == 0))
+    {
+        alpha_up = ALPHA_UP1;
+        alpha_down = ALPHA_DOWN1;
+    }
+    else
+    {
+        if ((st->stat_count == 0)
+                && (st->complex_hang_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 = sub(st->old_level[i], st->bckr_est[i], pOverflow);
+
+        if (temp < 0)
+        { /* update downwards*/
+            temp = mult_r(alpha_down, temp, pOverflow);
+            temp = add(st->bckr_est[i], temp, pOverflow);
+
+            st->bckr_est[i] = add(-2, temp, pOverflow);
+
+            /* 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 */
+            temp = mult_r(alpha_up, temp, pOverflow);
+            temp = add(st->bckr_est[i], temp, pOverflow);
+            st->bckr_est[i] = add(bckr_add, temp, pOverflow);
+
+            /* 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 NAME: complex_estimate_adapt
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    low_power -- Word16 -- very low level flag of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Function   : complex_estimate_adapt
+ Purpose    : Update/adapt of complex signal estimate
+ Inputs     : low_power:   low signal power flag
+ Outputs    : st->corr_hp_fast:   long term complex signal estimate
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void complex_estimate_adapt(
+    vadState1 *st,      /* i/o : VAD state struct                       */
+    Word16 low_power,   /* i   : very low level flag of the input frame */
+    Flag  *pOverflow    /* o : Flag set when overflow occurs            */
+)
+{
+    Word16 alpha;            /* Q15 */
+    Word32 L_tmp;            /* Q31 */
+
+
+    /* adapt speed on own state */
+    if (st->best_corr_hp < st->corr_hp_fast) /* decrease */
+    {
+        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
+        {  /* low state  */
+            alpha = CVAD_ADAPT_FAST;
+        }
+        else
+        {  /* high state */
+            alpha = CVAD_ADAPT_REALLY_FAST;
+        }
+    }
+    else  /* increase */
+    {
+        if (st->corr_hp_fast < CVAD_THRESH_ADAPT_HIGH)
+        {
+            alpha = CVAD_ADAPT_FAST;
+        }
+        else
+        {
+            alpha = CVAD_ADAPT_SLOW;
+        }
+    }
+
+    L_tmp = L_deposit_h(st->corr_hp_fast);
+    L_tmp = L_msu(L_tmp, alpha, st->corr_hp_fast, pOverflow);
+    L_tmp = L_mac(L_tmp, alpha, st->best_corr_hp, pOverflow);
+    st->corr_hp_fast = pv_round(L_tmp, pOverflow);           /* Q15 */
+
+    if (st->corr_hp_fast < CVAD_MIN_CORR)
+    {
+        st->corr_hp_fast = CVAD_MIN_CORR;
+    }
+
+    if (low_power != 0)
+    {
+        st->corr_hp_fast = CVAD_MIN_CORR;
+    }
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: complex_vad
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    low_power -- Word16 -- flag power of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+
+ Returns:
+    the complex background decision
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : complex background decision
+ Return value : the complex background decision
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 complex_vad(
+    vadState1 *st,    /* i/o : VAD state struct              */
+    Word16 low_power, /* i   : flag power of the input frame */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
+)
+{
+    st->complex_high = shr(st->complex_high, 1, pOverflow);
+    st->complex_low = shr(st->complex_low, 1, pOverflow);
+
+    if (low_power == 0)
+    {
+        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_HIGH)
+        {
+            st->complex_high |= 0x4000;
+        }
+
+        if (st->corr_hp_fast > CVAD_THRESH_ADAPT_LOW)
+        {
+            st->complex_low |= 0x4000;
+        }
+    }
+
+    if (st->corr_hp_fast > CVAD_THRESH_HANG)
+    {
+        st->complex_hang_timer = add(st->complex_hang_timer, 1, pOverflow);
+    }
+    else
+    {
+        st->complex_hang_timer =  0;
+    }
+
+    return ((Word16)(st->complex_high & 0x7f80) == 0x7f80 ||
+            (Word16)(st->complex_low & 0x7fff) == 0x7fff);
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad_decision
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    level -- array of type Word16 -- sub-band levels of the input frame
+    pow_sum -- Word32 -- power of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    VAD_flag (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Calculates VAD_flag
+ Inputs       : bckr_est:    background noise estimate
+                vadreg:      intermediate VAD flags
+ Outputs      : noise_level: average level of the noise estimates
+                vadreg:      intermediate VAD flags
+ Return value : VAD_flag
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word16 vad_decision(
+    vadState1 *st,         /* i/o : State struct                       */
+    Word16 level[COMPLEN], /* i   : sub-band levels of the input frame */
+    Word32 pow_sum,        /* i   : power of the input frame           */
+    Flag  *pOverflow       /* o : Flag set when overflow occurs        */
+)
+{
+    Word16 i;
+    Word16 snr_sum;
+    Word32 L_temp;
+    Word16 vad_thr;
+    Word16 temp;
+    Word16 noise_level;
+    Word16 low_power_flag;
+    Word16 temp1;
+
+    /*
+       Calculate squared sum of the input levels (level)
+       divided by the background noise components (bckr_est).
+       */
+    L_temp = 0;
+
+    for (i = 0; i < COMPLEN; i++)
+    {
+        Word16 exp;
+
+        exp = norm_s(st->bckr_est[i]);
+        temp = shl(st->bckr_est[i], exp, pOverflow);
+        temp = div_s(shr(level[i], 1, pOverflow), temp);
+        temp = shl(temp, sub(exp, UNIRSHFT - 1, pOverflow), pOverflow);
+        L_temp = L_mac(L_temp, temp, temp, pOverflow);
+    }
+
+    snr_sum = extract_h(L_shl(L_temp, 6, pOverflow));
+    snr_sum = mult(snr_sum, INV_COMPLEN, pOverflow);
+
+    /* Calculate average level of estimated background noise */
+    L_temp = 0;
+    for (i = 0; i < COMPLEN; i++)
+    {
+        L_temp = L_add(L_temp, st->bckr_est[i], pOverflow);
+    }
+
+    noise_level = extract_h(L_shl(L_temp, 13, pOverflow));
+
+    /* Calculate VAD threshold */
+    temp1 = sub(noise_level, VAD_P1, pOverflow);
+    temp1 = mult(VAD_SLOPE, temp1, pOverflow);
+    vad_thr = add(temp1, VAD_THR_HIGH, pOverflow);
+
+    if (vad_thr < VAD_THR_LOW)
+    {
+        vad_thr = VAD_THR_LOW;
+    }
+
+    /* Shift VAD decision register */
+    st->vadreg = shr(st->vadreg, 1, pOverflow);
+
+    /* Make intermediate VAD decision */
+    if (snr_sum > vad_thr)
+    {
+        st->vadreg |= 0x4000;
+    }
+    /* primary vad decsion made */
+
+    /* check if the input power (pow_sum) is lower than a threshold" */
+    if (L_sub(pow_sum, VAD_POW_LOW, pOverflow) < 0)
+    {
+        low_power_flag = 1;
+    }
+    else
+    {
+        low_power_flag = 0;
+    }
+
+    /* update complex signal estimate st->corr_hp_fast and hangover reset timer using */
+    /* low_power_flag and corr_hp_fast  and various adaptation speeds                 */
+    complex_estimate_adapt(st, low_power_flag, pOverflow);
+
+    /* check multiple thresholds of the st->corr_hp_fast value */
+    st->complex_warning = complex_vad(st, low_power_flag, pOverflow);
+
+    /* Update speech subband vad background noise estimates */
+    noise_estimate_update(st, level, pOverflow);
+
+    /*  Add speech and complex hangover and return speech VAD_flag */
+    /*  long term complex hangover may be added */
+    st->speech_vad_decision = hangover_addition(st, noise_level, low_power_flag, pOverflow);
+
+    return (st->speech_vad_decision);
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad1_init
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state -- double pointer to type vadState1 -- pointer to memory to
+                                                 be initialized.
+
+ Outputs:
+    state -- points to initalized area in memory.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Allocates state memory and initializes state memory
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 vad1_init(vadState1 **state)
+{
+    vadState1* s;
+
+    if (state == (vadState1 **) NULL)
+    {
+        return -1;
+    }
+    *state = NULL;
+
+    /* allocate memory */
+    if ((s = (vadState1 *) malloc(sizeof(vadState1))) == NULL)
+    {
+        return -1;
+    }
+
+    vad1_reset(s);
+
+    *state = s;
+
+    return 0;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad1_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state -- pointer to type vadState1 --  State struct
+
+ Outputs:
+    state -- pointer to type vadState1 --  State struct
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose:    Resets state memory to zero
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 vad1_reset(vadState1 *state)
+{
+    Word16 i;
+    Word16 j;
+
+    if (state == (vadState1 *) NULL)
+    {
+        return -1;
+    }
+
+    /* Initialize pitch detection variables */
+    state->oldlag_count = 0;
+    state->oldlag = 0;
+    state->pitch = 0;
+    state->tone = 0;
+
+    state->complex_high = 0;
+    state->complex_low = 0;
+    state->complex_hang_timer = 0;
+
+    state->vadreg = 0;
+
+    state->stat_count = 0;
+    state->burst_count = 0;
+    state->hang_count = 0;
+    state->complex_hang_count = 0;
+
+    /* initialize memory used by the filter bank */
+    for (i = 0; i < 3; i++)
+    {
+        for (j = 0; j < 2; j++)
+        {
+            state->a_data5[i][j] = 0;
+        }
+    }
+
+    for (i = 0; i < 5; 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->best_corr_hp = CVAD_LOWPOW_RESET;
+
+    state->speech_vad_decision = 0;
+    state->complex_warning = 0;
+    state->sp_burst_count = 0;
+
+    state->corr_hp_fast = CVAD_LOWPOW_RESET;
+
+    return 0;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad1_exit
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state -- pointer to type vadState1 --  State struct
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    The memory used for state memory is freed
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void vad1_exit(vadState1 **state)
+{
+    if (state == NULL || *state == NULL)
+        return;
+
+    /* deallocate memory */
+    free(*state);
+    *state = NULL;
+
+    return;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad_complex_detection_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    best_corr_hp -- Word16 -- best Corr
+    state -- pointer to type vadState1 --  State struct
+
+ Outputs:
+    state -- pointer to type vadState1 --  State struct
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : update vad->bestCorr_hp  complex signal feature state
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void vad_complex_detection_update(
+    vadState1 *st,       /* i/o : State struct */
+    Word16 best_corr_hp) /* i   : best Corr    */
+{
+    st->best_corr_hp = best_corr_hp;
+}
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad_tone_detection
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    t0 -- Word32 -- autocorrelation maxima
+    t1 -- Word32 -- energy
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Set tone flag if pitch gain is high. This is used to detect
+                signaling tones and other signals with high pitch gain.
+ Inputs       : tone: flags indicating presence of a tone
+ Outputs      : tone: flags indicating presence of a tone
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void vad_tone_detection(
+    vadState1 *st,    /* i/o : State struct                       */
+    Word32 t0,        /* i   : autocorrelation maxima             */
+    Word32 t1,        /* i   : energy                             */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs        */
+)
+{
+    Word16 temp;
+    /*
+       if (t0 > TONE_THR * t1)
+       set tone flag
+       */
+    temp = pv_round(t1, pOverflow);
+
+    if ((temp > 0) && (L_msu(t0, temp, TONE_THR, pOverflow) > 0))
+    {
+        st->tone |= 0x4000;
+    }
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad_tone_detection_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    one_lag_per_frame -- Word16 -- 1 if one open-loop lag is calculated per
+                                   each frame, otherwise 0
+    st -- pointer to type vadState1 --  State struct
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Update the tone flag register. Tone flags are shifted right
+                by one bit. This function should be called from the speech
+                encoder before call to Vad_tone_detection() function.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void vad_tone_detection_update(
+    vadState1 *st,              /* i/o : State struct           */
+    Word16 one_lag_per_frame,   /* i   : 1 if one open-loop lag */
+    /*       is calculated per each */
+    /*       frame, otherwise 0     */
+    Flag *pOverflow             /* o   : Flags overflow         */
+)
+{
+    /* Shift tone flags right by one bit */
+    st->tone = shr(st->tone, 1, pOverflow);
+
+    /* If open-loop lag is calculated only once in each frame, do extra update
+       and assume that the other tone flag of the frame is one. */
+    if (one_lag_per_frame != 0)
+    {
+        st->tone = shr(st->tone, 1, pOverflow);
+        st->tone |= 0x2000;
+    }
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad_pitch_detection
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    T_op -- array of type Word16 -- speech encoder open loop lags
+    st -- pointer to type vadState1 --  State struct
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Test whether signal contains pitch or other periodic
+                component.
+ Return value : Boolean voiced / unvoiced decision in state variable
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void vad_pitch_detection(
+    vadState1 *st,    /* i/o : State struct                  */
+    Word16 T_op[],    /* i   : speech encoder open loop lags */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs   */
+)
+{
+    Word16 lagcount;
+    Word16 i;
+    Word16 temp;
+
+    lagcount = 0;
+
+    for (i = 0; i < 2; i++)
+    {
+        temp = sub(st->oldlag, T_op[i], pOverflow);
+        temp = abs_s(temp);
+
+        if (temp < LTHRESH)
+        {
+            lagcount = add(lagcount, 1, pOverflow);
+        }
+
+        /* Save the current LTP lag */
+        st->oldlag = T_op[i];
+    }
+
+    /* Make pitch decision.
+       Save flag of the pitch detection to the variable pitch.
+       */
+    st->pitch = shr(st->pitch, 1, pOverflow);
+
+    temp =
+        add(
+            st->oldlag_count,
+            lagcount,
+            pOverflow);
+
+    if (temp >= NTHRESH)
+    {
+        st->pitch |= 0x4000;
+    }
+
+    /* Update oldlagcount */
+    st->oldlag_count = lagcount;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: vad1
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- pointer to type vadState1 --  State struct
+    in_buf -- array of type Word16 -- samples of the input frame
+
+ Outputs:
+    st -- pointer to type vadState1 --  State struct
+    pOverflow -- pointer to type Flag -- overflow indicator
+
+ Returns:
+    VAD Decision, 1 = speech, 0 = noise
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Purpose      : Main program for Voice Activity Detection (VAD) for AMR
+ Return value : VAD Decision, 1 = speech, 0 = noise
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ vad1.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 vad1(
+    vadState1 *st,    /* i/o : State struct                       */
+    Word16 in_buf[],  /* i   : samples of the input frame         */
+    Flag  *pOverflow  /* o   : Flag set when overflow occurs      */
+)
+{
+    Word16 level[COMPLEN];
+    Word32 pow_sum;
+    Word16 i;
+
+    /* Calculate power of the input frame. */
+    pow_sum = 0L;
+
+    for (i = 0; i < FRAME_LEN; i++)
+    {
+        pow_sum = L_mac(pow_sum, in_buf[i-LOOKAHEAD], in_buf[i-LOOKAHEAD], pOverflow);
+    }
+
+    /*
+      If input power is very low, clear pitch flag of the current frame
+      */
+    if (L_sub(pow_sum, POW_PITCH_THR, pOverflow) < 0)
+    {
+        st->pitch = st->pitch & 0x3fff;
+    }
+
+    /*
+      If input power is very low, clear complex flag of the "current" frame
+      */
+    if (L_sub(pow_sum, POW_COMPLEX_THR, pOverflow) < 0)
+    {
+        st->complex_low = st->complex_low & 0x3fff;
+    }
+
+    /*
+      Run the filter bank which calculates signal levels at each band
+      */
+    filter_bank(st, in_buf, level, pOverflow);
+
+    return (vad_decision(st, level, pow_sum, pOverflow));
+}
+
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp b/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp
new file mode 100644
index 0000000..2e2efc4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/weight_a.cpp
@@ -0,0 +1,196 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Pathname: ./audio/gsm-amr/c/src/weight_a.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Put file into template and first pass at optimization.
+
+ Description: Made changes based on comments from the review meeting. Used
+    pointers instead of index addressing in the arrays.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Fixed typecasting issue with TI C compiler.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Modified FOR loop to count down.
+              2. Used address pre-increment instead of address offsets.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "weight_a.h"
+#include    "typedef.h"
+#include    "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Weight_Ai
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    a = LPC coefficients (Word16)
+    fac = Spectral expansion factors (Word16)
+    a_exp = Spectral expanded LPC coefficients (Word16)
+
+ Outputs:
+    a_exp points to the updated spectral expanded LPC coefficients
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function calculates the spectral expansion for the LP coefficients of
+ order M.
+    a_exp[i] = a[i] * fac[i-1]    ; i=1..M
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ weight_a.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Weight_Ai (
+    Word16 a[],         // (i)     : a[M+1]  LPC coefficients   (M=10)
+    const Word16 fac[], // (i)     : Spectral expansion factors.
+    Word16 a_exp[]      // (o)     : Spectral expanded LPC coefficients
+)
+{
+    Word16 i;
+    a_exp[0] = a[0];
+
+    for (i = 1; i <= M; i++)
+    {
+        a_exp[i] = pv_round (L_mult (a[i], fac[i - 1]));
+    }
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Weight_Ai(
+    Word16 a[],         /* (i)   : a[M+1]  LPC coefficients   (M=10)    */
+    const Word16 fac[], /* (i)   : Spectral expansion factors.          */
+    Word16 a_exp[]      /* (o)   : Spectral expanded LPC coefficients   */
+)
+{
+    register Word16 i;
+
+    *(a_exp) = *(a);
+
+    for (i = M; i >= 1; i--)
+    {
+        a_exp += 1;
+        a += 1;
+        fac += 1;
+        *(a_exp) = (Word16)((((Word32) * (a)) * *(fac - 1)
+                             + 0x00004000L) >> 15);
+    }
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrnb/common/src/window_tab.cpp b/media/libstagefright/codecs/amrnb/common/src/window_tab.cpp
new file mode 100644
index 0000000..fa5faa6
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/common/src/window_tab.cpp
@@ -0,0 +1,280 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Pathname: .audio/gsm-amr/c/src/window_tab.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed tables from static const to just const.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    None
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+      File             : window.tab
+      Purpose          : Hamming_cos window for LPC analysis.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+#include    "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    /*************************************************************************
+     *
+     * Hamming_cos windows for LPC analysis.
+     *
+     *************************************************************************/
+
+    /* window for non-EFR modesm; uses 40 samples lookahead */
+
+    extern const Word16 window_200_40[L_WINDOW] =
+    {
+        2621,  2623,  2629,  2638,  2651,  2668,  2689,  2713,  2741,  2772,
+        2808,  2847,  2890,  2936,  2986,  3040,  3097,  3158,  3223,  3291,
+        3363,  3438,  3517,  3599,  3685,  3774,  3867,  3963,  4063,  4166,
+        4272,  4382,  4495,  4611,  4731,  4853,  4979,  5108,  5240,  5376,
+        5514,  5655,  5800,  5947,  6097,  6250,  6406,  6565,  6726,  6890,
+        7057,  7227,  7399,  7573,  7750,  7930,  8112,  8296,  8483,  8672,
+        8863,  9057,  9252,  9450,  9650,  9852, 10055, 10261, 10468, 10677,
+        10888, 11101, 11315, 11531, 11748, 11967, 12187, 12409, 12632, 12856,
+        13082, 13308, 13536, 13764, 13994, 14225, 14456, 14688, 14921, 15155,
+        15389, 15624, 15859, 16095, 16331, 16568, 16805, 17042, 17279, 17516,
+        17754, 17991, 18228, 18465, 18702, 18939, 19175, 19411, 19647, 19882,
+        20117, 20350, 20584, 20816, 21048, 21279, 21509, 21738, 21967, 22194,
+        22420, 22644, 22868, 23090, 23311, 23531, 23749, 23965, 24181, 24394,
+        24606, 24816, 25024, 25231, 25435, 25638, 25839, 26037, 26234, 26428,
+        26621, 26811, 26999, 27184, 27368, 27548, 27727, 27903, 28076, 28247,
+        28415, 28581, 28743, 28903, 29061, 29215, 29367, 29515, 29661, 29804,
+        29944, 30081, 30214, 30345, 30472, 30597, 30718, 30836, 30950, 31062,
+        31170, 31274, 31376, 31474, 31568, 31659, 31747, 31831, 31911, 31988,
+        32062, 32132, 32198, 32261, 32320, 32376, 32428, 32476, 32521, 32561,
+        32599, 32632, 32662, 32688, 32711, 32729, 32744, 32755, 32763, 32767,
+        32767, 32741, 32665, 32537, 32359, 32129, 31850, 31521, 31143, 30716,
+        30242, 29720, 29151, 28538, 27879, 27177, 26433, 25647, 24821, 23957,
+        23055, 22117, 21145, 20139, 19102, 18036, 16941, 15820, 14674, 13505,
+        12315, 11106,  9879,  8637,  7381,  6114,  4838,  3554,  2264,   971
+    };
+
+
+    /* window for EFR, first two subframes, no lookahead */
+
+    extern const Word16 window_160_80[L_WINDOW] =
+    {
+        2621, 2624, 2633, 2648, 2668, 2695, 2727, 2765, 2809, 2859,
+        2915, 2976, 3043, 3116, 3194, 3279, 3368, 3464, 3565, 3671,
+        3783, 3900, 4023, 4151, 4285, 4423, 4567, 4716, 4870, 5029,
+        5193, 5362, 5535, 5714, 5897, 6084, 6277, 6473, 6674, 6880,
+        7089, 7303, 7521, 7742, 7968, 8197, 8430, 8667, 8907, 9151,
+        9398, 9648, 9902, 10158, 10417, 10680, 10945, 11212, 11482, 11755,
+        12030, 12307, 12586, 12867, 13150, 13435, 13722, 14010, 14299, 14590,
+        14882, 15175, 15469, 15764, 16060, 16356, 16653, 16950, 17248, 17546,
+        17844, 18141, 18439, 18736, 19033, 19330, 19625, 19920, 20214, 20507,
+        20799, 21090, 21380, 21668, 21954, 22239, 22522, 22803, 23083, 23360,
+        23635, 23907, 24177, 24445, 24710, 24972, 25231, 25488, 25741, 25991,
+        26238, 26482, 26722, 26959, 27192, 27422, 27647, 27869, 28087, 28300,
+        28510, 28715, 28916, 29113, 29305, 29493, 29676, 29854, 30028, 30197,
+        30361, 30519, 30673, 30822, 30966, 31105, 31238, 31366, 31489, 31606,
+        31718, 31825, 31926, 32021, 32111, 32195, 32273, 32346, 32413, 32475,
+        32530, 32580, 32624, 32662, 32695, 32721, 32742, 32756, 32765, 32767,
+        32767, 32756, 32720, 32661, 32578, 32471, 32341, 32188, 32012, 31813,
+        31592, 31349, 31084, 30798, 30492, 30165, 29818, 29453, 29068, 28666,
+        28247, 27810, 27358, 26891, 26408, 25913, 25404, 24883, 24350, 23807,
+        23255, 22693, 22124, 21548, 20965, 20378, 19786, 19191, 18593, 17994,
+        17395, 16796, 16199, 15604, 15012, 14424, 13842, 13265, 12696, 12135,
+        11582, 11039, 10507, 9986, 9477, 8981, 8499, 8031, 7579, 7143,
+        6723, 6321, 5937, 5571, 5225, 4898, 4591, 4305, 4041, 3798,
+        3577, 3378, 3202, 3048, 2918, 2812, 2729, 2669, 2633, 2621
+    };
+
+    /* window for EFR, last two subframes, no lookahead */
+
+    extern const Word16 window_232_8[L_WINDOW] =
+    {
+        2621, 2623, 2627, 2634, 2644, 2656, 2671, 2689, 2710, 2734,
+        2760, 2789, 2821, 2855, 2893, 2933, 2975, 3021, 3069, 3120,
+        3173, 3229, 3288, 3350, 3414, 3481, 3550, 3622, 3697, 3774,
+        3853, 3936, 4021, 4108, 4198, 4290, 4385, 4482, 4582, 4684,
+        4788, 4895, 5004, 5116, 5230, 5346, 5464, 5585, 5708, 5833,
+        5960, 6090, 6221, 6355, 6491, 6629, 6769, 6910, 7054, 7200,
+        7348, 7498, 7649, 7803, 7958, 8115, 8274, 8434, 8597, 8761,
+        8926, 9093, 9262, 9432, 9604, 9778, 9952, 10129, 10306, 10485,
+        10665, 10847, 11030, 11214, 11399, 11586, 11773, 11962, 12152, 12342,
+        12534, 12727, 12920, 13115, 13310, 13506, 13703, 13901, 14099, 14298,
+        14497, 14698, 14898, 15100, 15301, 15504, 15706, 15909, 16112, 16316,
+        16520, 16724, 16928, 17132, 17337, 17541, 17746, 17950, 18155, 18359,
+        18564, 18768, 18972, 19175, 19379, 19582, 19785, 19987, 20189, 20390,
+        20591, 20792, 20992, 21191, 21390, 21588, 21785, 21981, 22177, 22372,
+        22566, 22759, 22951, 23143, 23333, 23522, 23710, 23897, 24083, 24268,
+        24451, 24633, 24814, 24994, 25172, 25349, 25525, 25699, 25871, 26042,
+        26212, 26380, 26546, 26711, 26874, 27035, 27195, 27353, 27509, 27664,
+        27816, 27967, 28115, 28262, 28407, 28550, 28691, 28830, 28967, 29102,
+        29234, 29365, 29493, 29619, 29743, 29865, 29985, 30102, 30217, 30330,
+        30440, 30548, 30654, 30757, 30858, 30956, 31052, 31146, 31237, 31326,
+        31412, 31495, 31576, 31655, 31730, 31804, 31874, 31942, 32008, 32071,
+        32131, 32188, 32243, 32295, 32345, 32392, 32436, 32477, 32516, 32552,
+        32585, 32615, 32643, 32668, 32690, 32709, 32726, 32740, 32751, 32759,
+        32765, 32767, 32767, 32097, 30112, 26895, 22576, 17333, 11380, 4962
+    };
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/amrnb/dec/AMRNBDecoder.cpp b/media/libstagefright/codecs/amrnb/dec/AMRNBDecoder.cpp
new file mode 100644
index 0000000..856e29c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/AMRNBDecoder.cpp
@@ -0,0 +1,180 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 "AMRNBDecoder.h"
+
+#include "gsmamr_dec.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+static const int32_t kNumSamplesPerFrame = 160;
+static const int32_t kSampleRate = 8000;
+
+AMRNBDecoder::AMRNBDecoder(const sp<MediaSource> &source)
+    : mSource(source),
+      mStarted(false),
+      mBufferGroup(NULL),
+      mState(NULL),
+      mAnchorTimeUs(0),
+      mNumSamplesOutput(0),
+      mInputBuffer(NULL) {
+}
+
+AMRNBDecoder::~AMRNBDecoder() {
+    if (mStarted) {
+        stop();
+    }
+}
+
+status_t AMRNBDecoder::start(MetaData *params) {
+    CHECK(!mStarted);
+
+    mBufferGroup = new MediaBufferGroup;
+    mBufferGroup->add_buffer(
+            new MediaBuffer(kNumSamplesPerFrame * sizeof(int16_t)));
+
+    CHECK_EQ(GSMInitDecode(&mState, (Word8 *)"AMRNBDecoder"), 0);
+
+    mSource->start();
+
+    mAnchorTimeUs = 0;
+    mNumSamplesOutput = 0;
+    mStarted = true;
+
+    return OK;
+}
+
+status_t AMRNBDecoder::stop() {
+    CHECK(mStarted);
+
+    if (mInputBuffer) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    delete mBufferGroup;
+    mBufferGroup = NULL;
+
+    GSMDecodeFrameExit(&mState);
+
+    mSource->stop();
+
+    mStarted = false;
+
+    return OK;
+}
+
+sp<MetaData> AMRNBDecoder::getFormat() {
+    sp<MetaData> srcFormat = mSource->getFormat();
+
+    int32_t numChannels;
+    int32_t sampleRate;
+    int64_t durationUs;
+
+    CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
+    CHECK_EQ(numChannels, 1);
+
+    CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
+    CHECK_EQ(sampleRate, kSampleRate);
+
+    CHECK(srcFormat->findInt64(kKeyDuration, &durationUs));
+
+    sp<MetaData> meta = new MetaData;
+    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
+    meta->setInt32(kKeyChannelCount, numChannels);
+    meta->setInt32(kKeySampleRate, sampleRate);
+    meta->setInt64(kKeyDuration, durationUs);
+
+    return meta;
+}
+
+status_t AMRNBDecoder::read(
+        MediaBuffer **out, const ReadOptions *options) {
+    status_t err;
+
+    *out = NULL;
+
+    int64_t seekTimeUs;
+    if (options && options->getSeekTo(&seekTimeUs)) {
+        CHECK(seekTimeUs >= 0);
+
+        mNumSamplesOutput = 0;
+
+        if (mInputBuffer) {
+            mInputBuffer->release();
+            mInputBuffer = NULL;
+        }
+    } else {
+        seekTimeUs = -1;
+    }
+
+    if (mInputBuffer == NULL) {
+        err = mSource->read(&mInputBuffer, options);
+
+        if (err != OK) {
+            return err;
+        }
+
+        int64_t timeUs;
+        if (mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) {
+            mAnchorTimeUs = timeUs;
+            mNumSamplesOutput = 0;
+        } else {
+            // We must have a new timestamp after seeking.
+            CHECK(seekTimeUs < 0);
+        }
+    }
+
+    MediaBuffer *buffer;
+    CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+
+    const uint8_t *inputPtr =
+        (const uint8_t *)mInputBuffer->data() + mInputBuffer->range_offset();
+
+    size_t numBytesRead =
+        AMRDecode(mState,
+          (Frame_Type_3GPP)((inputPtr[0] >> 3) & 0x0f),
+          (UWord8 *)&inputPtr[1],
+          static_cast<int16_t *>(buffer->data()),
+          MIME_IETF);
+
+    ++numBytesRead;  // Include the frame type header byte.
+
+    buffer->set_range(0, kNumSamplesPerFrame * sizeof(int16_t));
+
+    CHECK_EQ(numBytesRead, mInputBuffer->range_length());
+
+    mInputBuffer->release();
+    mInputBuffer = NULL;
+
+    buffer->meta_data()->setInt64(
+            kKeyTime,
+            mAnchorTimeUs
+                + (mNumSamplesOutput * 1000000) / kSampleRate);
+
+    mNumSamplesOutput += kNumSamplesPerFrame;
+
+    *out = buffer;
+
+    return OK;
+}
+
+}  // namespace android
diff --git a/media/libstagefright/codecs/amrnb/dec/Android.mk b/media/libstagefright/codecs/amrnb/dec/Android.mk
new file mode 100644
index 0000000..0852ff3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/Android.mk
@@ -0,0 +1,58 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+        AMRNBDecoder.cpp \
+ 	src/a_refl.cpp \
+ 	src/agc.cpp \
+ 	src/amrdecode.cpp \
+ 	src/b_cn_cod.cpp \
+ 	src/bgnscd.cpp \
+ 	src/c_g_aver.cpp \
+ 	src/d1035pf.cpp \
+ 	src/d2_11pf.cpp \
+ 	src/d2_9pf.cpp \
+ 	src/d3_14pf.cpp \
+ 	src/d4_17pf.cpp \
+ 	src/d8_31pf.cpp \
+ 	src/d_gain_c.cpp \
+ 	src/d_gain_p.cpp \
+ 	src/d_plsf.cpp \
+ 	src/d_plsf_3.cpp \
+ 	src/d_plsf_5.cpp \
+ 	src/dec_amr.cpp \
+ 	src/dec_gain.cpp \
+ 	src/dec_input_format_tab.cpp \
+ 	src/dec_lag3.cpp \
+ 	src/dec_lag6.cpp \
+ 	src/dtx_dec.cpp \
+ 	src/ec_gains.cpp \
+ 	src/ex_ctrl.cpp \
+ 	src/if2_to_ets.cpp \
+ 	src/int_lsf.cpp \
+ 	src/lsp_avg.cpp \
+ 	src/ph_disp.cpp \
+ 	src/post_pro.cpp \
+ 	src/preemph.cpp \
+ 	src/pstfilt.cpp \
+ 	src/qgain475_tab.cpp \
+ 	src/sp_dec.cpp \
+ 	src/wmf_to_ets.cpp
+
+LOCAL_C_INCLUDES := \
+        frameworks/base/media/libstagefright/include \
+        $(LOCAL_PATH)/src \
+        $(LOCAL_PATH)/include \
+        $(LOCAL_PATH)/../common/include \
+        $(LOCAL_PATH)/../common
+
+LOCAL_CFLAGS := \
+        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF=
+
+LOCAL_SHARED_LIBRARIES := \
+        libstagefright \
+        libutils
+
+LOCAL_MODULE := libstagefright_amrnbdec
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/amrnb/dec/include/pvamrnbdecoder_api.h b/media/libstagefright/codecs/amrnb/dec/include/pvamrnbdecoder_api.h
new file mode 100644
index 0000000..7b94320
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/include/pvamrnbdecoder_api.h
@@ -0,0 +1,122 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ Name: pvamrnbdecoder_api.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Main header file for the Packet Video AMR Narrow  Band  decoder library. The
+ constants, structures, and functions defined within this file, along with
+ a basic data types header file, is all that is needed to use and communicate
+ with the library. The internal data structures within the library are
+ purposely hidden.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef _PVAMRNBDECODER_API_H
+#define _PVAMRNBDECODER_API_H
+
+#include    "pvgsmamrdecoderinterface.h"
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define MAX_NUM_FRAMES_PER_PACKET 20 /* Max number of frames per packet */
+
+#define MAX_NUM_PACKED_INPUT_BYTES 32 /* Max number of packed input bytes */
+
+#define L_FRAME      160
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* PVMP4AUDIODECODER_API_H */
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/a_refl.cpp b/media/libstagefright/codecs/amrnb/dec/src/a_refl.cpp
new file mode 100644
index 0000000..fb7cff3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/a_refl.cpp
@@ -0,0 +1,313 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename:  /audio/gsm-amr/c/src/a_refl.c
+ Functions: a_refl
+
+     Date: 02/05/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removing unneeded include files and the goto statement.
+
+
+ Description: Changed function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:  Using inline functions from basic_op.h .
+               Removing unneeded include files.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "a_refl.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS [optional]
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES [optional]
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: AMREncode
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    a[] = pointer to directform coefficients of type Word16
+    refl[] = pointer to reflection coefficients of type Word16
+
+ Outputs:
+    pOverflow = 1 if overflow exists in the math operations else zero.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+     File             : a_refl.c
+     Purpose          : Convert from direct form coefficients to
+                        reflection coefficients
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] a_refl.c , 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+void A_Refl(
+   Word16 a[],        // i   : Directform coefficients
+   Word16 refl[]      // o   : Reflection coefficients
+)
+{
+   // local variables
+   Word16 i,j;
+   Word16 aState[M];
+   Word16 bState[M];
+   Word16 normShift;
+   Word16 normProd;
+   Word32 L_acc;
+   Word16 scale;
+   Word32 L_temp;
+   Word16 temp;
+   Word16 mult;
+
+   // initialize states
+   for (i = 0; i < M; i++)
+   {
+      aState[i] = a[i];
+   }
+
+   // backward Levinson recursion
+   for (i = M-1; i >= 0; i--)
+   {
+      if (sub(abs_s(aState[i]), 4096) >= 0)
+      {
+         goto ExitRefl;
+      }
+
+      refl[i] = shl(aState[i], 3);
+
+      L_temp = L_mult(refl[i], refl[i]);
+      L_acc = L_sub(MAX_32, L_temp);
+
+      normShift = norm_l(L_acc);
+      scale = sub(15, normShift);
+
+      L_acc = L_shl(L_acc, normShift);
+      normProd = pv_round(L_acc);
+
+      mult = div_s(16384, normProd);
+
+      for (j = 0; j < i; j++)
+      {
+         L_acc = L_deposit_h(aState[j]);
+         L_acc = L_msu(L_acc, refl[i], aState[i-j-1]);
+
+         temp = pv_round(L_acc);
+         L_temp = L_mult(mult, temp);
+         L_temp = L_shr_r(L_temp, scale);
+
+         if (L_sub(L_abs(L_temp), 32767) > 0)
+         {
+            goto ExitRefl;
+         }
+
+         bState[j] = extract_l(L_temp);
+      }
+
+      for (j = 0; j < i; j++)
+      {
+         aState[j] = bState[j];
+      }
+   }
+   return;
+
+ExitRefl:
+   for (i = 0; i < M; i++)
+   {
+      refl[i] = 0;
+   }
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void A_Refl(
+    Word16 a[],        /* i   : Directform coefficients */
+    Word16 refl[],     /* o   : Reflection coefficients */
+    Flag   *pOverflow
+)
+{
+    /* local variables */
+    Word16 i;
+    Word16 j;
+    Word16 aState[M];
+    Word16 bState[M];
+    Word16 normShift;
+    Word16 normProd;
+    Word32 L_acc;
+    Word16 scale;
+    Word32 L_temp;
+    Word16 temp;
+    Word16 mult;
+
+    /* initialize states */
+    for (i = 0; i < M; i++)
+    {
+        aState[i] = a[i];
+    }
+
+    /* backward Levinson recursion */
+    for (i = M - 1; i >= 0; i--)
+    {
+        if (abs_s(aState[i]) >= 4096)
+        {
+            for (i = 0; i < M; i++)
+            {
+                refl[i] = 0;
+            }
+            break;
+        }
+
+        refl[i] = shl(aState[i], 3, pOverflow);
+
+        L_temp = L_mult(refl[i], refl[i], pOverflow);
+        L_acc = L_sub(MAX_32, L_temp, pOverflow);
+
+        normShift = norm_l(L_acc);
+        scale = sub(15, normShift, pOverflow);
+
+        L_acc = L_shl(L_acc, normShift, pOverflow);
+        normProd = pv_round(L_acc, pOverflow);
+
+        mult = div_s(16384, normProd);
+
+        for (j = 0; j < i; j++)
+        {
+            L_acc = L_deposit_h(aState[j]);
+            L_acc = L_msu(L_acc, refl[i], aState[i-j-1], pOverflow);
+
+            temp = pv_round(L_acc, pOverflow);
+            L_temp = L_mult(mult, temp, pOverflow);
+            L_temp = L_shr_r(L_temp, scale, pOverflow);
+
+            if (L_abs(L_temp) > 32767)
+            {
+                for (i = 0; i < M; i++)
+                {
+                    refl[i] = 0;
+                }
+                break;
+            }
+
+            bState[j] = extract_l(L_temp);
+        }
+
+        for (j = 0; j < i; j++)
+        {
+            aState[j] = bState[j];
+        }
+    }
+    return;
+}
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/a_refl.h b/media/libstagefright/codecs/amrnb/dec/src/a_refl.h
new file mode 100644
index 0000000..4028e1e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/a_refl.h
@@ -0,0 +1,124 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/a_refl.h
+
+     Date: 08/11/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+    File             : a_refl.h
+    Purpose          : Convert from direct form coefficients to
+                       reflection coefficients
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef A_REFL_H
+#define A_REFL_H
+#define a_refl_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    /*
+     *   FUNCTION:  A_Refl()
+     *   PURPOSE: Convert from direct form coefficients to reflection coefficients
+     *   DESCRIPTION:
+     *       Directform coeffs in Q12 are converted to
+     *       reflection coefficients Q15
+     */
+    void A_Refl(
+        Word16 a[],        /* i   : Directform coefficients */
+        Word16 refl[],     /* o   : Reflection coefficients */
+        Flag   *pOverflow
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _A_REFL_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/agc.cpp b/media/libstagefright/codecs/amrnb/dec/src/agc.cpp
new file mode 100644
index 0000000..4c66d54
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/agc.cpp
@@ -0,0 +1,1066 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/agc.c
+ Funtions: energy_old
+           energy_new
+           agc_init
+           agc_reset
+           agc_exit
+           agc
+           agc2
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This set of modules scale the excitation level and output of the speech
+ signals.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "agc.h"
+#include    "cnst.h"
+#include    "inv_sqrt.h"
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: energy_old
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    in = input signal (Word16)
+    l_trm = input signal length (Word16)
+    pOverflow = address of overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the energy computation saturates
+
+ Returns:
+    s = return energy of signal (Word32)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Returns the energy of the signal.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word32 energy_old( // o : return energy of signal
+    Word16 in[],          // i : input signal (length l_trm)
+    Word16 l_trm          // i : signal length
+)
+{
+    Word32 s;
+    Word16 i, temp;
+
+    temp = shr (in[0], 2);
+    s = L_mult (temp, temp);
+
+    for (i = 1; i < l_trm; i++)
+    {
+        temp = shr (in[i], 2);
+        s = L_mac (s, temp, temp);
+    }
+
+    return s;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word32 energy_old(       /* o : return energy of signal      */
+    Word16 in[],        /* i : input signal (length l_trm)  */
+    Word16 l_trm,       /* i : signal length                */
+    Flag   *pOverflow   /* overflow: flag to indicate overflow */
+)
+
+{
+    Word32  s = 0;
+    Word16  i;
+    Word16  temp;
+
+    for (i = 0; i < l_trm; i++)
+    {
+        temp = in[i] >> 2;
+        s = L_mac(s, temp, temp, pOverflow);
+    }
+
+    return(s);
+}
+
+/*----------------------------------------------------------------------------*/
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: energy_old__Wrapper
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    in = input signal (Word16)
+    l_trm = input signal length (Word16)
+    pOverflow = address of overflow (Flag)
+ Outputs:
+    pOverflow -> 1 if the energy computation saturates
+
+ Returns:
+    s = return energy of signal (Word32)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function provides external access to the static function energy_old.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ CALL energy_old (  in = in
+            l_trm = l_trm
+            pOverflow = pOverflow )
+   MODIFYING(nothing)
+   RETURNING(energy_old_value = s)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word32 energy_old_Wrapper(Word16 in[], Word16 l_trm, Flag *pOverflow)
+{
+    Word32 energy_old_value;
+
+    /*----------------------------------------------------------------------------
+     CALL energy_old (  in = in
+                l_trm = l_trm
+                pOverflow = pOverflow )
+
+      MODIFYING(nothing)
+       RETURNING(energy_old_value = s)
+    ----------------------------------------------------------------------------*/
+    energy_old_value = energy_old(in, l_trm, pOverflow);
+    return(energy_old_value);
+}
+/*--------------------------------------------------------------------------*/
+
+/*
+-----------------------------------------------------------------------------
+ FUNCTION NAME: energy_new
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    in = input signal
+    l_trm = input signal length
+    pOverflow = address of overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the energy computation saturates
+
+ Returns:
+    s = return energy of signal
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Returns the energy of the signal.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+static Word32 energy_new( // o : return energy of signal
+    Word16 in[],          // i : input signal (length l_trm)
+    Word16 l_trm )        // i : signal length
+
+{
+    Word32 s;
+    Word16 i;
+    Flag ov_save;
+
+    ov_save = Overflow;            //save overflow flag in case energy_old
+                                   // must be called
+    s = L_mult(in[0], in[0]);
+    for (i = 1; i < l_trm; i++)
+    {
+        s = L_mac(s, in[i], in[i]);
+    }
+
+    // check for overflow
+    if (L_sub (s, MAX_32) == 0L)
+    {
+        Overflow = ov_save; // restore overflow flag
+        s = energy_old (in, l_trm); // function result
+    }
+    else
+    {
+       s = L_shr(s, 4);
+    }
+
+    return(s);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static Word32 energy_new(       /* o : return energy of signal      */
+    Word16 in[],        /* i : input signal (length l_trm)  */
+    Word16 l_trm,       /* i : signal length                */
+    Flag *pOverflow     /* i : overflow flag                */
+)
+
+{
+    Word32  s = 0;
+    Word16  i;
+    Flag    ov_save;
+
+    ov_save = *(pOverflow);  /* save overflow flag in case energy_old */
+    /* must be called                        */
+
+
+    for (i = 0; i < l_trm; i++)
+    {
+        s = L_mac(s, in[i], in[i], pOverflow);
+    }
+
+    /* check for overflow */
+    if (s != MAX_32)
+    {
+        /* s is a sum of squares, so it won't be negative */
+        s = s >> 4;
+    }
+    else
+    {
+        *(pOverflow) = ov_save;  /* restore overflow flag */
+        s = energy_old(in, l_trm, pOverflow);   /* function result */
+    }
+
+    return (s);
+}
+
+/*--------------------------------------------------------------------------*/
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: energy_new__Wrapper
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    in = input signal (Word16)
+    l_trm = input signal length (Word16)
+    overflow = address of overflow (Flag)
+
+ Outputs:
+    pOverflow -> 1 if the energy computation saturates
+
+ Returns:
+    s = return energy of signal (Word32)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function provides external access to the static function energy_new.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ CALL energy_new (  in = in
+            l_trm = l_trm
+            pOverflow = pOverflow )
+
+   MODIFYING(nothing)
+
+   RETURNING(energy_new_value = s)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word32 energy_new_Wrapper(Word16 in[], Word16 l_trm, Flag *pOverflow)
+{
+    Word32 energy_new_value;
+
+    /*----------------------------------------------------------------------------
+     CALL energy_new (  in = in
+                l_trm = l_trm
+                pOverflow = pOverflow )
+
+       MODIFYING(nothing)
+       RETURNING(energy_new_value = s)
+
+    ----------------------------------------------------------------------------*/
+    energy_new_value = energy_new(in, l_trm, pOverflow);
+
+    return(energy_new_value);
+
+}
+
+/*--------------------------------------------------------------------------*/
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: agc_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type agcState
+
+ Outputs:
+    Structure pointed to by state is initialized to zeros
+
+ Returns:
+    Returns 0 if memory was successfully initialized,
+        otherwise returns -1.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Reset of agc (i.e. set state memory to 1.0).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int agc_reset (agcState *state)
+{
+  if (state == (agcState *) NULL)
+  {
+      fprintf(stderr, "agc_reset: invalid parameter\n");
+      return -1;
+  }
+
+  state->past_gain = 4096;   // initial value of past_gain = 1.0
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 agc_reset(agcState *state)
+{
+    if (state == (agcState *) NULL)
+    {
+        /* fprintf(stderr, "agc_reset: invalid parameter\n"); */
+        return(-1);
+    }
+
+    state->past_gain = 4096;   /* initial value of past_gain = 1.0  */
+
+    return(0);
+}
+
+/*--------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: agc
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to agc state
+    sig_in = pointer to a buffer containing the postfilter input signal
+    sig_out = pointer to a buffer containing the postfilter output signal
+    agc_fac = AGC factor
+    l_trm = subframe size
+    pOverflow = pointer to the overflow flag
+
+ Outputs:
+    st->past_gain = gain
+    buffer pointed to by sig_out contains the new postfilter output signal
+    pOverflow -> 1 if the agc computation saturates
+
+ Returns:
+    return = 0
+
+ Global Variables Used:
+    none.
+
+ Local Variables Needed:
+    none.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Scales the postfilter output on a subframe basis using:
+
+     sig_out[n] = sig_out[n] * gain[n]
+     gain[n] = agc_fac * gain[n-1] + (1 - agc_fac) g_in/g_out
+
+ where: gain[n] = gain at the nth sample given by
+        g_in/g_out = square root of the ratio of energy at
+                     the input and output of the postfilter.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int agc (
+    agcState *st,      // i/o : agc state
+    Word16 *sig_in,    // i   : postfilter input signal  (l_trm)
+    Word16 *sig_out,   // i/o : postfilter output signal (l_trm)
+    Word16 agc_fac,    // i   : AGC factor
+    Word16 l_trm       // i   : subframe size
+)
+{
+    Word16 i, exp;
+    Word16 gain_in, gain_out, g0, gain;
+    Word32 s;
+
+    // calculate gain_out with exponent
+    s = energy_new(sig_out, l_trm); // function result
+
+    if (s == 0)
+    {
+        st->past_gain = 0;
+        return 0;
+    }
+    exp = sub (norm_l (s), 1);
+    gain_out = pv_round (L_shl (s, exp));
+
+    // calculate gain_in with exponent
+    s = energy_new(sig_in, l_trm); // function result
+
+    if (s == 0)
+    {
+        g0 = 0;
+    }
+    else
+    {
+        i = norm_l (s);
+        gain_in = pv_round (L_shl (s, i));
+        exp = sub (exp, i);
+
+         *---------------------------------------------------*
+         *  g0 = (1-agc_fac) * sqrt(gain_in/gain_out);       *
+         *---------------------------------------------------*
+
+        s = L_deposit_l (div_s (gain_out, gain_in));
+        s = L_shl (s, 7);       // s = gain_out / gain_in
+        s = L_shr (s, exp);     // add exponent
+
+        s = Inv_sqrt (s); // function result
+        i = pv_round (L_shl (s, 9));
+
+        // g0 = i * (1-agc_fac)
+        g0 = mult (i, sub (32767, agc_fac));
+    }
+
+    // compute gain[n] = agc_fac * gain[n-1]
+                        + (1-agc_fac) * sqrt(gain_in/gain_out)
+    // sig_out[n] = gain[n] * sig_out[n]
+
+    gain = st->past_gain;
+
+    for (i = 0; i < l_trm; i++)
+    {
+        gain = mult (gain, agc_fac);
+        gain = add (gain, g0);
+        sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], gain), 3));
+    }
+
+    st->past_gain = gain;
+
+    return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void agc(
+    agcState *st,      /* i/o : agc state                        */
+    Word16 *sig_in,    /* i   : postfilter input signal  (l_trm) */
+    Word16 *sig_out,   /* i/o : postfilter output signal (l_trm) */
+    Word16 agc_fac,    /* i   : AGC factor                       */
+    Word16 l_trm,      /* i   : subframe size                    */
+    Flag *pOverflow    /* i   : overflow Flag                    */
+
+)
+
+{
+    Word16  i;
+    Word16  exp;
+    Word16  gain_in;
+    Word16  gain_out;
+    Word16  g0;
+    Word16  gain;
+    Word32  s;
+    Word32  L_temp;
+    Word16  temp;
+
+    Word16 *p_sig_out;
+
+    /* calculate gain_out with exponent */
+    s = energy_new(sig_out, l_trm, pOverflow);  /* function result */
+
+    if (s == 0)
+    {
+        st->past_gain = 0;
+        return;
+    }
+    exp = norm_l(s) - 1;
+
+    L_temp = L_shl(s, exp, pOverflow);
+    gain_out = pv_round(L_temp, pOverflow);
+
+    /* calculate gain_in with exponent */
+    s = energy_new(sig_in, l_trm, pOverflow);    /* function result */
+
+    if (s == 0)
+    {
+        g0 = 0;
+    }
+    else
+    {
+        i = norm_l(s);
+
+        /* L_temp = L_shl(s, i, pOverflow); */
+        L_temp = s << i;
+
+        gain_in = pv_round(L_temp, pOverflow);
+
+        exp -= i;
+
+        /*---------------------------------------------------*
+         *  g0 = (1-agc_fac) * sqrt(gain_in/gain_out);       *
+         *---------------------------------------------------*/
+
+        /* s = gain_out / gain_in */
+        temp = div_s(gain_out, gain_in);
+
+        /* s = L_deposit_l (temp); */
+        s = (Word32) temp;
+        s = s << 7;
+        s = L_shr(s, exp, pOverflow);      /* add exponent */
+
+        s = Inv_sqrt(s, pOverflow);    /* function result */
+        L_temp = s << 9;
+
+        i = (Word16)((L_temp + (Word32) 0x00008000L) >> 16);
+
+        /* g0 = i * (1-agc_fac) */
+        temp = 32767 - agc_fac;
+
+        g0 = (Word16)(((Word32) i * temp) >> 15);
+
+    }
+
+    /* compute gain[n] = agc_fac * gain[n-1]
+                        + (1-agc_fac) * sqrt(gain_in/gain_out) */
+    /* sig_out[n] = gain[n] * sig_out[n]                        */
+
+    gain = st->past_gain;
+    p_sig_out = sig_out;
+
+    for (i = 0; i < l_trm; i++)
+    {
+        /* gain = mult (gain, agc_fac, pOverflow); */
+        gain = (Word16)(((Word32) gain * agc_fac) >> 15);
+
+        /* gain = add (gain, g0, pOverflow); */
+        gain += g0;
+
+        /* L_temp = L_mult (sig_out[i], gain, pOverflow); */
+        L_temp = ((Word32)(*(p_sig_out)) * gain) << 1;
+
+        *(p_sig_out++) = (Word16)(L_temp >> 13);
+    }
+
+    st->past_gain = gain;
+
+    return;
+}
+
+/*--------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: agc2
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    sig_in = pointer to a buffer containing the postfilter input signal
+    sig_out = pointer to a buffer containing the postfilter output signal
+    l_trm = subframe size
+    pOverflow = pointer to overflow flag
+
+ Outputs:
+    sig_out points to a buffer containing the new scaled output signal.
+    pOverflow -> 1 if the agc computation saturates
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Scales the excitation on a subframe basis.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void agc2 (
+ Word16 *sig_in,        // i   : postfilter input signal
+ Word16 *sig_out,       // i/o : postfilter output signal
+ Word16 l_trm           // i   : subframe size
+)
+{
+    Word16 i, exp;
+    Word16 gain_in, gain_out, g0;
+    Word32 s;
+
+    // calculate gain_out with exponent
+    s = energy_new(sig_out, l_trm); // function result
+
+    if (s == 0)
+    {
+        return;
+    }
+    exp = sub (norm_l (s), 1);
+    gain_out = pv_round (L_shl (s, exp));
+
+    // calculate gain_in with exponent
+    s = energy_new(sig_in, l_trm); // function result
+
+    if (s == 0)
+    {
+        g0 = 0;
+    }
+    else
+    {
+        i = norm_l (s);
+        gain_in = pv_round (L_shl (s, i));
+        exp = sub (exp, i);
+
+         *---------------------------------------------------*
+         *  g0 = sqrt(gain_in/gain_out);                     *
+         *---------------------------------------------------*
+
+        s = L_deposit_l (div_s (gain_out, gain_in));
+        s = L_shl (s, 7);       // s = gain_out / gain_in
+        s = L_shr (s, exp);     // add exponent
+
+        s = Inv_sqrt (s); // function result
+        g0 = pv_round (L_shl (s, 9));
+    }
+
+    // sig_out(n) = gain(n) sig_out(n)
+
+    for (i = 0; i < l_trm; i++)
+    {
+        sig_out[i] = extract_h (L_shl (L_mult (sig_out[i], g0), 3));
+    }
+
+    return;
+}
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void agc2(
+    Word16 *sig_in,        /* i   : postfilter input signal  */
+    Word16 *sig_out,       /* i/o : postfilter output signal */
+    Word16 l_trm,          /* i   : subframe size            */
+    Flag   *pOverflow      /* i   : overflow flag            */
+)
+
+{
+    Word16  i;
+    Word16  exp;
+    Word16  gain_in;
+    Word16  gain_out;
+    Word16  g0;
+    Word32  s;
+    Word32  L_temp;
+    Word16  temp;
+
+    /* calculate gain_out with exponent */
+    s = energy_new(sig_out, l_trm, pOverflow); /* function result */
+
+    if (s == 0)
+    {
+        return;
+    }
+    exp = norm_l(s) - 1;
+    L_temp = L_shl(s, exp, pOverflow);
+    gain_out = pv_round(L_temp, pOverflow);
+
+    /* calculate gain_in with exponent */
+    s = energy_new(sig_in, l_trm, pOverflow); /* function result */
+
+    if (s == 0)
+    {
+        g0 = 0;
+    }
+    else
+    {
+        i = norm_l(s);
+        L_temp = L_shl(s, i, pOverflow);
+        gain_in = pv_round(L_temp, pOverflow);
+        exp -= i;
+
+        /*---------------------------------------------------*
+         *  g0 = sqrt(gain_in/gain_out);                     *
+         *---------------------------------------------------*/
+
+        /* s = gain_out / gain_in */
+        temp = div_s(gain_out, gain_in);
+
+        /* s = L_deposit_l (temp); */
+        s = (Word32)temp;
+
+        if (s > (Word32) 0x00FFFFFFL)
+        {
+            s = MAX_32;
+        }
+        else if (s < (Word32) 0xFF000000L)
+        {
+            s = MIN_32;
+        }
+        else
+        {
+            s = s << 7;
+        }
+        s = L_shr(s, exp, pOverflow);      /* add exponent */
+
+        s = Inv_sqrt(s, pOverflow);    /* function result */
+
+        if (s > (Word32) 0x003FFFFFL)
+        {
+            L_temp = MAX_32;
+        }
+        else if (s < (Word32) 0xFFC00000L)
+        {
+            L_temp = MIN_32;
+        }
+        else
+        {
+            L_temp = s << 9;
+        }
+        g0 = pv_round(L_temp, pOverflow);
+    }
+
+    /* sig_out(n) = gain(n) sig_out(n) */
+
+    for (i = l_trm - 1; i >= 0; i--)
+    {
+        L_temp = L_mult(sig_out[i], g0, pOverflow);
+        if (L_temp > (Word32) 0x0FFFFFFFL)
+        {
+            sig_out[i] = MAX_16;
+        }
+        else if (L_temp < (Word32) 0xF0000000L)
+        {
+            sig_out[i] = MIN_16;
+        }
+        else
+        {
+            sig_out[i] = (Word16)(L_temp >> 13);
+        }
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/agc.h b/media/libstagefright/codecs/amrnb/dec/src/agc.h
new file mode 100644
index 0000000..b6e3249
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/agc.h
@@ -0,0 +1,163 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/agc.h
+
+     Date: 12/07/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed unneeded sections of the standard template.
+              Updated function prototype for agc() and agc2() to match new
+              interface
+
+ Description: Changed paramter name from "overflow" to "pOverflow" for
+              functions agc() and agc2()
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : agc.h
+      Purpose          : Scales the postfilter output on a subframe basis
+                       : by automatic control of the subframe gain.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _AGC_H_
+#define _AGC_H_
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 past_gain;
+    } agcState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function    : agc_reset
+    ;  Purpose     : Reset of agc (i.e. set state memory to 1.0)
+    ;  Returns     : 0 on success
+    ;
+    ----------------------------------------------------------------------------*/
+    Word16 agc_reset(agcState *st);
+
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function    : agc
+    ;  Purpose     : Scales the postfilter output on a subframe basis
+    ;  Description : sig_out[n] = sig_out[n] * gain[n];
+    ;                where gain[n] is the gain at the nth sample given by
+    ;                gain[n] = agc_fac * gain[n-1] + (1 - agc_fac) g_in/g_out
+    ;                g_in/g_out is the square root of the ratio of energy at
+    ;                the input and output of the postfilter.
+    ;
+    ----------------------------------------------------------------------------*/
+    void agc(
+        agcState *st,      /* i/o : agc state                         */
+        Word16 *sig_in,    /* i   : postfilter input signal, (l_trm)  */
+        Word16 *sig_out,   /* i/o : postfilter output signal, (l_trm) */
+        Word16 agc_fac,    /* i   : AGC factor                        */
+        Word16 l_trm,      /* i   : subframe size                     */
+        Flag *pOverflow    /* i   : overflow flag                     */
+    );
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:  agc2
+    ;  Purpose:   Scales the excitation on a subframe basis
+    ;
+    ----------------------------------------------------------------------------*/
+    void agc2(
+        Word16 *sig_in,    /* i   : postfilter input signal   */
+        Word16 *sig_out,   /* i/o : postfilter output signal  */
+        Word16 l_trm,      /* i   : subframe size             */
+        Flag *pOverflow    /* i   : overflow flag             */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _AGC_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/amrdecode.cpp b/media/libstagefright/codecs/amrnb/dec/src/amrdecode.cpp
new file mode 100644
index 0000000..873d7af
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/amrdecode.cpp
@@ -0,0 +1,544 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+ Pathname: ./audio/gsm-amr/c/src/amrdecode.c
+
+     Date: 05/23/2001
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:       AMRDecode now doesn't call getbits() or put_header_in().
+                    It also now obtains a new bit_offset value from a constant
+                    rather than from the returned value of getbits().
+
+ Description:       AMRDecode now returns byte_offset rather than bit_offset,
+                    so the program can access the next frame that is byte
+                    aligned rather than packed without padding.
+
+ Description:       The structure types Speech_Decode_FrameState are now
+                    passed into amrdecode( ) using void pointers, so that
+                    higher level functions don't need to know anything about
+                    this structure type.
+
+ Description: Changed input argument list. Added code to handle incoming DTX
+              frames, and added call to wmf_to_ets function prior to calling
+              GSMFrameDecode.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Changed all references to bit_offset to byte_offset.
+
+ Description: Added input_type to the function interface and modified code
+              to check type of conversion that needs to be made.
+
+ Description: Modified pseudo-code to include IF2 and ETS input formats.
+              Removed byte_offset from input list. Renamed speech_bits
+              to speech_bits_ptr.
+
+ Description: Added dec_input_format_tab.h in Include section. Modified
+              pseudo-code to use correct table names. Renamed input_type to
+              input_format and speech_bits to speech_bits_ptr.
+
+ Description: Removed *prev_mode_ptr in the input argument list.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Removed dec_input_format_tab.h from Include section.
+              2. Changed type definition of raw_pcm_buffer in the I/O
+                 definition section.
+
+ Description: Renamed WmfBytesPerFrame to WmfDecBytesPerFrame, and
+              If2BytesPerFrame to If2DecBytesPerFrame.
+
+ Description: Modified code so that the ETS testvectors could be fed directly
+              to this function.
+
+ Description: Changed '&' to '&&' in the setting of rx_type and mode for
+              AMR_SID < frame_type < NO_DATA case.
+
+ Description: Added code comments and made some code optimizations per Phase
+              2/3 review comments.
+
+ Description: Added conditional compile around the call to GSMFrameDecode to
+              allow amrdecode.c to be used in the ETS reference console.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "amrdecode.h"
+#include "cnst.h"
+#include "typedef.h"
+#include "frame.h"
+#include "sp_dec.h"
+#include "wmf_to_ets.h"
+#include "if2_to_ets.h"
+#include "frame_type_3gpp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: AMRDecode
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state_data      = pointer to a structure (type void)
+
+    frame_type      = 3GPP frame type (enum Frame_Type_3GPP)
+
+    speech_bits_ptr = pointer to the beginning of the raw encoded speech bits
+                      for the current frame to be decoded (unsigned char)
+
+    raw_pcm_buffer  = pointer to the output pcm outputs array (Word16)
+
+    input_format    = input format used; valid values are AMR_WMF, AMR_IF2,
+                      and AMR_ETS (Word16)
+
+ Outputs:
+    raw_pcm_buffer contains the newly decoded linear PCM speech samples
+    state_data->prev_mode contains the new mode
+
+ Returns:
+    byte_offset     = address offset of the next frame to be processed or
+                      error condition flag (-1) (int)
+
+ Global Variables Used:
+    WmfDecBytesPerFrame = table containing the number of core AMR data bytes
+                          used by each codec mode for WMF input format (const
+                          int)
+
+    If2DecBytesPerFrame = table containing the number of core AMR data bytes
+                          used by each codec mode for IF2 input format (const
+                          int)
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function is the top level entry function to the GSM AMR Decoder library.
+
+ First, it checks the input format type (input_format) to determine the type
+ of de-formattting that needs to be done. If input_format is AMR_WMF, the input
+ data is in WMF (aka, non-IF2) format and the function wmf_to_ets will be
+ called to convert to the ETS format (1 bit/word, where 1 word = 16 bits),
+ and byte_offset will be updated according to the contents of WmfDecBytesPerFrame
+ table.
+
+ If input_format is AMR_IF2, the input data is in IF2 format [1] and the
+ function if2_to_ets will be called to convert to the ETS format, and
+ byte_offset will be updated according to the contents of If2DecBytesPerFrame
+ table.
+
+ The codec mode and receive frame type is initialized based on the incoming
+ frame_type.
+
+ If input_format is AMR_ETS, the input data is in the ETS format. The receive
+ frame type is set to the value in the first location of the buffer pointed to
+ by speech_bits_ptr. Then, the encoded speech parameters in the buffer pointed
+ to by speech_bits is copied to dec_ets_input_bfr and the type will be changed
+ from unsigned char to Word16. Lastly, if the receive frame type is not
+ RX_NO_DATA, the mode is obtained from the buffer pointed to by
+ speech_bits_ptr, offset by MAX_SERIAL_SIZE+1, otherwise, the mode is set to
+ the previous mode (found the in state_data->prev_mode).
+
+ If input_format is an unsupported format, byte_offset will be set to -1, to
+ indicate an error condition has occurred, and the function will exit.
+
+ If there are no errors, GSMFrameDecode is called to decode a 20 ms frame. It
+ puts the decoded linear PCM samples in the buffer pointed to by
+ raw_pcm_buffer. Then, the prev_mode field of the structure pointed to by
+ state_data is updated to the current mode.
+
+ This function returns the new byte_offset value to indicate the address
+ offset of the next speech frame to be decoded.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] "AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0
+     Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Note: AMRSID_RXTYPE_BIT_OFFSET = 35
+       AMRSID_RXMODE_BIT_OFFSET = 36
+       NUM_AMRSID_RXMODE_BITS = 3
+
+
+ // Set up Decoder state structure pointer
+ Speech_Decode_FrameState *decoder_state
+            = (Speech_Decode_FrameState *) state_data
+
+ // Determine type of de-formatting
+
+ // Decode WMF or IF2 frames
+ IF ((input_format == AMR_RX_WMF) | (input_format == AMR_RX_IF2))
+ THEN
+     IF (input_format == AMR_RX_WMF)
+     THEN
+         // Convert incoming packetized raw WMF data to ETS format
+         CALL wmf_to_ets(frame_type = frame_type
+                         input_ptr = speech_bits_ptr
+                         output_ptr = &dec_ets_input_bfr)
+           MODIFYING(nothing)
+           RETURNING(nothing)
+
+         // Address offset of the start of next frame
+         byte_offset = WmfDecBytesPerFrame[frame_type]
+
+     ELSEIF (input_format == AMR_RX_IF2)
+     THEN
+         // Convert incoming packetized raw IF2 data to ETS format
+         CALL if2_to_ets(frame_type = frame_type
+                         input_ptr = speech_bits_ptr
+                         output_ptr = &dec_ets_input_bfr)
+           MODIFYING(nothing)
+           RETURNING(nothing)
+
+         // Address offset of the start of next frame
+         byte_offset = If2DecBytesPerFrame[frame_type]
+
+     ENDIF
+
+       // Determine AMR codec mode and AMR RX frame type
+     IF (frame_type <= AMR_122)
+     THEN
+         mode = (enum Mode) frame_type;
+         rx_type = RX_SPEECH_GOOD;
+
+     ELSEIF (frame_type == AMR_SID)
+     THEN
+         // Clear mode store prior to reading mode info from input buffer
+         mode = 0
+
+         FOR i = 0 TO NUM_AMRSID_RXMODE_BITS-1
+
+             mode |= (dec_ets_input_bfr[AMRSID_RXMODE_BIT_OFFSET+i] << i)
+
+         ENDFOR
+
+         IF (dec_ets_input_bfr[AMRSID_RXTYPE_BIT_OFFSET] == 0)
+         THEN
+             rx_type = RX_SID_FIRST
+
+         ELSE
+             rx_type = RX_SID_UPDATE
+
+         ENDIF
+
+     ELSEIF ((frame_type > AMR_SID) && (frame_type < NO_DATA))
+     THEN
+         // Use previous mode
+         mode = decoder_state->prev_mode
+
+         // Unsupported SID frames
+         rx_type = RX_SPEECH_BAD;
+
+     ELSE
+         // Use previous mode
+         mode = decoder_state->prev_mode
+
+         // No data received
+         rx_type = RX_NO_DATA;
+
+     ENDIF
+
+ // Decode ETS frames
+ ELSEIF (input_format == AMR_RX_ETS)
+ THEN
+     // Change type of pointer to incoming raw ETS data
+     ets_word_ptr = (Word16 *) speech_bits_ptr
+
+     // Get RX frame type
+     rx_type = (enum RXFrameType) *ets_word_ptr
+     ets_word_ptr = ets_word_ptr + 1
+
+     // Copy incoming raw ETS data to dec_ets_input_bfr
+     FOR i = 0 TO MAX_SERIAL_SIZE-1
+
+         dec_ets_input_bfr[i] = *ets_word_ptr
+         ets_word_ptr = ets_word_ptr + 1
+
+     ENDFOR
+
+     // Get codec mode
+     IF (rx_type != RX_NO_DATA)
+     THEN
+         mode = (enum Mode) *ets_word_ptr
+
+     ELSE
+         //Use previous mode if no received data
+         mode = decoder_state->prev_mode
+
+     ENDIF
+
+     // Set up byte_offset
+     byte_offset = 2*(MAX_SERIAL_SIZE+2)
+
+ ELSE
+     // Invalid format, return error code
+     byte_offset = -1
+
+ ENDIF
+
+ // Proceed with decoding frame, if there are no errors
+ IF (byte_offset != -1)
+ THEN
+     // Decode a 20 ms frame
+     CALL GSMFrameDecode( st = decoder_state
+                          mode = mode
+                          serial = dec_ets_input_bfr,
+                          frame_type = rx_type,
+                          synth = (Word16 *)raw_pcm_buffer);
+       MODIFYING (nothing)
+       RETURNING (Nothing)
+
+     // Save mode for next frame
+     decoder_state->prev_mode = mode
+
+ ENDIF
+
+ RETURN (byte_offset)
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 AMRDecode(
+    void                      *state_data,
+    enum Frame_Type_3GPP      frame_type,
+    UWord8                    *speech_bits_ptr,
+    Word16                    *raw_pcm_buffer,
+    bitstream_format          input_format
+)
+{
+    Word16 *ets_word_ptr;
+    enum Mode mode = (enum Mode)MR475;
+    int modeStore;
+    int tempInt;
+    enum RXFrameType rx_type = RX_NO_DATA;
+    Word16 dec_ets_input_bfr[MAX_SERIAL_SIZE];
+    Word16 i;
+    Word16 byte_offset = -1;
+
+    /* Type cast state_data to Speech_Decode_FrameState rather than passing
+     * that structure type to this function so the structure make up can't
+     * be viewed from higher level functions than this.
+     */
+    Speech_Decode_FrameState *decoder_state
+    = (Speech_Decode_FrameState *) state_data;
+
+    /* Determine type of de-formatting */
+    /* WMF or IF2 frames */
+    if ((input_format == MIME_IETF) | (input_format == IF2))
+    {
+        if (input_format == MIME_IETF)
+        {
+            /* Convert incoming packetized raw WMF data to ETS format */
+            wmf_to_ets(frame_type, speech_bits_ptr, dec_ets_input_bfr);
+
+            /* Address offset of the start of next frame */
+            byte_offset = WmfDecBytesPerFrame[frame_type];
+        }
+        else   /* else has to be input_format  IF2 */
+        {
+            /* Convert incoming packetized raw IF2 data to ETS format */
+            if2_to_ets(frame_type, speech_bits_ptr, dec_ets_input_bfr);
+
+            /* Address offset of the start of next frame */
+            byte_offset = If2DecBytesPerFrame[frame_type];
+        }
+
+        /* At this point, input data is in ETS format     */
+        /* Determine AMR codec mode and AMR RX frame type */
+        if (frame_type <= AMR_122)
+        {
+            mode = (enum Mode) frame_type;
+            rx_type = RX_SPEECH_GOOD;
+        }
+        else if (frame_type == AMR_SID)
+        {
+            /* Clear mode store prior to reading mode info from input buffer */
+            modeStore = 0;
+
+            for (i = 0; i < NUM_AMRSID_RXMODE_BITS; i++)
+            {
+                tempInt = dec_ets_input_bfr[AMRSID_RXMODE_BIT_OFFSET+i] << i;
+                modeStore |= tempInt;
+            }
+            mode = (enum Mode) modeStore;
+
+            /* Get RX frame type */
+            if (dec_ets_input_bfr[AMRSID_RXTYPE_BIT_OFFSET] == 0)
+            {
+                rx_type = RX_SID_FIRST;
+            }
+            else
+            {
+                rx_type = RX_SID_UPDATE;
+            }
+        }
+        else if (frame_type < AMR_NO_DATA)
+        {
+            /* Invalid frame_type, return error code */
+            byte_offset = -1;   /*  !!! */
+        }
+        else
+        {
+            mode = decoder_state->prev_mode;
+
+            /*
+             * RX_NO_DATA, generate exponential decay from latest valid frame for the first 6 frames
+             * after that, create silent frames
+             */
+            rx_type = RX_NO_DATA;
+
+        }
+
+    }
+
+    /* ETS frames */
+    else if (input_format == ETS)
+    {
+        /* Change type of pointer to incoming raw ETS data */
+        ets_word_ptr = (Word16 *) speech_bits_ptr;
+
+        /* Get RX frame type */
+        rx_type = (enum RXFrameType) * ets_word_ptr;
+        ets_word_ptr++;
+
+        /* Copy incoming raw ETS data to dec_ets_input_bfr */
+        for (i = 0; i < MAX_SERIAL_SIZE; i++)
+        {
+            dec_ets_input_bfr[i] = *ets_word_ptr;
+            ets_word_ptr++;
+        }
+
+        /* Get codec mode */
+        if (rx_type != RX_NO_DATA)
+        {
+            /* Get mode from input bitstream */
+            mode = (enum Mode) * ets_word_ptr;
+        }
+        else
+        {
+            /* Use previous mode if no received data */
+            mode = decoder_state->prev_mode;
+        }
+
+        /* Set up byte_offset */
+        byte_offset = 2 * (MAX_SERIAL_SIZE + 2);
+    }
+    else
+    {
+        /* Invalid input format, return error code */
+        byte_offset = -1;
+    }
+
+    /* Proceed with decoding frame, if there are no errors */
+    if (byte_offset != -1)
+    {
+        /* Decode a 20 ms frame */
+
+#ifndef CONSOLE_DECODER_REF
+        /* Use PV version of sp_dec.c */
+        GSMFrameDecode(decoder_state, mode, dec_ets_input_bfr, rx_type,
+                       raw_pcm_buffer);
+
+#else
+        /* Use ETS version of sp_dec.c */
+        Speech_Decode_Frame(decoder_state, mode, dec_ets_input_bfr, rx_type,
+                            raw_pcm_buffer);
+
+#endif
+
+        /* Save mode for next frame */
+        decoder_state->prev_mode = mode;
+    }
+
+    return (byte_offset);
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/amrdecode.h b/media/libstagefright/codecs/amrnb/dec/src/amrdecode.h
new file mode 100644
index 0000000..db951b9
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/amrdecode.h
@@ -0,0 +1,166 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./gsm-amr/c/include/amrdecode.h
+
+     Date: 05/23/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added BytesUsed table so that the code can allow for padding
+              at the end of each frame.
+
+ Description: Removed function prototypes for getbits, putbits,
+              put_frame_header_in, and get_frame_header_off. Removed
+              basicop_malloc.h and replaced it with typedef.h in the include
+              section. Fixed table entries for various SID modes. Removed
+              #defines because they are not used by AMRDecode function.
+              Removed tables not used by AMRDecode function.
+
+ Description: The data type Speech_Decode_FrameState is now being passed into
+              this function as a void pointer rather than a structure of type
+              Speech_Decode_FrameState.
+
+ Description: The variable decoder_state was renamed to state_data.
+
+ Description: Updated function prototype and header template.
+
+ Description: Added mode.h and frame_type_3gpp.h to include section, and
+              removed sp_dec.h.
+
+ Description: Removed definition of Changed BytesThisFrame[] table. Added
+              extern declaration for BytesThisFrame[] table.
+
+ Description: Added #define for WMF and IF2. Updated function prototype.
+
+ Description: Moved input format #defines and BytesThisFrame table to
+              dec_input_format_tab.h and dec_input_format_tab.c, respectively.
+              Updated function prototype.
+
+ Description: Updated function prototype of AMRDecode due to the removal of
+              *prev_mode_ptr. Added extern of If2BytesPerFrame
+
+ Description: Added #defines for WMF, IF2, and ETS input formats.
+
+ Description: Changed WmfBytesPerFrame to WmfDecBytesPerFrame, and
+              If2BytesPerFrame to If2DecBytesPerFrame.
+
+ Description: Renamed #defines for input format types to make it unique to the
+              decoder.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the norm_s function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef ARMDECODE_H
+#define ARMDECODE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+#include    "mode.h"
+#include    "frame_type_3gpp.h"
+#include    "pvamrnbdecoder_api.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define NUM_AMRSID_RXMODE_BITS   3
+#define AMRSID_RXMODE_BIT_OFFSET 36
+#define AMRSID_RXTYPE_BIT_OFFSET 35
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 WmfDecBytesPerFrame[];
+    extern const Word16 If2DecBytesPerFrame[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word16 AMRDecode(
+        void *state_data,
+        enum Frame_Type_3GPP  frame_type,
+        UWord8 *speech_bits_ptr,
+        Word16 *raw_pcm_buffer,
+        bitstream_format input_format
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _AMRDECODE_H_ */
diff --git a/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.cpp b/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.cpp
new file mode 100644
index 0000000..e62e483
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.cpp
@@ -0,0 +1,516 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/b_cn_cod.c
+ Functions: pseudonoise
+            build_CN_code
+            build_CN_param
+
+     Date: 09/28/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template. Cleaned up code. Passing in a pointer to
+              overflow flag for build_CN_code() and build_CN_param() functions.
+              Removed unnecessary header files.
+ Description: Make chnages per formal review. Fix error introduced during
+              optimization in pseudonoise().
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This module contains functions for comfort noise(CN) generation.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "b_cn_cod.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; [Define module specific macros here]
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; [Include all pre-processor statements here. Include conditional
+; compile variables also.]
+----------------------------------------------------------------------------*/
+#define  NB_PULSE 10        /* number of random pulses in DTX operation   */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; [List function prototypes here]
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; [Variable declaration - defined here and used outside this module]
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: pseudonoise
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pShift_reg = pointer to Old CN generator shift register state (Word32)
+    no_bits = Number of bits (Word16)
+
+ Outputs:
+    pShift_reg -> Updated CN generator shift register state
+
+ Returns:
+    noise_bits = Generated random integer value (Word16)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Generate a random integer value to use in comfort noise generation. The
+ algorithm uses polynomial x^31 + x^3 + 1. Length of the PN sequence
+ is 2^31 - 1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ b_cn_cod.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 pseudonoise (
+    Word32 *shift_reg, // i/o : Old CN generator shift register state
+    Word16 no_bits     // i   : Number of bits
+)
+{
+   Word16 noise_bits, Sn, i;
+
+   noise_bits = 0;
+   for (i = 0; i < no_bits; i++)
+   {
+      // State n == 31
+      if ((*shift_reg & 0x00000001L) != 0)
+      {
+         Sn = 1;
+      }
+      else
+      {
+         Sn = 0;
+      }
+
+      // State n == 3
+      if ((*shift_reg & 0x10000000L) != 0)
+      {
+         Sn = Sn ^ 1;
+      }
+      else
+      {
+         Sn = Sn ^ 0;
+      }
+
+      noise_bits = shl (noise_bits, 1);
+      noise_bits = noise_bits | (extract_l (*shift_reg) & 1);
+
+      *shift_reg = L_shr (*shift_reg, 1);
+      if (Sn & 1)
+      {
+         *shift_reg = *shift_reg | 0x40000000L;
+      }
+   }
+   return noise_bits;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Word16 pseudonoise(
+    Word32 *pShift_reg,     /* i/o : Old CN generator shift register state */
+    Word16 no_bits          /* i   : Number of bits                        */
+)
+{
+    Word16 noise_bits;
+    Word16 Sn;
+    Word16 i;
+    Word16 temp;
+
+    noise_bits = 0;
+
+    for (i = 0; i < no_bits; i++)
+    {
+        /* State n == 31 */
+        if ((*pShift_reg & 0x00000001L) != 0)
+        {
+            Sn = 1;
+        }
+        else
+        {
+            Sn = 0;
+        }
+
+        /* State n == 3 */
+        if ((*pShift_reg & 0x10000000L) != 0)
+        {
+            Sn ^= 1;
+        }
+        else
+        {
+            Sn ^= 0;
+        }
+
+        noise_bits <<= 1;
+
+        temp = (Word16)((*pShift_reg) & 1);
+        noise_bits |= temp;
+
+        *pShift_reg >>= 1;
+        if (Sn & 1)
+        {
+            *pShift_reg |= 0x40000000L;
+        }
+    }
+    return noise_bits;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: build_CN_code
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pSeed = pointer to the Old CN generator shift register state (Word32)
+    cod[] = array to hold the generated CN fixed code vector (Word16)
+    pOverflow = pointer to overflow flag (Flag)
+
+ Outputs:
+    cod[] = generated CN fixed code vector (Word16)
+    pSeed = Updated CN generator shift register state (Word16)
+    pOverflow -> 1 if overflow occured
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+This function computes the comfort noise fixed codebook excitation. The gains
+of the pulses are always +/-1.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ b_cn_cod.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void build_CN_code (
+    Word32 *seed,         // i/o : Old CN generator shift register state
+    Word16 cod[]          // o   : Generated CN fixed codebook vector
+)
+{
+   Word16 i, j, k;
+
+   for (i = 0; i < L_SUBFR; i++)
+   {
+      cod[i] = 0;
+   }
+
+// The reference ETSI code uses a global flag for Overflow. However in the
+// actual implementation a pointer to the overflow flag is passed into the
+// function so that it can be passed into the basic math functions L_mult()
+// and add()
+
+   for (k = 0; k < NB_PULSE; k++)
+   {
+      i = pseudonoise (seed, 2);      // generate pulse position
+      i = shr (extract_l (L_mult (i, 10)), 1);
+      i = add (i, k);
+
+      j = pseudonoise (seed, 1);      // generate sign
+
+      if (j > 0)
+      {
+         cod[i] = 4096;
+      }
+      else
+      {
+         cod[i] = -4096;
+      }
+   }
+
+   return;
+}
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void build_CN_code(
+    Word32 *pSeed,          /* i/o : Old CN generator shift register state  */
+    Word16 cod[],           /* o   : Generated CN fixed codebook vector     */
+    Flag   *pOverflow       /* i/o : Overflow flag                          */
+)
+{
+    Word16 i, j, k;
+    Word16 temp;
+
+    for (i = 0; i < L_SUBFR; i++)
+    {
+        cod[i] = 0;
+    }
+
+    for (k = 0; k < NB_PULSE; k++)
+    {
+        i = pseudonoise(pSeed, 2);       /* generate pulse position */
+
+        temp = (Word16)(L_mult(i, 10, pOverflow));
+        i = temp >> 1;
+        i = add(i, k, pOverflow);
+
+        j = pseudonoise(pSeed, 1);       /* generate sign */
+
+        if (j > 0)
+        {
+            cod[i] = 4096;
+        }
+        else
+        {
+            cod[i] = -4096;
+        }
+    }
+
+    return;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: build_CN_param
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pSeed = pointer to the Old CN generator shift register state (Word32)
+    n_param = Number of parameters to randomize (Word16)
+    param_size_table = table holding paameter sizes (Word16)
+    param[] = array to hold CN generated paramters (Word16)
+    pOverflow = pointer to overflow flag (Flag)
+
+ Outputs:
+    param[] = CN generated parameters (Word16)
+    pSeed = Updated CN generator shift register state (Word16)
+    pOverflow -> 1 if overflow occured
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+This function randomizes the speech parameters, so that they do not produce
+tonal artifacts if used by ECU.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ b_cn_cod.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+void build_CN_param (
+    Word16 *seed,             // i/o : Old CN generator shift register state
+    const Word16 n_param,           // i  : number of params
+    const Word16 param_size_table[],// i : size of params
+    Word16 parm[]                   // o : CN Generated params
+    )
+{
+   Word16 i;
+   const Word16 *p;
+
+// The reference ETSI code uses a global flag for Overflow. However in the
+// actual implementation a pointer to the overflow flag is passed into the
+// function so that it can be passed into the basic math functions L_add()
+// and L_mult()
+
+   *seed = extract_l(L_add(L_shr(L_mult(*seed, 31821), 1), 13849L));
+
+   p = &window_200_40[*seed & 0x7F];
+   for(i=0; i< n_param;i++){
+     parm[i] = *p++ & ~(0xFFFF<<param_size_table[i]);
+   }
+}
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void build_CN_param(
+    Word16 *pSeed,          /* i/o : Old CN generator shift register state  */
+    const Word16 n_param,           /* i  : number of params                */
+    const Word16 param_size_table[],/* i : size of params                   */
+    Word16 parm[],                  /* o : CN Generated params              */
+    Flag  *pOverflow                /* i/o : Overflow Flag                  */
+)
+
+{
+    Word16 i;
+    const Word16 *pTemp;
+    Word32 L_temp;
+    Word16 temp;
+
+    L_temp = L_mult(*pSeed, 31821, pOverflow);
+    L_temp >>= 1;
+
+    *pSeed = (Word16)(L_add(L_temp, 13849L, pOverflow));
+
+    pTemp = &window_200_40[*pSeed & 0x7F];
+
+    for (i = 0; i < n_param; i++)
+    {
+        temp = ~(0xFFFF << param_size_table[i]);
+        parm[i] = *pTemp++ & temp;
+    }
+}
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.h b/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.h
new file mode 100644
index 0000000..743237c
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/b_cn_cod.h
@@ -0,0 +1,171 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/add.h
+
+
+
+
+     Date: 08/11/2000
+
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description: Created separate header file for add function.
+
+ Description: Changed function prototype; pointer to  overflow flag is passed
+              in as a parameter.
+
+ Description: Updated copyright section.
+              Changed "overflow" to "pOverflow" in the function prototype.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the comfort noise(CN) generator functions
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef B_CN_COD_H
+#define B_CN_COD_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "basicop_malloc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 window_200_40[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+
+    ; FUNCTION NAME: pseudonoise
+    ;
+    ; PURPOSE: Generate a random integer value to use in comfort noise
+    ;          generation. The algorithm uses polynomial x^31 + x^3 + 1
+    ;          (length of PN sequence is 2^31 - 1).
+    ;
+    ----------------------------------------------------------------------------*/
+
+    Word16 pseudonoise(
+        Word32 *pShift_reg,     /* i/o : Old CN generator shift register state */
+        Word16 no_bits          /* i   : Number of bits                        */
+    );
+
+    /*----------------------------------------------------------------------------
+
+    ; FUNCTION NAME: build_CN_code
+    ;
+    ; PURPOSE: Compute the comfort noise fixed codebook excitation. The
+    ;          gains of the pulses are always +/-1.
+    ;
+    ----------------------------------------------------------------------------*/
+
+    void build_CN_code(
+        Word32 *pSeed,          /* i/o : Old CN generator shift register state  */
+        Word16 cod[],           /* o   : Generated CN fixed codebook vector     */
+        Flag   *pOverflow       /* i/o : Overflow flag                          */
+    );
+
+    /*----------------------------------------------------------------------------
+
+    ; FUNCTION NAME: build_CN_param
+    ;
+    ; PURPOSE: Randomize the speech parameters. So that they
+    ;          do not produce tonal artifacts if used by ECU.
+    ;
+    ----------------------------------------------------------------------------*/
+
+    void build_CN_param(
+        Word16 *pSeed,          /* i/o : Old CN generator shift register state  */
+        const Word16 n_param,               /* i  : number of params            */
+        const Word16 param_size_table[],    /* i : size of params               */
+        Word16 parm[],                  /* o : CN Generated params              */
+        Flag  *pOverflow                /* i/o : Overflow Flag                  */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _B_CN_COD_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/bgnscd.cpp b/media/libstagefright/codecs/amrnb/dec/src/bgnscd.cpp
new file mode 100644
index 0000000..e732007
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/bgnscd.cpp
@@ -0,0 +1,589 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Pathname: ./audio/gsm-amr/c/src/bgnscd.c
+ Functions:
+           Bgn_scd_reset
+           Bgn_scd
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Background noise source characteristic detector (SCD)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <string.h>
+
+#include    "bgnscd.h"
+#include    "typedef.h"
+#include    "basic_op.h"
+#include    "cnst.h"
+#include    "copy.h"
+#include    "gmed_n.h"
+#include    "sqrt_l.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define TRUE  1
+#define FALSE 0
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Bgn_scd_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = points to memory of type Bgn_scdState.
+
+ Outputs:
+    The memory of type Bgn_scdState pointed to by state is set to all
+        zeros.
+
+ Returns:
+    Returns 0 if memory was successfully initialized,
+        otherwise returns -1.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Resets state memory.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ bgnscd.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 Bgn_scd_reset (Bgn_scdState *state)
+{
+   if (state == (Bgn_scdState *) NULL){
+      fprintf(stderr, "Bgn_scd_reset: invalid parameter\n");
+      return -1;
+   }
+
+   // Static vectors to zero
+   Set_zero (state->frameEnergyHist, L_ENERGYHIST);
+
+   // Initialize hangover handling
+   state->bgHangover = 0;
+
+   return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16  Bgn_scd_reset(Bgn_scdState *state)
+{
+    if (state == (Bgn_scdState *) NULL)
+    {
+        /* fprintf(stderr, "Bgn_scd_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    /* Static vectors to zero */
+    memset(state->frameEnergyHist, 0, L_ENERGYHIST*sizeof(Word16));
+
+    /* Initialize hangover handling */
+    state->bgHangover = 0;
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Bgn_scd
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to state variables of type Bgn_scdState
+    ltpGainHist[] = LTP gain history (Word16)
+    speech[] = synthesis speech frame (Word16)
+    voicedHangover = pointer to # of frames after last voiced frame (Word16)
+    pOverflow      = pointer to overflow indicator (Flag)
+
+ Outputs:
+    st = function updates the state variables of type Bgn_scdState
+        pointed to by st.
+    voicedHangover = function updates the # of frames after last voiced
+        frame pointed to by voicedHangover.
+    pOverflow = 1 if the basic math function L_add() results in saturation.
+                  else pOverflow is zero.
+
+ Returns:
+    inbgNoise = flag if background noise is present (Word16)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Characterize synthesis speech and detect background noise.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ bgnscd.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 Bgn_scd (Bgn_scdState *st,      // i : State variables for bgn SCD
+                Word16 ltpGainHist[],  // i : LTP gain history
+                Word16 speech[],       // o : synthesis speech frame
+                Word16 *voicedHangover // o : # of frames after last
+                                              voiced frame
+                )
+{
+   Word16 i;
+   Word16 prevVoiced, inbgNoise;
+   Word16 temp;
+   Word16 ltpLimit, frameEnergyMin;
+   Word16 currEnergy, noiseFloor, maxEnergy, maxEnergyLastPart;
+   Word32 s;
+
+   // Update the inBackgroundNoise flag (valid for use in next frame if BFI)
+   // it now works as a energy detector floating on top
+   // not as good as a VAD.
+
+   currEnergy = 0;
+   s = (Word32) 0;
+
+   for (i = 0; i < L_FRAME; i++)
+   {
+       s = L_mac (s, speech[i], speech[i]);
+   }
+
+   s = L_shl(s, 2);
+
+   currEnergy = extract_h (s);
+
+   frameEnergyMin = 32767;
+
+   for (i = 0; i < L_ENERGYHIST; i++)
+   {
+      if (sub(st->frameEnergyHist[i], frameEnergyMin) < 0)
+         frameEnergyMin = st->frameEnergyHist[i];
+   }
+
+   noiseFloor = shl (frameEnergyMin, 4); // Frame Energy Margin of 16
+
+   maxEnergy = st->frameEnergyHist[0];
+   for (i = 1; i < L_ENERGYHIST-4; i++)
+   {
+      if ( sub (maxEnergy, st->frameEnergyHist[i]) < 0)
+      {
+         maxEnergy = st->frameEnergyHist[i];
+      }
+   }
+
+   maxEnergyLastPart = st->frameEnergyHist[2*L_ENERGYHIST/3];
+   for (i = 2*L_ENERGYHIST/3+1; i < L_ENERGYHIST; i++)
+   {
+      if ( sub (maxEnergyLastPart, st->frameEnergyHist[i] ) < 0)
+      {
+         maxEnergyLastPart = st->frameEnergyHist[i];
+      }
+   }
+
+   inbgNoise = 0;        // false
+
+   // Do not consider silence as noise
+   // Do not consider continuous high volume as noise
+   // Or if the current noise level is very low
+   // Mark as noise if under current noise limit
+   // OR if the maximum energy is below the upper limit
+
+   if ( (sub(maxEnergy, LOWERNOISELIMIT) > 0) &&
+        (sub(currEnergy, FRAMEENERGYLIMIT) < 0) &&
+        (sub(currEnergy, LOWERNOISELIMIT) > 0) &&
+        ( (sub(currEnergy, noiseFloor) < 0) ||
+          (sub(maxEnergyLastPart, UPPERNOISELIMIT) < 0)))
+   {
+      if (sub(add(st->bgHangover, 1), 30) > 0)
+      {
+         st->bgHangover = 30;
+      } else
+      {
+         st->bgHangover = add(st->bgHangover, 1);
+      }
+   }
+   else
+   {
+      st->bgHangover = 0;
+   }
+
+   // make final decision about frame state , act somewhat cautiosly
+   if (sub(st->bgHangover,1) > 0)
+      inbgNoise = 1;       // true
+
+   for (i = 0; i < L_ENERGYHIST-1; i++)
+   {
+      st->frameEnergyHist[i] = st->frameEnergyHist[i+1];
+   }
+   st->frameEnergyHist[L_ENERGYHIST-1] = currEnergy;
+
+   // prepare for voicing decision; tighten the threshold after some
+      time in noise
+   ltpLimit = 13926;             // 0.85  Q14
+   if (sub(st->bgHangover, 8) > 0)
+   {
+      ltpLimit = 15565;          // 0.95  Q14
+   }
+   if (sub(st->bgHangover, 15) > 0)
+   {
+      ltpLimit = 16383;          // 1.00  Q14
+   }
+
+   // weak sort of voicing indication.
+   prevVoiced = 0;        // false
+
+   if (sub(gmed_n(&ltpGainHist[4], 5), ltpLimit) > 0)
+   {
+      prevVoiced = 1;     // true
+   }
+   if (sub(st->bgHangover, 20) > 0) {
+      if (sub(gmed_n(ltpGainHist, 9), ltpLimit) > 0)
+      {
+         prevVoiced = 1;  // true
+      }
+      else
+      {
+         prevVoiced = 0;  // false
+      }
+   }
+
+   if (prevVoiced)
+   {
+      *voicedHangover = 0;
+   }
+   else
+   {
+      temp = add(*voicedHangover, 1);
+      if (sub(temp, 10) > 0)
+      {
+         *voicedHangover = 10;
+      }
+      else
+      {
+         *voicedHangover = temp;
+      }
+   }
+
+   return inbgNoise;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16  Bgn_scd(Bgn_scdState *st,       /* i : State variables for bgn SCD  */
+                Word16 ltpGainHist[],  /* i : LTP gain history             */
+                Word16 speech[],       /* o : synthesis speech frame       */
+                Word16 *voicedHangover,/* o : # of frames after last
+                                               voiced frame                 */
+                Flag   *pOverflow
+               )
+{
+    Word16  i;
+    Word16  prevVoiced, inbgNoise;
+    Word16  temp;
+    Word16  ltpLimit, frameEnergyMin;
+    Word16  currEnergy, noiseFloor, maxEnergy, maxEnergyLastPart;
+    Word32  s, L_temp;
+
+
+    /* Update the inBackgroundNoise flag (valid for use in next frame if BFI)   */
+    /* it now works as a energy detector floating on top                        */
+    /* not as good as a VAD.                                                    */
+
+    s = (Word32) 0;
+
+    for (i = L_FRAME - 1; i >= 0; i--)
+    {
+        L_temp = ((Word32) speech[i]) * speech[i];
+        if (L_temp != (Word32) 0x40000000L)
+        {
+            L_temp = L_temp << 1;
+        }
+        else
+        {
+            L_temp = MAX_32;
+        }
+        s = L_add(s, L_temp, pOverflow);
+    }
+
+    /* s is a sum of squares, so don't need to check for neg overflow */
+    if (s > (Word32)0x1fffffffL)
+    {
+        currEnergy = MAX_16;
+    }
+    else
+    {
+        currEnergy = (Word16)(s >> 14);
+    }
+
+    frameEnergyMin = 32767;
+    for (i = L_ENERGYHIST - 1; i >= 0; i--)
+    {
+        if (st->frameEnergyHist[i] < frameEnergyMin)
+        {
+            frameEnergyMin = st->frameEnergyHist[i];
+        }
+    }
+
+    /* Frame Energy Margin of 16 */
+    L_temp = (Word32)frameEnergyMin << 4;
+    if (L_temp != (Word32)((Word16) L_temp))
+    {
+        if (L_temp > 0)
+        {
+            noiseFloor = MAX_16;
+        }
+        else
+        {
+            noiseFloor = MIN_16;
+        }
+    }
+    else
+    {
+        noiseFloor = (Word16)(L_temp);
+    }
+
+    maxEnergy = st->frameEnergyHist[0];
+    for (i = L_ENERGYHIST - 5; i >= 1; i--)
+    {
+        if (maxEnergy < st->frameEnergyHist[i])
+        {
+            maxEnergy = st->frameEnergyHist[i];
+        }
+    }
+
+    maxEnergyLastPart = st->frameEnergyHist[2*L_ENERGYHIST/3];
+    for (i = 2 * L_ENERGYHIST / 3 + 1; i < L_ENERGYHIST; i++)
+    {
+        if (maxEnergyLastPart < st->frameEnergyHist[i])
+        {
+            maxEnergyLastPart = st->frameEnergyHist[i];
+        }
+    }
+
+    /* Do not consider silence as noise */
+    /* Do not consider continuous high volume as noise */
+    /* Or if the current noise level is very low */
+    /* Mark as noise if under current noise limit */
+    /* OR if the maximum energy is below the upper limit */
+
+    if ((maxEnergy > LOWERNOISELIMIT) &&
+            (currEnergy < FRAMEENERGYLIMIT) &&
+            (currEnergy > LOWERNOISELIMIT) &&
+            ((currEnergy < noiseFloor) ||
+             (maxEnergyLastPart < UPPERNOISELIMIT)))
+    {
+        if ((st->bgHangover + 1) > 30)
+        {
+            st->bgHangover = 30;
+        }
+        else
+        {
+            st->bgHangover += 1;
+        }
+    }
+    else
+    {
+        st->bgHangover = 0;
+    }
+
+    /* make final decision about frame state , act somewhat cautiosly */
+
+    if (st->bgHangover > 1)
+    {
+        inbgNoise = TRUE;
+    }
+    else
+    {
+        inbgNoise = FALSE;
+    }
+
+    for (i = 0; i < L_ENERGYHIST - 1; i++)
+    {
+        st->frameEnergyHist[i] = st->frameEnergyHist[i+1];
+    }
+    st->frameEnergyHist[L_ENERGYHIST-1] = currEnergy;
+
+    /* prepare for voicing decision; tighten the threshold after some
+       time in noise */
+
+    if (st->bgHangover > 15)
+    {
+        ltpLimit = 16383;       /* 1.00  Q14 */
+    }
+    else if (st->bgHangover > 8)
+    {
+        ltpLimit = 15565;       /* 0.95  Q14 */
+    }
+    else
+    {
+        ltpLimit = 13926;       /* 0.85  Q14 */
+    }
+
+    /* weak sort of voicing indication. */
+    prevVoiced = FALSE;
+
+    if (gmed_n(&ltpGainHist[4], 5) > ltpLimit)
+    {
+        prevVoiced = TRUE;
+    }
+
+    if (st->bgHangover > 20)
+    {
+        if (gmed_n(ltpGainHist, 9) > ltpLimit)
+        {
+            prevVoiced = TRUE;
+        }
+        else
+        {
+            prevVoiced = FALSE;
+        }
+    }
+
+
+    if (prevVoiced)
+    {
+        *voicedHangover = 0;
+    }
+    else
+    {
+        temp = *voicedHangover + 1;
+
+        if (temp > 10)
+        {
+            *voicedHangover = 10;
+        }
+        else
+        {
+            *voicedHangover = temp;
+        }
+    }
+
+    return(inbgNoise);
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/bgnscd.h b/media/libstagefright/codecs/amrnb/dec/src/bgnscd.h
new file mode 100644
index 0000000..41349d9
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/bgnscd.h
@@ -0,0 +1,159 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/bgnscd.h
+
+     Date: 12/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : bgnscd.h
+      Purpose          : Background noise source charateristic detector (SCD)
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _BGNSCD_H_
+#define _BGNSCD_H_
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+#define L_ENERGYHIST 60
+#define INV_L_FRAME 102
+
+
+    /* 2*(160*x)^2 / 65536  where x is FLP values 150,5 and 50 */
+#define FRAMEENERGYLIMIT  17578         /* 150 */
+#define LOWERNOISELIMIT      20         /*   5 */
+#define UPPERNOISELIMIT    1953         /*  50 */
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        /* history vector of past synthesis speech energy */
+        Word16 frameEnergyHist[L_ENERGYHIST];
+
+        /* state flags */
+        Word16 bgHangover; /* counter; number of frames after last speech frame */
+
+    } Bgn_scdState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    /*
+     *  Function    : Bgn_scd_init
+     *  Purpose     : Allocates initializes state memory
+     *  Description : Stores pointer to filter status struct in *st. This
+     *                pointer has to be passed to Bgn_scd in each call.
+     *  Returns     : 0 on success
+     */
+    Word16 Bgn_scd_init(Bgn_scdState **st);
+
+    /*
+     *  Function    : Bgn_scd_reset
+     *  Purpose     : Resets state memory
+     *  Returns     : 0 on success
+     */
+    Word16 Bgn_scd_reset(Bgn_scdState *st);
+
+    /*
+     *  Function    : Bgn_scd_exit
+     *  Purpose     : The memory used for state memory is freed
+     *  Description : Stores NULL in *s
+     *  Returns     : void
+     */
+    void Bgn_scd_exit(Bgn_scdState **st);
+
+    /*
+     *  Function    : Bgn_scd
+     *  Purpose     : Charaterice synthesis speech and detect background noise
+     *  Returns     : background noise decision; 0 = bgn, 1 = no bgn
+     */
+    Word16 Bgn_scd(Bgn_scdState *st,       /* i : State variables for bgn SCD         */
+                   Word16 ltpGainHist[],  /* i : LTP gain history                    */
+                   Word16 speech[],       /* o : synthesis speech frame              */
+                   Word16 *voicedHangover,/* o : # of frames after last voiced frame */
+                   Flag   *pOverflow
+                  );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _BGNSCD_H_ */
diff --git a/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.cpp b/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.cpp
new file mode 100644
index 0000000..91d3982
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.cpp
@@ -0,0 +1,648 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/c_g_aver.c
+ Functions:
+            Cb_gain_average_reset
+            Cb_gain_average
+
+     Date: 03/28/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made some changes to the comments to match the comments from
+    other modules.
+
+ Description: Made changes based on comments from the review meeting.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Defined one local variable per line.
+
+ Description: Removed the functions Cb_gain_average_init and
+ Cb_gain_average_exit.  The Cb_gain_average related structure is no longer
+ dynamically allocated.
+
+ Description: Passing in pOverflow to comply with changes needed for EPOC
+              Updated the include files for the module.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains functions that reset and perform
+ codebook gain calculations.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <string.h>
+
+#include    "c_g_aver.h"
+#include    "typedef.h"
+#include    "mode.h"
+#include    "cnst.h"
+
+#include    "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Cb_gain_average_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type Cb_gain_averageState
+
+ Outputs:
+    Structure pointed to by state is initialized to zeros
+
+ Returns:
+    Returns 0 if memory was successfully initialized,
+        otherwise returns -1.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Resets state memory
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ c_g_aver.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 Cb_gain_average_reset (Cb_gain_averageState *state)
+{
+   if (state == (Cb_gain_averageState *) NULL){
+      fprintf(stderr, "Cb_gain_average_reset: invalid parameter\n");
+      return -1;
+   }
+
+   // Static vectors to zero
+   Set_zero (state->cbGainHistory, L_CBGAINHIST);
+
+   // Initialize hangover handling
+   state->hangVar = 0;
+   state->hangCount= 0;
+
+   return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16  Cb_gain_average_reset(Cb_gain_averageState *state)
+{
+    if (state == (Cb_gain_averageState *) NULL)
+    {
+        /* fprint(stderr, "Cb_gain_average_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    /* Static vectors to zero */
+    memset(state->cbGainHistory, 0, L_CBGAINHIST*sizeof(Word16));
+
+    /* Initialize hangover handling */
+    state->hangVar = 0;
+    state->hangCount = 0;
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Cb_gain_average
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to structure of type Cb_gain_averageState
+    mode = AMR mode (enum Mode)
+    gain_code = CB gain (Word16)
+    lsp = the LSP for the current frame (Word16)
+    lspAver = the average of LSP for 8 frames (Word16)
+    bfi = bad frame indication flag (Word16)
+    prev_bf = previous bad frame indication flag (Word16)
+    pdfi = potential degraded bad frame ind flag (Word16)
+    prev_pdf = prev pot. degraded bad frame ind flag (Word16)
+    inBackgroundNoise = background noise decision (Word16)
+    voicedHangover = # of frames after last voiced frame (Word16)
+    pOverflow = address of overflow (Flag)
+
+ Returns:
+    cbGainMix = codebook gain (Word16)
+
+ Outputs:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ The mix cb gains for MR475, MR515, MR59, MR67, MR102; gain_code other modes
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ c_g_aver.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+Word16 Cb_gain_average (
+   Cb_gain_averageState *st, // i/o : State variables for CB gain avergeing
+   enum Mode mode,           // i   : AMR mode
+   Word16 gain_code,         // i   : CB gain                              Q1
+   Word16 lsp[],             // i   : The LSP for the current frame       Q15
+   Word16 lspAver[],         // i   : The average of LSP for 8 frames     Q15
+   Word16 bfi,               // i   : bad frame indication flag
+   Word16 prev_bf,           // i   : previous bad frame indication flag
+   Word16 pdfi,              // i   : potential degraded bad frame ind flag
+   Word16 prev_pdf,          // i   : prev pot. degraded bad frame ind flag
+   Word16 inBackgroundNoise, // i   : background noise decision
+   Word16 voicedHangover     // i   : # of frames after last voiced frame
+   )
+{
+   //---------------------------------------------------------*
+    * Compute mixed cb gain, used to make cb gain more        *
+    * smooth in background noise for modes 5.15, 5.9 and 6.7  *
+    * states that needs to be updated by all                  *
+    *---------------------------------------------------------
+   Word16 i;
+   Word16 cbGainMix, diff, tmp_diff, bgMix, cbGainMean;
+   Word32 L_sum;
+   Word16 tmp[M], tmp1, tmp2, shift1, shift2, shift;
+
+   // set correct cbGainMix for MR74, MR795, MR122
+   cbGainMix = gain_code;
+
+    *-------------------------------------------------------*
+    *   Store list of CB gain needed in the CB gain         *
+    *   averaging                                           *
+    *-------------------------------------------------------*
+   for (i = 0; i < (L_CBGAINHIST-1); i++)
+   {
+      st->cbGainHistory[i] = st->cbGainHistory[i+1];
+   }
+   st->cbGainHistory[L_CBGAINHIST-1] = gain_code;
+
+   // compute lsp difference
+   for (i = 0; i < M; i++) {
+      tmp1 = abs_s(sub(lspAver[i], lsp[i]));  // Q15
+      shift1 = sub(norm_s(tmp1), 1);          // Qn
+      tmp1 = shl(tmp1, shift1);               // Q15+Qn
+      shift2 = norm_s(lspAver[i]);            // Qm
+      tmp2 = shl(lspAver[i], shift2);         // Q15+Qm
+      tmp[i] = div_s(tmp1, tmp2);             // Q15+(Q15+Qn)-(Q15+Qm)
+      shift = sub(add(2, shift1), shift2);
+      if (shift >= 0)
+      {
+         tmp[i] = shr(tmp[i], shift); // Q15+Qn-Qm-Qx=Q13
+      }
+      else
+      {
+         tmp[i] = shl(tmp[i], negate(shift)); // Q15+Qn-Qm-Qx=Q13
+      }
+   }
+
+   diff = tmp[0];
+   for (i = 1; i < M; i++) {
+      diff = add(diff, tmp[i]);       // Q13
+   }
+
+   // Compute hangover
+   if (sub(diff, 5325) > 0)  // 0.65 in Q11
+   {
+      st->hangVar = add(st->hangVar, 1);
+   }
+   else
+   {
+      st->hangVar = 0;
+   }
+
+   if (sub(st->hangVar, 10) > 0)
+   {
+      st->hangCount = 0;  // Speech period, reset hangover variable
+   }
+
+   // Compute mix constant (bgMix)
+   bgMix = 8192;    // 1 in Q13
+   if ((sub(mode, MR67) <= 0) || (sub(mode, MR102) == 0))
+      // MR475, MR515, MR59, MR67, MR102
+   {
+      // if errors and presumed noise make smoothing probability stronger
+      if (((((pdfi != 0) && (prev_pdf != 0)) || (bfi != 0) || (prev_bf != 0)) &&
+          (sub(voicedHangover, 1) > 0) && (inBackgroundNoise != 0) &&
+          ((sub(mode, MR475) == 0) ||
+           (sub(mode, MR515) == 0) ||
+           (sub(mode, MR59) == 0)) ))
+      {
+         // bgMix = min(0.25, max(0.0, diff-0.55)) / 0.25;
+         tmp_diff = sub(diff, 4506);   // 0.55 in Q13
+
+         // max(0.0, diff-0.55)
+         if (tmp_diff > 0)
+         {
+            tmp1 = tmp_diff;
+         }
+         else
+         {
+            tmp1 = 0;
+         }
+
+         // min(0.25, tmp1)
+         if (sub(2048, tmp1) < 0)
+         {
+            bgMix = 8192;
+         }
+         else
+         {
+            bgMix = shl(tmp1, 2);
+         }
+      }
+      else
+      {
+         // bgMix = min(0.25, max(0.0, diff-0.40)) / 0.25;
+         tmp_diff = sub(diff, 3277); // 0.4 in Q13
+
+         // max(0.0, diff-0.40)
+         if (tmp_diff > 0)
+         {
+            tmp1 = tmp_diff;
+         }
+         else
+         {
+            tmp1 = 0;
+         }
+
+         // min(0.25, tmp1)
+         if (sub(2048, tmp1) < 0)
+         {
+            bgMix = 8192;
+         }
+         else
+         {
+            bgMix = shl(tmp1, 2);
+         }
+      }
+
+      if ((sub(st->hangCount, 40) < 0) || (sub(diff, 5325) > 0)) // 0.65 in Q13
+      {
+         bgMix = 8192;  // disable mix if too short time since
+      }
+
+      // Smoothen the cb gain trajectory
+      // smoothing depends on mix constant bgMix
+      L_sum = L_mult(6554, st->cbGainHistory[2]); // 0.2 in Q15; L_sum in Q17
+      for (i = 3; i < L_CBGAINHIST; i++)
+      {
+         L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i]);
+      }
+      cbGainMean = pv_round(L_sum);                      // Q1
+
+      // more smoothing in error and bg noise (NB no DFI used  here)
+      if (((bfi != 0) || (prev_bf != 0)) && (inBackgroundNoise != 0) &&
+          ((sub(mode, MR475) == 0) ||
+           (sub(mode, MR515) == 0) ||
+           (sub(mode, MR59) == 0)) )
+      {
+         L_sum = L_mult(4681, st->cbGainHistory[0]); // 0.143 in Q15; L_sum in Q17
+         for (i = 1; i < L_CBGAINHIST; i++)
+         {
+            L_sum = L_mac(L_sum, 4681, st->cbGainHistory[i]);
+         }
+         cbGainMean = pv_round(L_sum);                   // Q1
+      }
+
+      // cbGainMix = bgMix*cbGainMix + (1-bgMix)*cbGainMean;
+      L_sum = L_mult(bgMix, cbGainMix);               // L_sum in Q15
+      L_sum = L_mac(L_sum, 8192, cbGainMean);
+      L_sum = L_msu(L_sum, bgMix, cbGainMean);
+      cbGainMix = pv_round(L_shl(L_sum, 2));             // Q1
+   }
+
+   st->hangCount = add(st->hangCount, 1);
+   return cbGainMix;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Cb_gain_average(
+    Cb_gain_averageState *st, /* i/o : State variables for CB gain averaging */
+    enum Mode mode,           /* i   : AMR mode                              */
+    Word16 gain_code,         /* i   : CB gain                            Q1 */
+    Word16 lsp[],             /* i   : The LSP for the current frame     Q15 */
+    Word16 lspAver[],         /* i   : The average of LSP for 8 frames   Q15 */
+    Word16 bfi,               /* i   : bad frame indication flag             */
+    Word16 prev_bf,           /* i   : previous bad frame indication flag    */
+    Word16 pdfi,              /* i   : potential degraded bad frame ind flag */
+    Word16 prev_pdf,          /* i   : prev pot. degraded bad frame ind flag */
+    Word16 inBackgroundNoise, /* i   : background noise decision             */
+    Word16 voicedHangover,    /* i   : # of frames after last voiced frame   */
+    Flag   *pOverflow
+)
+{
+    Word16 i;
+    Word16 cbGainMix;
+    Word16 diff;
+    Word16 tmp_diff;
+    Word16 bgMix;
+    Word16 cbGainMean;
+    Word32 L_sum;
+    Word16 tmp[M];
+    Word16 tmp1;
+    Word16 tmp2;
+    Word16 shift1;
+    Word16 shift2;
+    Word16 shift;
+
+    /*---------------------------------------------------------*
+     * Compute mixed cb gain, used to make cb gain more        *
+     * smooth in background noise for modes 5.15, 5.9 and 6.7  *
+     * states that needs to be updated by all                  *
+     *---------------------------------------------------------*/
+
+    /* set correct cbGainMix for MR74, MR795, MR122 */
+    cbGainMix = gain_code;
+
+    /*-------------------------------------------------------*
+     *   Store list of CB gain needed in the CB gain         *
+     *   averaging                                           *
+     *-------------------------------------------------------*/
+    for (i = 0; i < (L_CBGAINHIST - 1); i++)
+    {
+        st->cbGainHistory[i] = st->cbGainHistory[i+1];
+    }
+    st->cbGainHistory[L_CBGAINHIST-1] = gain_code;
+
+    diff = 0;
+
+    /* compute lsp difference */
+    for (i = 0; i < M; i++)
+    {
+        tmp1 = abs_s(sub(*(lspAver + i), *(lsp + i), pOverflow));
+        /* Q15      */
+        shift1 = sub(norm_s(tmp1), 1, pOverflow);       /* Qn       */
+        tmp1 = shl(tmp1, shift1, pOverflow);            /* Q15+Qn   */
+        shift2 = norm_s(*(lspAver + i));                /* Qm       */
+        tmp2 = shl(*(lspAver + i), shift2, pOverflow);  /* Q15+Qm   */
+        tmp[i] = div_s(tmp1, tmp2);        /* Q15+(Q15+Qn)-(Q15+Qm) */
+
+        shift = 2 + shift1 - shift2;
+
+        if (shift >= 0)
+        {
+            *(tmp + i) = shr(*(tmp + i), shift, pOverflow);
+            /* Q15+Qn-Qm-Qx=Q13 */
+        }
+        else
+        {
+            *(tmp + i) = shl(*(tmp + i), negate(shift), pOverflow);
+            /* Q15+Qn-Qm-Qx=Q13 */
+        }
+
+        diff = add(diff, *(tmp + i), pOverflow);           /* Q13 */
+    }
+
+    /* Compute hangover */
+
+    if (diff > 5325)                /* 0.65 in Q11 */
+    {
+        st->hangVar += 1;
+    }
+    else
+    {
+        st->hangVar = 0;
+    }
+
+
+    if (st->hangVar > 10)
+    {
+        /* Speech period, reset hangover variable */
+        st->hangCount = 0;
+    }
+
+    /* Compute mix constant (bgMix) */
+    bgMix = 8192;    /* 1 in Q13 */
+
+    if ((mode <= MR67) || (mode == MR102))
+        /* MR475, MR515, MR59, MR67, MR102 */
+    {
+        /* if errors and presumed noise make smoothing probability stronger */
+
+        if (((((pdfi != 0) && (prev_pdf != 0)) || (bfi != 0) ||
+                (prev_bf != 0))
+                && (voicedHangover > 1)
+                && (inBackgroundNoise != 0)
+                && ((mode == MR475) || (mode == MR515) ||
+                    (mode == MR59))))
+        {
+            /* bgMix = min(0.25, max(0.0, diff-0.55)) / 0.25; */
+            tmp_diff = sub(diff, 4506, pOverflow);   /* 0.55 in Q13 */
+        }
+        else
+        {
+            /* bgMix = min(0.25, max(0.0, diff-0.40)) / 0.25; */
+            tmp_diff = sub(diff, 3277, pOverflow); /* 0.4 in Q13 */
+        }
+
+        /* max(0.0, diff-0.55)  or  */
+        /* max(0.0, diff-0.40) */
+        if (tmp_diff > 0)
+        {
+            tmp1 = tmp_diff;
+        }
+        else
+        {
+            tmp1 = 0;
+        }
+
+        /* min(0.25, tmp1) */
+        if (2048 < tmp1)
+        {
+            bgMix = 8192;
+        }
+        else
+        {
+            bgMix = shl(tmp1, 2, pOverflow);
+        }
+
+        if ((st->hangCount < 40) || (diff > 5325)) /* 0.65 in Q13 */
+        {
+            /* disable mix if too short time since */
+            bgMix = 8192;
+        }
+
+        /* Smoothen the cb gain trajectory  */
+        /* smoothing depends on mix constant bgMix */
+        L_sum = L_mult(6554, st->cbGainHistory[2], pOverflow);
+        /* 0.2 in Q15; L_sum in Q17 */
+
+        for (i = 3; i < L_CBGAINHIST; i++)
+        {
+            L_sum = L_mac(L_sum, 6554, st->cbGainHistory[i], pOverflow);
+        }
+        cbGainMean = pv_round(L_sum, pOverflow);               /* Q1 */
+
+        /* more smoothing in error and bg noise (NB no DFI used here) */
+
+        if (((bfi != 0) || (prev_bf != 0)) && (inBackgroundNoise != 0)
+                && ((mode == MR475) || (mode == MR515)
+                    || (mode == MR59)))
+        {
+            /* 0.143 in Q15; L_sum in Q17    */
+            L_sum = L_mult(4681, st->cbGainHistory[0], pOverflow);
+            for (i = 1; i < L_CBGAINHIST; i++)
+            {
+                L_sum =
+                    L_mac(L_sum, 4681, st->cbGainHistory[i], pOverflow);
+            }
+            cbGainMean = pv_round(L_sum, pOverflow);              /* Q1 */
+        }
+
+        /* cbGainMix = bgMix*cbGainMix + (1-bgMix)*cbGainMean; */
+        /* L_sum in Q15 */
+        L_sum = L_mult(bgMix, cbGainMix, pOverflow);
+        L_sum = L_mac(L_sum, 8192, cbGainMean, pOverflow);
+        L_sum = L_msu(L_sum, bgMix, cbGainMean, pOverflow);
+        cbGainMix = pv_round(L_shl(L_sum, 2, pOverflow), pOverflow);  /* Q1 */
+    }
+
+    st->hangCount += 1;
+
+    return (cbGainMix);
+}
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.h b/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.h
new file mode 100644
index 0000000..0b53753
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/c_g_aver.h
@@ -0,0 +1,163 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/c_g_aver.h
+
+     Date: 12/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : c_g_aver.h
+      Purpose          : Background noise source charateristic detector (SCD)
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _C_G_AVER_H_
+#define _C_G_AVER_H_
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "mode.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+#define L_CBGAINHIST 7
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        /* history vector of past synthesis speech energy */
+        Word16 cbGainHistory[L_CBGAINHIST];
+
+        /* state flags */
+        Word16 hangVar;       /* counter; */
+        Word16 hangCount;     /* counter; */
+
+    } Cb_gain_averageState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    /*
+     *  Function    : Cb_gain_average_init
+     *  Purpose     : Allocates initializes state memory
+     *  Description : Stores pointer to filter status struct in *st. This
+     *                pointer has to be passed to Cb_gain_average in each call.
+     *  Returns     : 0 on success
+     */
+    Word16 Cb_gain_average_init(Cb_gain_averageState **st);
+
+    /*
+     *  Function    : Cb_gain_average_reset
+     *  Purpose     : Resets state memory
+     *  Returns     : 0 on success
+     */
+    Word16 Cb_gain_average_reset(Cb_gain_averageState *st);
+
+    /*
+     *  Function    : Cb_gain_average_exit
+     *  Purpose     : The memory used for state memory is freed
+     *  Description : Stores NULL in *s
+     *  Returns     : void
+     */
+    void Cb_gain_average_exit(Cb_gain_averageState **st);
+
+    /*
+     *  Function    : Cb_gain_average
+     *  Purpose     : Charaterice synthesis speech and detect background noise
+     *  Returns     : background noise decision; 0 = bgn, 1 = no bgn
+     */
+    Word16 Cb_gain_average(
+        Cb_gain_averageState *st, /* i/o : State variables for CB gain avergeing   */
+        enum Mode mode,           /* i   : AMR mode                                */
+        Word16 gain_code,         /* i   : CB gain                              Q1 */
+        Word16 lsp[],             /* i   : The LSP for the current frame       Q15 */
+        Word16 lspAver[],         /* i   : The average of LSP for 8 frames     Q15 */
+        Word16 bfi,               /* i   : bad frame indication flag               */
+        Word16 prev_bf,           /* i   : previous bad frame indication flag      */
+        Word16 pdfi,              /* i   : potential degraded bad frame ind flag   */
+        Word16 prev_pdf,          /* i   : prev pot. degraded bad frame ind flag   */
+        Word16 inBackgroundNoise, /* i   : background noise decision               */
+        Word16 voicedHangover,    /* i   : # of frames after last voiced frame     */
+        Flag   *pOverflow
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _C_G_AVER_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp
new file mode 100644
index 0000000..899daba
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.cpp
@@ -0,0 +1,263 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d1035pf.c
+
+     Date: 04/14/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Updated file per comments gathered from Phase 2/3 review.
+
+ Description: Synchronized file with UTMS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Removed inclusion of "gray.tab".
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d1035pf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NB_PULSE  10            /* number of pulses  */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dec_10i40_35bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    index = buffer containing index of 10 pulses; each element is
+        represented by sign+position
+    cod = buffer of algebraic (fixed) codebook excitation
+
+ Outputs:
+    cod buffer contains the new algebraic codebook excitation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    dgray = gray decoding table
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function builds the innovative codevector from the received index of
+ algebraic codebook. See c1035pf.c for more details about the algebraic
+ codebook structure.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d1035pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void dec_10i40_35bits (
+    Word16 index[],    // (i)     : index of 10 pulses (sign+position)
+    Word16 cod[]       // (o)     : algebraic (fixed) codebook excitation
+)
+{
+    Word16 i, j, pos1, pos2, sign, tmp;
+
+    for (i = 0; i < L_CODE; i++)
+    {
+        cod[i] = 0;
+    }
+
+    // decode the positions and signs of pulses and build the codeword
+
+    for (j = 0; j < NB_TRACK; j++)
+    {
+        // compute index i
+
+        tmp = index[j];
+        i = tmp & 7;
+        i = dgray[i];
+
+        i = extract_l (L_shr (L_mult (i, 5), 1));
+        pos1 = add (i, j); // position of pulse "j"
+
+        i = shr (tmp, 3) & 1;
+        if (i == 0)
+        {
+            sign = 4096; // +1.0
+        }
+        else
+        {
+            sign = -4096; // -1.0
+        }
+
+        cod[pos1] = sign;
+
+        // compute index i
+
+        i = index[add (j, 5)] & 7;
+        i = dgray[i];
+        i = extract_l (L_shr (L_mult (i, 5), 1));
+
+        pos2 = add (i, j);      // position of pulse "j+5"
+
+        if (sub (pos2, pos1) < 0)
+        {
+            sign = negate (sign);
+        }
+        cod[pos2] = add (cod[pos2], sign);
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void dec_10i40_35bits(
+    Word16 index[],    /* (i)     : index of 10 pulses (sign+position)       */
+    Word16 cod[]       /* (o)     : algebraic (fixed) codebook excitation    */
+)
+{
+    register Word16 i, j, pos1, pos2;
+    Word16 sign, tmp;
+
+    for (i = 0; i < L_CODE; i++)
+    {
+        *(cod + i) = 0;
+    }
+
+    /* decode the positions and signs of pulses and build the codeword */
+
+    for (j = 0; j < NB_TRACK; j++)
+    {
+        /* compute index i */
+
+        tmp = *(index + j);
+        i = tmp & 7;
+        i = *(dgray + i);
+
+        i = (Word16)(i * 5);
+        pos1 = i + j; /* position of pulse "j" */
+
+        i = (tmp >> 3) & 1;
+
+        if (i == 0)
+        {
+            sign = 4096;                                 /* +1.0 */
+        }
+        else
+        {
+            sign = -4096;                                /* -1.0 */
+        }
+
+        *(cod + pos1) = sign;
+
+        /* compute index i */
+
+        i = *(index + j + 5) & 7;
+        i = *(dgray + i);
+        i = (Word16)(i * 5);
+
+        pos2 = i + j;      /* position of pulse "j+5" */
+
+
+        if (pos2 < pos1)
+        {
+            sign = negate(sign);
+        }
+        *(cod + pos2) += sign;
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d1035pf.h b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.h
new file mode 100644
index 0000000..51f1f42
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d1035pf.h
@@ -0,0 +1,117 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/d1035pf.h
+
+     Date: 09/28/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template. Added extern declaration for dgray[] defined
+              in gray_tbl.c
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains the prototype declaration for dec_10i40_35bits function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef D1035PF_H
+#define D1035PF_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 dgray[];
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void dec_10i40_35bits(
+        Word16 index[],    /* (i)   : index of 10 pulses (sign+position)        */
+        Word16 cod[]       /* (o)   : algebraic (fixed) codebook excitation     */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _D1035PF_H_ */
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.cpp
new file mode 100644
index 0000000..e1e544f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.cpp
@@ -0,0 +1,224 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d2_11pf.c
+ Functions:
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to place file in the correct template format. Eliminated
+ use of special functions to perform simple mathematical operations.
+
+ Description: Per review comments...
+ (1) Removed include of "count.h" and "basic_op.h"
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d2_11pf.h"
+#include "typedef.h"
+#include "cnst.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NB_PULSE  2
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decode_2i40_11bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    sign  -- Word16 -- signs of 2 pulses.
+    index -- Word16 -- Positions of the 2 pulses.
+
+ Outputs:
+    cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d2_11pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void decode_2i40_11bits(
+    Word16 sign,   /* i : signs of 2 pulses.                       */
+    Word16 index,  /* i : Positions of the 2 pulses.               */
+    Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+)
+
+{
+    Word16 i;
+    Word16 j;
+
+    Word16 pos[NB_PULSE];
+
+    /* Decode the positions */
+
+    j = index & 0x1;
+
+    index >>= 1;
+
+    i = index & 0x7;
+
+    pos[0] = i * 5 + j * 2 + 1;
+
+
+
+
+    index >>= 3;
+
+    j = index & 0x3;
+
+    index >>= 2;
+
+    i = index & 0x7;
+
+    if (j == 3)
+    {
+        pos[1] = i * 5 + 4;
+    }
+    else
+    {
+        pos[1] = i * 5 + j;
+    }
+
+
+
+
+    /* decode the signs  and build the codeword */
+    for (i = 0; i < L_SUBFR; i++)
+    {
+        cod[i] = 0;
+    }
+
+    for (j = 0; j < NB_PULSE; j++)
+    {
+        i = sign & 1;
+
+        /* This line is equivalent to...
+         *
+         *
+         *  if (i == 1)
+         *  {
+         *      cod[pos[j]] = 8191;
+         *  }
+         *  if (i == 0)
+         *  {
+         *      cod[pos[j]] = -8192;
+         *  }
+         */
+
+        cod[pos[j]] = i * 16383 - 8192;
+
+        sign >>= 1;
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.h b/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.h
new file mode 100644
index 0000000..aaf2e08
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d2_11pf.h
@@ -0,0 +1,93 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+********************************************************************************
+*
+*      GSM AMR-NB speech codec   R98   Version 7.5.0   March 2, 2001
+*                                R99   Version 3.2.0
+*                                REL-4 Version 4.0.0
+*
+********************************************************************************
+*
+*      File             : d2_11pf.h
+*      Purpose          : Algebraic codebook decoder
+*
+********************************************************************************
+*/
+#ifndef d2_11pf_h
+#define d2_11pf_h "$Id $"
+
+/*
+********************************************************************************
+*                         INCLUDE FILES
+********************************************************************************
+*/
+#include "typedef.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*
+    ********************************************************************************
+    *                         LOCAL VARIABLES AND TABLES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DEFINITION OF DATA TYPES
+    ********************************************************************************
+    */
+
+    /*
+    ********************************************************************************
+    *                         DECLARATION OF PROTOTYPES
+    ********************************************************************************
+    */
+    /*************************************************************************
+     *
+     *  FUNCTION:  decode_2i40_11bits (decod_ACELP())
+     *
+     *  PURPOSE:   Algebraic codebook decoder for 2 pulses coded with 11 bits
+     *
+     *************************************************************************/
+
+    void decode_2i40_11bits(
+        Word16 sign,   /* i : signs of 2 pulses.                       */
+        Word16 index,  /* i : Positions of the 2 pulses.               */
+        Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.cpp
new file mode 100644
index 0000000..2c36706
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.cpp
@@ -0,0 +1,248 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d2_9pf.c
+ Functions: decode_2i40_9bits
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to place file in the correct template format. Eliminated
+ use of special functions to perform simple mathematical operations, where
+ possible.  Added the parameter pOverflow for the basic math operations.
+
+ Description: Per review comments...
+ (1) Removed include of basic_op.h, replaced with shl.h
+ (2) Added pOverflow to the output section of the template
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+ FUNCTION:  decode_2i40_9bits (decod_ACELP())
+
+ PURPOSE:   Algebraic codebook decoder. For details about the encoding see
+            c2_9pf.c
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d2_9pf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+#define NB_PULSE  2
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 startPos[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decode_2i40_11bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    sign  -- Word16 -- signs of 2 pulses.
+    index -- Word16 -- Positions of the 2 pulses.
+
+ Outputs:
+    cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
+    pOverflow = pointer to overflow flag
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void decode_2i40_9bits(
+    Word16 subNr,  /* i : subframe number                          */
+    Word16 sign,   /* i : signs of 2 pulses.                       */
+    Word16 index,  /* i : Positions of the 2 pulses.               */
+    Word16 cod[],  /* o : algebraic (fixed) codebook excitation    */
+    Flag  *pOverflow  /* o : Flag set when overflow occurs         */
+)
+{
+    Word16 i;
+    Word16 j;
+    Word16 k;
+
+    Word16 pos[NB_PULSE];
+
+    /* Decode the positions */
+    /* table bit  is the MSB */
+
+    j = (Word16)(index & 64);
+
+    j >>= 3;
+
+    i = index & 7;
+
+    k =
+        shl(
+            subNr,
+            1,
+            pOverflow);
+
+    k += j;
+
+    /* pos0 =i*5+startPos[j*8+subNr*2] */
+    pos[0] = i * 5 + startPos[k++];
+
+
+    index >>= 3;
+
+    i = index & 7;
+
+    /* pos1 =i*5+startPos[j*8+subNr*2 + 1] */
+    pos[1] = i * 5 + startPos[k];
+
+
+    /* decode the signs  and build the codeword */
+
+    for (i = L_SUBFR - 1; i >= 0; i--)
+    {
+        cod[i] = 0;
+    }
+
+    for (j = 0; j < NB_PULSE; j++)
+    {
+        i = sign & 0x1;
+
+        /* This line is equivalent to...
+         *
+         *
+         *  if (i == 1)
+         *  {
+         *      cod[pos[j]] = 8191;
+         *  }
+         *  if (i == 0)
+         *  {
+         *      cod[pos[j]] = -8192;
+         *  }
+         */
+
+        cod[pos[j]] = i * 16383 - 8192;
+
+        sign >>= 1;
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.h b/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.h
new file mode 100644
index 0000000..38076d8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d2_9pf.h
@@ -0,0 +1,122 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/d2_9pf.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the d2_9pf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef d2_9pf_h
+#define d2_9pf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void decode_2i40_9bits(
+        Word16 subNr,       /* i : subframe number                          */
+        Word16 sign,        /* i : signs of 2 pulses.                       */
+        Word16 index,       /* i : Positions of the 2 pulses.               */
+        Word16 cod[],       /* o : algebraic (fixed) codebook excitation    */
+        Flag   * pOverflow  /* o : Flag set when overflow occurs            */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _d2_9PF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.cpp
new file mode 100644
index 0000000..d1912cf
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.cpp
@@ -0,0 +1,233 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d3_14pf.c
+ Functions: decode_3i40_14bits
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to place file in the correct template format. Eliminated
+ use of special functions to perform simple mathematical operations.
+
+ Description: Per review comments...
+ (1) Removed include of "count.h" and "basic_op.h"
+ (2) Updated the pathname to indicate the correct file.  (Line 39)
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+ FUNCTION:  decode_3i40_14bits (decod_ACELP())
+
+ PURPOSE:   Algebraic codebook decoder. For details about the encoding see
+            c3_14pf.c
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+#include "d3_14pf.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NB_PULSE 3           /* number of pulses  */
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decode_3i40_14bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    sign  -- Word16 -- signs of 3 pulses.
+    index -- Word16 -- Positions of the 3 pulses.
+
+ Outputs:
+    cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d2_9pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void decode_3i40_14bits(
+    Word16 sign,   /* i : signs of 3 pulses.                       */
+    Word16 index,  /* i : Positions of the 3 pulses.               */
+    Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+)
+{
+    Word16 i;
+    Word16 j;
+
+    Word16 pos[NB_PULSE];
+
+    /* Decode the positions */
+
+    i = index & 0x7;
+
+    pos[0] = i * 5;
+
+
+
+
+
+    index >>= 3;
+
+    j = index & 0x1;
+
+    index >>= 1;
+
+    i = index & 0x7;
+
+    pos[1] = i * 5 + j * 2 + 1;
+
+
+
+
+
+    index >>= 3;
+
+    j = index & 0x1;
+
+    index >>= 1;
+
+    i = index & 0x7;
+
+    pos[2] = i * 5 + j * 2 + 2;
+
+
+    /* decode the signs  and build the codeword */
+
+    for (i = 0; i < L_SUBFR; i++)
+    {
+        cod[i] = 0;
+    }
+
+    for (j = 0; j < NB_PULSE; j++)
+    {
+        i = sign & 1;
+
+        /* This line is equivalent to...
+         *
+         *
+         *  if (i == 1)
+         *  {
+         *      cod[pos[j]] = 8191;
+         *  }
+         *  if (i == 0)
+         *  {
+         *      cod[pos[j]] = -8192;
+         *  }
+         */
+
+        cod[pos[j]] = i * 16383 - 8192;
+
+        sign >>= 1;
+
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.h b/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.h
new file mode 100644
index 0000000..1e2e0cd
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d3_14pf.h
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/d2_9pf.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the d3_14pf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef d3_14pf_h
+#define d3_14pf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void decode_3i40_14bits(
+        Word16 sign,   /* i : signs of 3 pulses.                       */
+        Word16 index,  /* i : Positions of the 3 pulses.               */
+        Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _d3_14PF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.cpp
new file mode 100644
index 0000000..ece82c0
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.cpp
@@ -0,0 +1,271 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d4_17pf.c
+ Functions: decode_4i40_17bits
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to place file in the correct template format. Eliminated
+ use of special functions to perform simple mathematical operations.
+
+ Description: An incorrect comment in the original source lead me to implement
+ the calculation of pos[2] incorrectly.  The correct formula is pos2 =i*5+2,
+ not pos2 = i*5 + 1.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+
+ FUNCTION:  decode_4i40_17bits (decod_ACELP())
+
+ PURPOSE:   Algebraic codebook decoder. For details about the encoding see
+            c4_17pf.c
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "d4_17pf.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+#define NB_PULSE 4           /* number of pulses  */
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 dgray[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decode_4i40_17bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    sign  -- Word16 -- signs of 3 pulses.
+    index -- Word16 -- Positions of the 3 pulses.
+
+ Outputs:
+    cod[] -- array of type Word16 -- algebraic (fixed) codebook excitation
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d4_17pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void decode_4i40_17bits(
+    Word16 sign,   /* i : signs of 4 pulses.                       */
+    Word16 index,  /* i : Positions of the 4 pulses.               */
+    Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+)
+{
+    Word16 i;
+    Word16 j;
+
+    Word16 pos[NB_PULSE];
+
+    /* Index is a 13-bit value.  3 bits each correspond to the
+     * positions 0-2, with 4 bits allocated for position 3.
+     *
+     *
+     * [][][][] [][][] [][][] [][][]
+     *    |       |      |     |
+     *    |       |      |     |
+     *   pos3    pos2   pos1  pos0
+     */
+
+    /* Decode the positions */
+
+    i = index & 0x7;
+
+    i = dgray[i];
+
+    pos[0] = i * 5; /* pos0 =i*5 */
+
+
+    index >>= 3;
+
+    i = index & 0x7;
+
+    i = dgray[i];
+
+    pos[1] = i * 5 + 1;  /* pos1 =i*5+1 */
+
+
+
+    index >>= 3;
+
+    i = index & 0x7;
+
+    i = dgray[i];
+
+    pos[2] = i * 5 + 2; /* pos2 =i*5+2 */
+
+
+
+
+
+    index >>= 3;
+
+    j = index & 0x1;
+
+    index >>= 1;
+
+    i = index & 0x7;
+
+    i = dgray[i];
+
+    pos[3] = i * 5 + 3 + j; /* pos3 =i*5+3+j */
+
+
+    /* decode the signs  and build the codeword */
+
+    for (i = 0; i < L_SUBFR; i++)
+    {
+        cod[i] = 0;
+    }
+
+    for (j = 0; j < NB_PULSE; j++)
+    {
+        i = sign & 0x1;
+
+        /* This line is equivalent to...
+         *
+         *
+         *  if (i == 1)
+         *  {
+         *      cod[pos[j]] = 8191;
+         *  }
+         *  if (i == 0)
+         *  {
+         *      cod[pos[j]] = -8192;
+         *  }
+         */
+
+        cod[pos[j]] = i * 16383 - 8192;
+
+        sign >>= 1;
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.h b/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.h
new file mode 100644
index 0000000..5dc43f3
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d4_17pf.h
@@ -0,0 +1,119 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/d4_17pf.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the d4_17pf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef d4_17pf_h
+#define d4_17pf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void decode_4i40_17bits(
+        Word16 sign,   /* i : signs of 4 pulses.                       */
+        Word16 index,  /* i : Positions of the 4 pulses.               */
+        Word16 cod[]   /* o : algebraic (fixed) codebook excitation    */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _d4_17PF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.cpp
new file mode 100644
index 0000000..917c47f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.cpp
@@ -0,0 +1,626 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d8_31pf.c
+ Functions:
+
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to pass overflow flag through to basic math function.
+ The flag is passed back to the calling function by pointer reference.
+
+ Description: Per review comments...
+ (1) Removed include of "count.h" and "basic_op.h"
+ (2) Added includes of mult.h, shl.h, shr.h, add.h, sub.h, negate.h,
+     L_mult.h, and L_shr.h
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d8_31pf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NB_PULSE  8           /* number of pulses  */
+
+/* define values/representation for output codevector and sign */
+#define POS_CODE  8191
+#define NEG_CODE  8191
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decompress10
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+   MSBs -- Word16 -- MSB part of the index
+   LSBs -- Word16 -- LSB part of the index
+   index1 -- Word16 -- index for first pos in pos_index[]
+   index2 -- Word16 -- index for second pos in pos_index[]
+   index3 -- Word16 -- index for third pos in pos_index[]
+
+ Outputs:
+   pos_indx[] -- array of type Word16 -- position of 3 pulses (decompressed)
+
+   pOverflow  Flag set when overflow occurs, pointer of type Flag *
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void decompress10(
+    Word16 MSBs,        /* i : MSB part of the index                 */
+    Word16 LSBs,        /* i : LSB part of the index                 */
+    Word16 index1,      /* i : index for first pos in pos_index[]    */
+    Word16 index2,      /* i : index for second pos in pos_index[]   */
+    Word16 index3,      /* i : index for third pos in pos_index[]    */
+    Word16 pos_indx[],  /* o : position of 3 pulses (decompressed)   */
+    Flag  *pOverflow)   /* o : Flag set when overflow occurs         */
+{
+    Word16 ia;
+    Word16 ib;
+    Word16 ic;
+    Word32 tempWord32;
+
+    /*
+      pos_indx[index1] = ((MSBs-25*(MSBs/25))%5)*2 + (LSBs-4*(LSBs/4))%2;
+      pos_indx[index2] = ((MSBs-25*(MSBs/25))/5)*2 + (LSBs-4*(LSBs/4))/2;
+      pos_indx[index3] = (MSBs/25)*2 + LSBs/4;
+    */
+
+    if (MSBs > 124)
+    {
+        MSBs = 124;
+    }
+
+    ia =
+        mult(
+            MSBs,
+            1311,
+            pOverflow);
+
+    tempWord32 =
+        L_mult(
+            ia,
+            25,
+            pOverflow);
+
+
+    ia = (Word16)(MSBs - (tempWord32 >> 1));
+    ib =
+        mult(
+            ia,
+            6554,
+            pOverflow);
+
+    tempWord32 =
+        L_mult(
+            ib,
+            5,
+            pOverflow);
+
+    ib = ia - (Word16)(tempWord32 >> 1);
+
+    ib =
+        shl(
+            ib,
+            1,
+            pOverflow);
+
+
+    ic = LSBs - ((LSBs >> 2) << 2);
+
+
+    pos_indx[index1] = ib + (ic & 1);
+
+
+    ib =
+        mult(
+            ia,
+            6554,
+            pOverflow);
+
+    ib =
+        shl(
+            ib,
+            1,
+            pOverflow);
+
+
+    pos_indx[index2] = ib + (ic >> 1);
+
+
+    ib = LSBs >> 2;
+
+    ic =
+        mult(
+            MSBs,
+            1311,
+            pOverflow);
+
+    ic =
+        shl(
+            ic,
+            1,
+            pOverflow);
+
+    pos_indx[index3] =
+        add(
+            ib,
+            ic,
+            pOverflow);
+
+    return;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: decompress_code
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    indx[] -- array of type Word16 -- position and sign of
+                                      8 pulses (compressed)
+
+ Outputs:
+    sign_indx[] -- array of type Word16 -- signs of 4 pulses (signs only)
+    pos_indx[]  -- array of type Word16 -- position index of 8 pulses
+                                           (position only)
+    pOverflow pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    PURPOSE: decompression of the linear codewords to 4+three indeces
+             one bit from each pulse is made robust to errors by
+             minimizing the phase shift of a bit error.
+             4 signs (one for each track)
+             i0,i4,i1 => one index (7+3) bits, 3   LSBs more robust
+             i2,i6,i5 => one index (7+3) bits, 3   LSBs more robust
+             i3,i7    => one index (5+2) bits, 2-3 LSbs more robust
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+static void decompress_code(
+    Word16 indx[],      /* i : position and sign of 8 pulses (compressed) */
+    Word16 sign_indx[], /* o : signs of 4 pulses (signs only)             */
+    Word16 pos_indx[],  /* o : position index of 8 pulses (position only) */
+    Flag  *pOverflow    /* o : Flag set when overflow occurs              */
+)
+{
+    Word16 i;
+    Word16 ia;
+    Word16 ib;
+    Word16 MSBs;
+    Word16 LSBs;
+    Word16 MSBs0_24;
+    Word32 tempWord32;
+
+    for (i = 0; i < NB_TRACK_MR102; i++)
+    {
+        sign_indx[i] = indx[i];
+    }
+
+    /*
+      First index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits
+      MSBs = indx[NB_TRACK]/8;
+      LSBs = indx[NB_TRACK]%8;
+      */
+    MSBs = indx[NB_TRACK_MR102] >> 3;
+
+    LSBs = indx[NB_TRACK_MR102] & 0x7;
+
+    decompress10(
+        MSBs,
+        LSBs,
+        0,
+        4,
+        1,
+        pos_indx,
+        pOverflow);
+
+    /*
+      Second index: 10x10x10 -> 2x5x2x5x2x5-> 125x2x2x2 -> 7+1x3 bits
+      MSBs = indx[NB_TRACK+1]/8;
+      LSBs = indx[NB_TRACK+1]%8;
+      */
+    MSBs = indx[NB_TRACK_MR102+1] >> 3;
+
+    LSBs = indx[NB_TRACK_MR102+1] & 0x7;
+
+    decompress10(
+        MSBs,
+        LSBs,
+        2,
+        6,
+        5,
+        pos_indx,
+        pOverflow);
+
+    /*
+      Third index: 10x10 -> 2x5x2x5-> 25x2x2 -> 5+1x2 bits
+      MSBs = indx[NB_TRACK+2]/4;
+      LSBs = indx[NB_TRACK+2]%4;
+      MSBs0_24 = (MSBs*25+12)/32;
+      if ((MSBs0_24/5)%2==1)
+         pos_indx[3] = (4-(MSBs0_24%5))*2 + LSBs%2;
+      else
+         pos_indx[3] = (MSBs0_24%5)*2 + LSBs%2;
+      pos_indx[7] = (MSBs0_24/5)*2 + LSBs/2;
+      */
+
+    MSBs = indx[NB_TRACK_MR102+2] >> 2;
+
+    LSBs = indx[NB_TRACK_MR102+2] & 0x3;
+
+    tempWord32 =
+        L_mult(
+            MSBs,
+            25,
+            pOverflow);
+
+    ia =
+        (Word16)
+        L_shr(
+            tempWord32,
+            1,
+            pOverflow);
+
+    ia += 12;
+
+    MSBs0_24 = ia >> 5;
+
+
+    ia =
+        mult(
+            MSBs0_24,
+            6554,
+            pOverflow);
+
+    ia &= 1;
+
+
+    ib =
+        mult(
+            MSBs0_24,
+            6554,
+            pOverflow);
+
+    tempWord32 =
+        L_mult(
+            ib,
+            5,
+            pOverflow);
+
+
+    ib = MSBs0_24 - (Word16)(tempWord32 >> 1);
+
+    if (ia == 1)
+    {
+        ib = 4 - ib;
+
+    }
+
+
+    ib =
+        shl(
+            ib,
+            1,
+            pOverflow);
+
+    ia = LSBs & 0x1;
+
+    pos_indx[3] =
+        add(
+            ib,
+            ia,
+            pOverflow);
+
+    ia =
+        mult(
+            MSBs0_24,
+            6554,
+            pOverflow);
+
+    ia =
+        shl(
+            ia,
+            1,
+            pOverflow);
+
+    pos_indx[7] = ia + (LSBs >> 1);
+
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dec_8i40_31bits
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    index   array of type Word16 --  index of 8 pulses (sign+position)
+
+ Outputs:
+    cod     array of type Word16 --  algebraic (fixed) codebook excitation
+    pOverflow pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE:  Builds the innovative codevector from the received
+           index of algebraic codebook.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d8_31pf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void dec_8i40_31bits(
+    Word16 index[],    /* i : index of 8 pulses (sign+position)         */
+    Word16 cod[],      /* o : algebraic (fixed) codebook excitation     */
+    Flag  *pOverflow   /* o : Flag set when overflow occurs             */
+)
+{
+    Word16 i;
+    Word16 j;
+    Word16 pos1;
+    Word16 pos2;
+    Word16 sign;
+
+    Word16 linear_signs[NB_TRACK_MR102];
+    Word16 linear_codewords[NB_PULSE];
+
+    for (i = 0; i < L_CODE; i++)
+    {
+        cod[i] = 0;
+    }
+
+    decompress_code(
+        index,
+        linear_signs,
+        linear_codewords,
+        pOverflow);
+
+    /* decode the positions and signs of pulses and build the codeword */
+    for (j = 0; j < NB_TRACK_MR102; j++)    /* NB_TRACK_MR102 = 4 */
+    {
+        /* position of pulse "j" */
+
+        pos1 = (linear_codewords[j] << 2) + j;
+
+
+        if (linear_signs[j] == 0)
+        {
+            sign = POS_CODE; /* +1.0 */
+        }
+        else
+        {
+            sign = -NEG_CODE; /* -1.0 */
+        }
+
+        if (pos1 < L_SUBFR)
+        {
+            cod[pos1] = sign;    /* avoid buffer overflow */
+        }
+
+        /* compute index i */
+        /* position of pulse "j+4" */
+
+        pos2 = (linear_codewords[j + 4] << 2) + j;
+
+
+        if (pos2 < pos1)
+        {
+            sign = negate(sign);
+        }
+
+        if (pos2 < L_SUBFR)
+        {
+            cod[pos2] += sign;     /* avoid buffer overflow */
+        }
+
+
+    } /* for (j = 0; j < NB_TRACK_MR102; j++) */
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.h b/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.h
new file mode 100644
index 0000000..162685f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d8_31pf.h
@@ -0,0 +1,120 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/d2_9pf.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the d8_31pf.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef d8_31pf_h
+#define d8_31pf_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void dec_8i40_31bits(
+        Word16 index[],     /* i : index of 8 pulses (sign+position)         */
+        Word16 cod[],       /* o : algebraic (fixed) codebook excitation     */
+        Flag   * pOverflow  /* o : Flag set when overflow occurs             */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _d8_31PF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_gain_c.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_gain_c.cpp
new file mode 100644
index 0000000..b6c62f8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d_gain_c.cpp
@@ -0,0 +1,254 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d_gain_c.c
+ Functions: d_gain_c
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated include files and intput/output section. Changed .tab
+              files to .c files.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pred_state  = pointer to sturcture type gc_predState. MA predictor state
+    mode        = AMR mode (MR795 or MR122) of type enum Mode
+    index       = received quantization index of type Word16
+    code[]      = pointer to innovation codevector of type Word16
+    pOverflow= pointer to value indicating existence of overflow (Flag)
+
+ Outputs:
+    pred_state  = pointer to sturcture type gc_predState. MA predictor state
+    gain_code   = pointer to decoded innovation gain of type Word16
+    pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Function    : d_gain_code
+  Purpose     : Decode the fixed codebook gain using the received index.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_gain_c.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d_gain_c.h"
+#include "typedef.h"
+#include "mode.h"
+
+#include "oper_32b.h"
+#include "cnst.h"
+#include "log2.h"
+#include "pow2.h"
+#include "gc_pred.h"
+
+#include "basic_op.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 qua_gain_code[];
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void d_gain_code(
+    gc_predState *pred_state, /* i/o : MA predictor state               */
+    enum Mode mode,           /* i   : AMR mode (MR795 or MR122)        */
+    Word16 index,             /* i   : received quantization index      */
+    Word16 code[],            /* i   : innovation codevector            */
+    Word16 *gain_code,        /* o   : decoded innovation gain          */
+    Flag   *pOverflow
+)
+{
+    Word16 gcode0, exp, frac;
+    const Word16 *p;
+    Word16 qua_ener_MR122, qua_ener;
+    Word16 exp_inn_en;
+    Word16 frac_inn_en;
+    Word32 L_tmp;
+    Word16 tbl_tmp;
+    Word16 temp;
+    /*-------------- Decode codebook gain ---------------*/
+
+    /*-------------------------------------------------------------------*
+     *  predict codebook gain                                            *
+     *  ~~~~~~~~~~~~~~~~~~~~~                                            *
+     *  gc0     = Pow2(int(d)+frac(d))                                   *
+     *          = 2^exp + 2^frac                                         *
+     *                                                                   *
+     *-------------------------------------------------------------------*/
+
+    gc_pred(pred_state, mode, code, &exp, &frac,
+            &exp_inn_en, &frac_inn_en, pOverflow);
+
+    index &= 31;                    /* index < 32, to avoid buffer overflow */
+    tbl_tmp = index + (index << 1);
+
+    p = &qua_gain_code[tbl_tmp];
+
+    /* Different scalings between MR122 and the other modes */
+    temp = sub((Word16)mode, (Word16)MR122, pOverflow);
+    if (temp == 0)
+    {
+        gcode0 = (Word16)(Pow2(exp, frac, pOverflow));    /* predicted gain */
+        gcode0 = shl(gcode0, 4, pOverflow);
+        *gain_code = shl(mult(gcode0, *p++, pOverflow), 1, pOverflow);
+    }
+    else
+    {
+        gcode0 = (Word16)(Pow2(14, frac, pOverflow));
+        L_tmp = L_mult(*p++, gcode0, pOverflow);
+        L_tmp = L_shr(L_tmp, sub(9, exp, pOverflow), pOverflow);
+        *gain_code = extract_h(L_tmp);          /* Q1 */
+    }
+
+    /*-------------------------------------------------------------------*
+     *  update table of past quantized energies                          *
+     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~                          *
+     *-------------------------------------------------------------------*/
+    qua_ener_MR122 = *p++;
+    qua_ener = *p++;
+    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
+
+    return;
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_gain_p.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_gain_p.cpp
new file mode 100644
index 0000000..99446db
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d_gain_p.cpp
@@ -0,0 +1,192 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d_gain_p.c
+ Functions: d_gain_p
+
+     Date: 01/31/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Removed extra includes
+ (2) Replaced function calls to basic math operations with ANSI C standard
+     mathemtical operations.
+ (3) Placed code in the proper software template.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    mode  -- enumerated type -- AMR mode
+    index -- Word16          -- index of quantization
+ Outputs:
+    None
+
+ Returns:
+    Word16 gain -- (Q14)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Function    : d_gain_pitch
+ Purpose     : Decodes the pitch gain using the received index.
+               output is in Q14
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_gain_p.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d_gain_p.h"
+#include "typedef.h"
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Word16 qua_gain_pitch[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Word16 d_gain_pitch(       /* return value: gain (Q14)                */
+    enum Mode mode,        /* i   : AMR mode                          */
+    Word16 index           /* i   : index of quantization             */
+)
+{
+    Word16 gain;
+
+    gain = qua_gain_pitch[index];
+
+    if (mode == MR122)
+    {
+        /* clear 2 LSBits */
+        gain &= 0xFFFC;
+    }
+
+    return gain;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_plsf.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_plsf.cpp
new file mode 100644
index 0000000..138193f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d_plsf.cpp
@@ -0,0 +1,207 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d_plsf.c
+ Functions:
+
+
+     Date: 04/14/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed the functions d_plsf_init and d_plsf_exit.
+ The d_plsf related structure is no longer dynamically allocated.
+
+ Description: Removed q_plsf_5.tab from Include section and added
+              q_plsf_5_tbl.h to Include section. Changed "mean_lsf"
+              to "mean_lsf_5" in D_plsf_reset().
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ common part (reset) of LSF decoder
+ module (rest in d_plsf_3.c and d_plsf_5.c)
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "copy.h"
+#include "d_plsf.h"
+#include "q_plsf_5_tbl.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: D_plsf_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to structure of type D_plsf_reset
+
+ Outputs:
+    fields of the structure pointed to by state is initialized to zero
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Resets state memory
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_plsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int D_plsf_reset (D_plsfState *state)
+{
+  Word16 i;
+
+  if (state == (D_plsfState *) NULL){
+      // fprintf(stderr, "D_plsf_reset: invalid parameter\n");
+      return -1;
+  }
+
+  for (i = 0; i < M; i++){
+      state->past_r_q[i] = 0;             // Past quantized prediction error
+  }
+
+  // Past dequantized lsfs
+  Copy(mean_lsf, &state->past_lsf_q[0], M);
+
+  return 0;
+}
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 D_plsf_reset(D_plsfState *state)
+{
+    Word16 i;
+
+    if (state == (D_plsfState *) NULL)
+    {
+        /* fprintf(stderr, "D_plsf_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    for (i = 0; i < M; i++)
+    {
+        state->past_r_q[i] = 0;             /* Past quantized prediction error */
+    }
+
+    /* Past dequantized lsfs */
+    Copy(mean_lsf_5, &state->past_lsf_q[0], M);
+
+    return 0;
+
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_3.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_3.cpp
new file mode 100644
index 0000000..7b31d04
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_3.cpp
@@ -0,0 +1,496 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d_plsf_3.c
+ Functions: D_plsf_3
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- Pointer to type struct D_plsfState
+    mode -- enum Mode -- coder mode
+    bfi -- Word16 -- bad frame indicator (set to 1 if a bad frame is received)
+    indice -- Pointer to type Word16 -- quantization indices of
+                                        3 submatrices, Q0
+
+ Outputs:
+    st -- Pointer to type struct D_plsfState
+    lsp1_q -- Pointer to type Word16 -- quantized 1st LSP vector Q15
+    pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE: Decodes the LSP parameters using the received quantization
+          indices.1st order MA prediction and split by 3 vector
+          quantization (split-VQ)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d_plsf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "copy.h"
+#include "q_plsf_3_tbl.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define ALPHA     29491     /* ALPHA    ->  0.9                            */
+#define ONE_ALPHA 3277      /* ONE_ALPHA-> (1.0-ALPHA)                     */
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void D_plsf_3(
+    D_plsfState *st,   /* i/o: State struct                               */
+    enum Mode mode,    /* i  : coder mode                                 */
+    Word16 bfi,        /* i  : bad frame indicator (set to 1 if a         */
+    /*      bad frame is received)                     */
+    Word16 * indice,   /* i  : quantization indices of 3 submatrices, Q0  */
+    Word16 * lsp1_q,   /* o  : quantized 1st LSP vector,              Q15 */
+    Flag  *pOverflow   /* o : Flag set when overflow occurs               */
+)
+{
+    Word16 i;
+    Word16 temp;
+    Word16 index;
+
+    Word16 lsf1_r[M];
+    Word16 lsf1_q[M];
+
+    if (bfi != 0)   /* if bad frame */
+    {
+        /* use the past LSFs slightly shifted towards their mean */
+
+        for (i = 0; i < M; i++)
+        {
+            /* lsfi_q[i] = ALPHA*past_lsf_q[i] + ONE_ALPHA*mean_lsf[i]; */
+            temp =
+                mult(
+                    st->past_lsf_q[i],
+                    ALPHA,
+                    pOverflow);
+
+            index =
+                mult(
+                    mean_lsf_3[i],
+                    ONE_ALPHA,
+                    pOverflow);
+
+            lsf1_q[i] =
+                add(
+                    index,
+                    temp,
+                    pOverflow);
+        }
+
+        /* estimate past quantized residual to be used in next frame */
+        if (mode != MRDTX)
+        {
+            for (i = 0; i < M; i++)
+            {
+                /* temp  = mean_lsf[i] +  past_r2_q[i] * PRED_FAC; */
+
+                temp =
+                    mult(
+                        st->past_r_q[i],
+                        pred_fac_3[i],
+                        pOverflow);
+
+                temp =
+                    add(
+                        mean_lsf_3[i],
+                        temp,
+                        pOverflow);
+
+                st->past_r_q[i] =
+                    sub(
+                        lsf1_q[i],
+                        temp,
+                        pOverflow);
+            }
+
+        } /* if (mode == MRDTX) */
+        else
+        {
+            for (i = 0; i < M; i++)
+            {
+                /* temp  = mean_lsf[i] +  past_r2_q[i]; */
+
+                temp =
+                    add(
+                        mean_lsf_3[i],
+                        st->past_r_q[i],
+                        pOverflow);
+
+                st->past_r_q[i] =
+                    sub(
+                        lsf1_q[i],
+                        temp,
+                        pOverflow);
+            }
+        }
+
+    } /* if (bfi != 0) */
+
+    else  /* if good LSFs received */
+    {
+
+        Word16 index_limit_1 = 0;
+        Word16 index_limit_2 = (DICO2_SIZE - 1) * 3;
+        Word16 index_limit_3 = 0;
+
+        const Word16 *p_cb1;
+        const Word16 *p_cb2;
+        const Word16 *p_cb3;
+        const Word16 *p_dico;
+
+
+        p_cb2 = dico2_lsf_3;    /* size DICO2_SIZE*3 */
+
+        if ((mode == MR475) || (mode == MR515))
+        {   /* MR475, MR515 */
+            p_cb1 = dico1_lsf_3;    /* size DICO1_SIZE*3 */
+            p_cb3 = mr515_3_lsf;    /* size MR515_3_SIZE*4 */
+
+            index_limit_1 = (DICO1_SIZE - 1) * 3;
+            index_limit_3 = (MR515_3_SIZE - 1) * 4;
+
+        }
+        else if (mode == MR795)
+        {   /* MR795 */
+            p_cb1 = mr795_1_lsf;    /* size MR795_1_SIZE*3 */
+            p_cb3 = dico3_lsf_3;    /* size DICO3_SIZE*4 */
+
+            index_limit_1 = (MR795_1_SIZE - 1) * 3;
+            index_limit_3 = (DICO3_SIZE - 1) * 4;
+
+        }
+        else
+        {   /* MR59, MR67, MR74, MR102, MRDTX */
+            p_cb1 = dico1_lsf_3;    /* size DICO1_SIZE*3 */
+            p_cb3 = dico3_lsf_3;    /* size DICO3_SIZE*4 */
+
+            index_limit_1 = (DICO1_SIZE - 1) * 3;
+            index_limit_3 = (DICO3_SIZE - 1) * 4;
+
+        }
+
+        /* decode prediction residuals from 3 received indices */
+
+        index = *indice++;
+
+        /* temp = 3*index; */
+        temp = index + (index << 1);
+
+        if (temp > index_limit_1)
+        {
+            temp = index_limit_1;  /* avoid buffer overrun */
+        }
+
+        p_dico = &p_cb1[temp];
+
+        lsf1_r[0] = *p_dico++;
+        lsf1_r[1] = *p_dico++;
+        lsf1_r[2] = *p_dico++;
+
+        index = *indice++;
+
+        if (mode == MR475 || mode == MR515)
+        {   /* MR475, MR515 only using every second entry */
+            index <<= 1;
+        }
+
+        /* temp = 3*index */
+        temp = index + (index << 1);
+
+        if (temp > index_limit_2)
+        {
+            temp = index_limit_2;  /* avoid buffer overrun */
+        }
+
+        p_dico = &p_cb2[temp];
+
+        lsf1_r[3] = *p_dico++;
+        lsf1_r[4] = *p_dico++;
+        lsf1_r[5] = *p_dico++;
+
+        index = *indice++;
+
+        temp = index << 2;
+
+        if (temp > index_limit_3)
+        {
+            temp = index_limit_3;  /* avoid buffer overrun */
+        }
+
+
+        p_dico = &p_cb3[temp];
+
+        lsf1_r[6] = *p_dico++;
+        lsf1_r[7] = *p_dico++;
+        lsf1_r[8] = *p_dico++;
+        lsf1_r[9] = *p_dico++;
+
+        /* Compute quantized LSFs and update the past quantized residual */
+
+        if (mode != MRDTX)
+        {
+            for (i = 0; i < M; i++)
+            {
+                temp =
+                    mult(
+                        st->past_r_q[i],
+                        pred_fac_3[i],
+                        pOverflow);
+
+                temp =
+                    add(
+                        mean_lsf_3[i],
+                        temp,
+                        pOverflow);
+
+                lsf1_q[i] =
+                    add(
+                        lsf1_r[i],
+                        temp,
+                        pOverflow);
+
+                st->past_r_q[i] = lsf1_r[i];
+            }
+        }
+        else
+        {
+            for (i = 0; i < M; i++)
+            {
+                temp =
+                    add(
+                        mean_lsf_3[i],
+                        st->past_r_q[i],
+                        pOverflow);
+
+                lsf1_q[i] =
+                    add(
+                        lsf1_r[i],
+                        temp,
+                        pOverflow);
+
+                st->past_r_q[i] = lsf1_r[i];
+            }
+        }
+
+    }
+
+    /* verification that LSFs has minimum distance of LSF_GAP Hz */
+
+    Reorder_lsf(
+        lsf1_q,
+        LSF_GAP,
+        M,
+        pOverflow);
+
+    Copy(
+        lsf1_q,
+        st->past_lsf_q,
+        M);
+
+    /*  convert LSFs to the cosine domain */
+
+    Lsf_lsp(
+        lsf1_q,
+        lsp1_q,
+        M,
+        pOverflow);
+
+    return;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Init_D_plsf_3
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type D_plsfState
+    index = Word16, past_rq_init[] index [0, 7]
+
+ Outputs:
+    st = pointer to a structure of type D_plsfState
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function initializes the D_plsfState structure.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void Init_D_plsf_3(
+    D_plsfState *st,      /* i/o: State struct                */
+    Word16       index    /* i  : past_rq_init[] index [0, 7] */)
+{
+    Copy(
+        &past_rq_init[index * M],
+        st->past_r_q,
+        M);
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp
new file mode 100644
index 0000000..08b690d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/d_plsf_5.cpp
@@ -0,0 +1,539 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/d_plsf_5.c
+
+     Date: 04/24/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made changes based on review meeting.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Updated to accept new parameter, Flag *pOverflow.
+
+ Description:
+ (1) Removed "count.h" and "basic_op.h" and replaced with individual include
+     files (add.h, sub.h, etc.)
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "d_plsf.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "cnst.h"
+#include "copy.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+    /* ALPHA    ->  0.95       */
+    /* ONE_ALPHA-> (1.0-ALPHA) */
+#define ALPHA     31128
+#define ONE_ALPHA 1639
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    /* These tables are defined in q_plsf_5_tbl.c */
+    extern const Word16 mean_lsf_5[];
+    extern const Word16 dico1_lsf_5[];
+    extern const Word16 dico2_lsf_5[];
+    extern const Word16 dico3_lsf_5[];
+    extern const Word16 dico4_lsf_5[];
+    extern const Word16 dico5_lsf_5[];
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: D_plsf_5
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type D_plsfState
+    bfi = bad frame indicator; set to 1 if a bad frame is received (Word16)
+    indice = pointer to quantization indices of 5 submatrices (Word16)
+    lsp1_q = pointer to the quantized 1st LSP vector (Word16)
+    lsp2_q = pointer to the quantized 2nd LSP vector (Word16)
+
+ Outputs:
+    lsp1_q points to the updated quantized 1st LSP vector
+    lsp2_q points to the updated quantized 2nd LSP vector
+    Flag  *pOverflow  -- Flag set when overflow occurs.
+
+ Returns:
+    return_value = 0 (int)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function decodes the 2 sets of LSP parameters in a frame using the
+ received quantization indices.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ d_plsf_5.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int D_plsf_5 (
+    D_plsfState *st,    // i/o: State variables
+    Word16 bfi,         // i  : bad frame indicator (set to 1 if a bad
+                                frame is received)
+    Word16 *indice,     // i  : quantization indices of 5 submatrices, Q0
+    Word16 *lsp1_q,     // o  : quantized 1st LSP vector (M),          Q15
+    Word16 *lsp2_q      // o  : quantized 2nd LSP vector (M),          Q15
+)
+{
+    Word16 i;
+    const Word16 *p_dico;
+    Word16 temp, sign;
+    Word16 lsf1_r[M], lsf2_r[M];
+    Word16 lsf1_q[M], lsf2_q[M];
+
+    if (bfi != 0)                               // if bad frame
+    {
+        // use the past LSFs slightly shifted towards their mean
+
+        for (i = 0; i < M; i++)
+        {
+            // lsfi_q[i] = ALPHA*st->past_lsf_q[i] + ONE_ALPHA*mean_lsf[i];
+
+            lsf1_q[i] = add (mult (st->past_lsf_q[i], ALPHA),
+                             mult (mean_lsf[i], ONE_ALPHA));
+
+            lsf2_q[i] = lsf1_q[i];
+        }
+
+        // estimate past quantized residual to be used in next frame
+
+        for (i = 0; i < M; i++)
+        {
+            // temp  = mean_lsf[i] +  st->past_r_q[i] * LSP_PRED_FAC_MR122;
+
+            temp = add (mean_lsf[i], mult (st->past_r_q[i],
+                                           LSP_PRED_FAC_MR122));
+
+            st->past_r_q[i] = sub (lsf2_q[i], temp);
+        }
+    }
+    else
+        // if good LSFs received
+    {
+        // decode prediction residuals from 5 received indices
+
+        p_dico = &dico1_lsf[shl (indice[0], 2)];
+        lsf1_r[0] = *p_dico++;
+        lsf1_r[1] = *p_dico++;
+        lsf2_r[0] = *p_dico++;
+        lsf2_r[1] = *p_dico++;
+
+        p_dico = &dico2_lsf[shl (indice[1], 2)];
+        lsf1_r[2] = *p_dico++;
+        lsf1_r[3] = *p_dico++;
+        lsf2_r[2] = *p_dico++;
+        lsf2_r[3] = *p_dico++;
+
+        sign = indice[2] & 1;
+        i = shr (indice[2], 1);
+        p_dico = &dico3_lsf[shl (i, 2)];
+
+        if (sign == 0)
+        {
+            lsf1_r[4] = *p_dico++;
+            lsf1_r[5] = *p_dico++;
+            lsf2_r[4] = *p_dico++;
+            lsf2_r[5] = *p_dico++;
+        }
+        else
+        {
+            lsf1_r[4] = negate (*p_dico++);
+            lsf1_r[5] = negate (*p_dico++);
+            lsf2_r[4] = negate (*p_dico++);
+            lsf2_r[5] = negate (*p_dico++);
+        }
+
+        p_dico = &dico4_lsf[shl (indice[3], 2)];
+        lsf1_r[6] = *p_dico++;
+        lsf1_r[7] = *p_dico++;
+        lsf2_r[6] = *p_dico++;
+        lsf2_r[7] = *p_dico++;
+
+        p_dico = &dico5_lsf[shl (indice[4], 2)];
+        lsf1_r[8] = *p_dico++;
+        lsf1_r[9] = *p_dico++;
+        lsf2_r[8] = *p_dico++;
+        lsf2_r[9] = *p_dico++;
+
+        // Compute quantized LSFs and update the past quantized residual
+        for (i = 0; i < M; i++)
+        {
+            temp = add (mean_lsf[i], mult (st->past_r_q[i],
+                                           LSP_PRED_FAC_MR122));
+            lsf1_q[i] = add (lsf1_r[i], temp);
+            lsf2_q[i] = add (lsf2_r[i], temp);
+            st->past_r_q[i] = lsf2_r[i];
+        }
+    }
+
+    // verification that LSFs have minimum distance of LSF_GAP Hz
+
+    Reorder_lsf (lsf1_q, LSF_GAP, M);
+    Reorder_lsf (lsf2_q, LSF_GAP, M);
+
+    Copy (lsf2_q, st->past_lsf_q, M);
+
+    //  convert LSFs to the cosine domain
+
+    Lsf_lsp (lsf1_q, lsp1_q, M);
+    Lsf_lsp (lsf2_q, lsp2_q, M);
+
+    return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void D_plsf_5(
+    D_plsfState *st,    /* i/o: State variables                             */
+    Word16 bfi,         /* i  : bad frame indicator (set to 1 if a bad
+                                frame is received)                          */
+    Word16 *indice,     /* i  : quantization indices of 5 submatrices, Q0   */
+    Word16 *lsp1_q,     /* o  : quantized 1st LSP vector (M),          Q15  */
+    Word16 *lsp2_q,     /* o  : quantized 2nd LSP vector (M),          Q15  */
+    Flag  *pOverflow    /* o : Flag set when overflow occurs                */
+)
+{
+    register Word16 i;
+    Word16 temp;
+    Word16 sign;
+
+    const Word16 *p_dico;
+
+    Word16 lsf1_r[M];
+    Word16 lsf2_r[M];
+    Word16 lsf1_q[M];
+    Word16 lsf2_q[M];
+
+    if (bfi != 0)                               /* if bad frame */
+    {
+        /* use the past LSFs slightly shifted towards their mean */
+
+        for (i = 0; i < M; i++)
+        {
+            /*
+             *  lsfi_q[i] = ALPHA*st->past_lsf_q[i] +
+             *  ONE_ALPHA*mean_lsf[i];
+             */
+
+            temp =
+                mult(
+                    st->past_lsf_q[i],
+                    ALPHA,
+                    pOverflow);
+
+            sign =
+                mult(
+                    *(mean_lsf_5 + i),
+                    ONE_ALPHA,
+                    pOverflow);
+
+            *(lsf1_q + i) =
+                add(
+                    sign,
+                    temp,
+                    pOverflow);
+
+            *(lsf2_q + i) = *(lsf1_q + i);
+
+            /*
+             * estimate past quantized residual to be used in
+             * next frame
+             */
+
+            /*
+             * temp  = mean_lsf[i] +
+             * st->past_r_q[i] * LSP_PRED_FAC_MR122;
+             */
+
+            temp =
+                mult(
+                    st->past_r_q[i],
+                    LSP_PRED_FAC_MR122,
+                    pOverflow);
+
+            temp =
+                add(
+                    *(mean_lsf_5 + i),
+                    temp,
+                    pOverflow);
+
+            st->past_r_q[i] =
+                sub(
+                    *(lsf2_q + i),
+                    temp,
+                    pOverflow);
+        }
+    }
+    else
+        /* if good LSFs received */
+    {
+        /* decode prediction residuals from 5 received indices */
+
+        temp =
+            shl(
+                *(indice),
+                2,
+                pOverflow);
+
+        p_dico = &dico1_lsf_5[temp];
+
+        *(lsf1_r + 0) = *p_dico++;
+        *(lsf1_r + 1) = *p_dico++;
+        *(lsf2_r + 0) = *p_dico++;
+        *(lsf2_r + 1) = *p_dico++;
+
+        temp =
+            shl(
+                *(indice + 1),
+                2,
+                pOverflow);
+
+        p_dico = &dico2_lsf_5[temp];
+
+        *(lsf1_r + 2) = *p_dico++;
+        *(lsf1_r + 3) = *p_dico++;
+        *(lsf2_r + 2) = *p_dico++;
+        *(lsf2_r + 3) = *p_dico++;
+
+        sign = *(indice + 2) & 1;
+
+        if (*(indice + 2) < 0)
+        {
+            i = ~(~(*(indice + 2)) >> 1);
+        }
+        else
+        {
+            i = *(indice + 2) >> 1;
+        }
+
+        temp =
+            shl(
+                i,
+                2,
+                pOverflow);
+
+        p_dico = &dico3_lsf_5[temp];
+
+        if (sign == 0)
+        {
+            *(lsf1_r + 4) = *p_dico++;
+            *(lsf1_r + 5) = *p_dico++;
+            *(lsf2_r + 4) = *p_dico++;
+            *(lsf2_r + 5) = *p_dico++;
+        }
+        else
+        {
+            *(lsf1_r + 4) = negate(*p_dico++);
+            *(lsf1_r + 5) = negate(*p_dico++);
+            *(lsf2_r + 4) = negate(*p_dico++);
+            *(lsf2_r + 5) = negate(*p_dico++);
+        }
+
+        temp =
+            shl(
+                *(indice + 3),
+                2,
+                pOverflow);
+
+        p_dico = &dico4_lsf_5[temp];
+
+        *(lsf1_r + 6) = *p_dico++;
+        *(lsf1_r + 7) = *p_dico++;
+        *(lsf2_r + 6) = *p_dico++;
+        *(lsf2_r + 7) = *p_dico++;
+
+        temp =
+            shl(
+                *(indice + 4),
+                2,
+                pOverflow);
+
+        p_dico = &dico5_lsf_5[temp];
+
+        *(lsf1_r + 8) = *p_dico++;
+        *(lsf1_r + 9) = *p_dico++;
+        *(lsf2_r + 8) = *p_dico++;
+        *(lsf2_r + 9) = *p_dico++;
+
+        /* Compute quantized LSFs and update the past quantized
+        residual */
+        for (i = 0; i < M; i++)
+        {
+            temp =
+                mult(
+                    st->past_r_q[i],
+                    LSP_PRED_FAC_MR122,
+                    pOverflow);
+
+            temp =
+                add(
+                    *(mean_lsf_5 + i),
+                    temp,
+                    pOverflow);
+
+            *(lsf1_q + i) =
+                add(
+                    *(lsf1_r + i),
+                    temp,
+                    pOverflow);
+
+            *(lsf2_q + i) =
+                add(
+                    *(lsf2_r + i),
+                    temp,
+                    pOverflow);
+
+            st->past_r_q[i] = *(lsf2_r + i);
+        }
+    }
+
+    /* verification that LSFs have minimum distance of LSF_GAP Hz */
+
+    Reorder_lsf(
+        lsf1_q,
+        LSF_GAP,
+        M,
+        pOverflow);
+
+    Reorder_lsf(
+        lsf2_q,
+        LSF_GAP,
+        M,
+        pOverflow);
+
+    Copy(
+        lsf2_q,
+        st->past_lsf_q,
+        M);
+
+    /*  convert LSFs to the cosine domain */
+
+    Lsf_lsp(
+        lsf1_q,
+        lsp1_q,
+        M,
+        pOverflow);
+
+    Lsf_lsp(
+        lsf2_q,
+        lsp2_q,
+        M,
+        pOverflow);
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_amr.cpp b/media/libstagefright/codecs/amrnb/dec/src/dec_amr.cpp
new file mode 100644
index 0000000..9190aea
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_amr.cpp
@@ -0,0 +1,2374 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Pathname: ./audio/gsm-amr/c/src/dec_amr.c
+ Funtions: Decoder_amr_init
+           Decoder_amr_reset
+           Decoder_amr
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the function used to decode one speech frame using a given
+ codec mode. The functions used to initialize, reset, and exit are also
+ included in this file.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <string.h>
+
+#include "dec_amr.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "copy.h"
+#include "set_zero.h"
+#include "syn_filt.h"
+#include "d_plsf.h"
+#include "agc.h"
+#include "int_lpc.h"
+#include "dec_gain.h"
+#include "dec_lag3.h"
+#include "dec_lag6.h"
+#include "d2_9pf.h"
+#include "d2_11pf.h"
+#include "d3_14pf.h"
+#include "d4_17pf.h"
+#include "d8_31pf.h"
+#include "d1035pf.h"
+#include "pred_lt.h"
+#include "d_gain_p.h"
+#include "d_gain_c.h"
+#include "dec_gain.h"
+#include "ec_gains.h"
+#include "ph_disp.h"
+#include "c_g_aver.h"
+#include "int_lsf.h"
+#include "lsp_lsf.h"
+#include "lsp_avg.h"
+#include "bgnscd.h"
+#include "ex_ctrl.h"
+#include "sqrt_l.h"
+#include "frame.h"
+#include "bitno_tab.h"
+#include "b_cn_cod.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Decoder_amr_init
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a pointer to structures of type Decoder_amrState
+
+ Outputs:
+    structure pointed to by the pointer which is pointed to by state is
+      initialized to each field's initial values
+
+    state pointer points to the address of the memory allocated by
+      Decoder_amr_init function
+
+ Returns:
+    return_value = 0, if the initialization was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function allocates and initializes state memory used by the Decoder_amr
+ function. It stores the pointer to the filter status structure in state. This
+ pointer has to be passed to Decoder_amr in each call. The function returns
+ 0, if initialization was successful and -1, otherwise.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Decoder_amr_init (Decoder_amrState **state)
+{
+  Decoder_amrState* s;
+  Word16 i;
+
+  if (state == (Decoder_amrState **) NULL){
+      fprintf(stderr, "Decoder_amr_init: invalid parameter\n");
+      return -1;
+  }
+  *state = NULL;
+
+  // allocate memory
+  if ((s= (Decoder_amrState *) malloc(sizeof(Decoder_amrState))) == NULL){
+      fprintf(stderr, "Decoder_amr_init: can not malloc state structure\n");
+      return -1;
+  }
+
+  s->T0_lagBuff = 40;
+  s->inBackgroundNoise = 0;
+  s->voicedHangover = 0;
+  for (i = 0; i < 9; i++)
+     s->ltpGainHistory[i] = 0;
+
+  s->lsfState = NULL;
+  s->ec_gain_p_st = NULL;
+  s->ec_gain_c_st = NULL;
+  s->pred_state = NULL;
+  s->ph_disp_st = NULL;
+  s->dtxDecoderState = NULL;
+
+  if (D_plsf_init(&s->lsfState) ||
+      ec_gain_pitch_init(&s->ec_gain_p_st) ||
+      ec_gain_code_init(&s->ec_gain_c_st) ||
+      gc_pred_init(&s->pred_state) ||
+      Cb_gain_average_init(&s->Cb_gain_averState) ||
+      lsp_avg_init(&s->lsp_avg_st) ||
+      Bgn_scd_init(&s->background_state) ||
+      ph_disp_init(&s->ph_disp_st) ||
+      dtx_dec_init(&s->dtxDecoderState)) {
+      Decoder_amr_exit(&s);
+      return -1;
+  }
+
+  Decoder_amr_reset(s, (enum Mode)0);
+  *state = s;
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Decoder_amr_init(Decoder_amrState *s)
+{
+    Word16 i;
+
+    if (s == (Decoder_amrState *) NULL)
+    {
+        /* fprint(stderr, "Decoder_amr_init: invalid parameter\n");  */
+        return(-1);
+    }
+
+    s->T0_lagBuff = 40;
+    s->inBackgroundNoise = 0;
+    s->voicedHangover = 0;
+
+    /* Initialize overflow Flag */
+
+    s->overflow = 0;
+
+    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
+    {
+        s->ltpGainHistory[i] = 0;
+    }
+
+    D_plsf_reset(&s->lsfState);
+    ec_gain_pitch_reset(&s->ec_gain_p_st);
+    ec_gain_code_reset(&s->ec_gain_c_st);
+    Cb_gain_average_reset(&s->Cb_gain_averState);
+    lsp_avg_reset(&s->lsp_avg_st);
+    Bgn_scd_reset(&s->background_state);
+    ph_disp_reset(&s->ph_disp_st);
+    dtx_dec_reset(&s->dtxDecoderState);
+    gc_pred_reset(&s->pred_state);
+
+    Decoder_amr_reset(s, MR475);
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Decoder_amr_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type Decoder_amrState
+    mode = codec mode (enum Mode)
+
+ Outputs:
+    structure pointed to by state is initialized to its reset value
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function resets the state memory used by the Decoder_amr function. It
+ returns a 0, if reset was successful and -1, otherwise.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Decoder_amr_reset (Decoder_amrState *state, enum Mode mode)
+{
+  Word16 i;
+
+  if (state == (Decoder_amrState *) NULL){
+      fprintf(stderr, "Decoder_amr_reset: invalid parameter\n");
+      return -1;
+  }
+
+  // Initialize static pointer
+  state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
+
+  // Static vectors to zero
+  Set_zero (state->old_exc, PIT_MAX + L_INTERPOL);
+
+  if (mode != MRDTX)
+     Set_zero (state->mem_syn, M);
+
+  // initialize pitch sharpening
+  state->sharp = SHARPMIN;
+  state->old_T0 = 40;
+
+  // Initialize state->lsp_old []
+
+  if (mode != MRDTX) {
+      Copy(lsp_init_data, &state->lsp_old[0], M);
+  }
+
+  // Initialize memories of bad frame handling
+  state->prev_bf = 0;
+  state->prev_pdf = 0;
+  state->state = 0;
+
+  state->T0_lagBuff = 40;
+  state->inBackgroundNoise = 0;
+  state->voicedHangover = 0;
+  if (mode != MRDTX) {
+      for (i=0;i<9;i++)
+          state->excEnergyHist[i] = 0;
+  }
+
+  for (i = 0; i < 9; i++)
+     state->ltpGainHistory[i] = 0;
+
+  Cb_gain_average_reset(state->Cb_gain_averState);
+  if (mode != MRDTX)
+     lsp_avg_reset(state->lsp_avg_st);
+  D_plsf_reset(state->lsfState);
+  ec_gain_pitch_reset(state->ec_gain_p_st);
+  ec_gain_code_reset(state->ec_gain_c_st);
+
+  if (mode != MRDTX)
+     gc_pred_reset(state->pred_state);
+
+  Bgn_scd_reset(state->background_state);
+  state->nodataSeed = 21845;
+  ph_disp_reset(state->ph_disp_st);
+  if (mode != MRDTX)
+     dtx_dec_reset(state->dtxDecoderState);
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Decoder_amr_reset(Decoder_amrState *state, enum Mode mode)
+{
+    Word16 i;
+
+    if (state == (Decoder_amrState *) NULL)
+    {
+        /* fprint(stderr, "Decoder_amr_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    /* Initialize static pointer */
+    state->exc = state->old_exc + PIT_MAX + L_INTERPOL;
+
+    /* Static vectors to zero */
+    memset(state->old_exc, 0, sizeof(Word16)*(PIT_MAX + L_INTERPOL));
+
+    if (mode != MRDTX)
+    {
+        memset(state->mem_syn, 0, sizeof(Word16)*M);
+    }
+    /* initialize pitch sharpening */
+    state->sharp = SHARPMIN;
+    state->old_T0 = 40;
+
+    /* Initialize overflow Flag */
+
+    state->overflow = 0;
+
+    /* Initialize state->lsp_old [] */
+
+    if (mode != MRDTX)
+    {
+        state->lsp_old[0] = 30000;
+        state->lsp_old[1] = 26000;
+        state->lsp_old[2] = 21000;
+        state->lsp_old[3] = 15000;
+        state->lsp_old[4] = 8000;
+        state->lsp_old[5] = 0;
+        state->lsp_old[6] = -8000;
+        state->lsp_old[7] = -15000;
+        state->lsp_old[8] = -21000;
+        state->lsp_old[9] = -26000;
+    }
+
+    /* Initialize memories of bad frame handling */
+    state->prev_bf = 0;
+    state->prev_pdf = 0;
+    state->state = 0;
+
+    state->T0_lagBuff = 40;
+    state->inBackgroundNoise = 0;
+    state->voicedHangover = 0;
+    if (mode != MRDTX)
+    {
+        for (i = 0; i < EXC_ENERGY_HIST_LEN; i++)
+        {
+            state->excEnergyHist[i] = 0;
+        }
+    }
+
+    for (i = 0; i < LTP_GAIN_HISTORY_LEN; i++)
+    {
+        state->ltpGainHistory[i] = 0;
+    }
+
+    Cb_gain_average_reset(&(state->Cb_gain_averState));
+    if (mode != MRDTX)
+    {
+        lsp_avg_reset(&(state->lsp_avg_st));
+    }
+    D_plsf_reset(&(state->lsfState));
+    ec_gain_pitch_reset(&(state->ec_gain_p_st));
+    ec_gain_code_reset(&(state->ec_gain_c_st));
+
+    if (mode != MRDTX)
+    {
+        gc_pred_reset(&(state->pred_state));
+    }
+
+    Bgn_scd_reset(&(state->background_state));
+    state->nodataSeed = 21845;
+    ph_disp_reset(&(state->ph_disp_st));
+    if (mode != MRDTX)
+    {
+        dtx_dec_reset(&(state->dtxDecoderState));
+    }
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Decoder_amr
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type Decoder_amrState
+    mode = codec mode (enum Mode)
+    parm = buffer of synthesis parameters (Word16)
+    frame_type = received frame type (enum RXFrameType)
+    synth = buffer containing synthetic speech (Word16)
+    A_t = buffer containing decoded LP filter in 4 subframes (Word16)
+
+ Outputs:
+    structure pointed to by st contains the newly calculated decoder
+      parameters
+    synth buffer contains the decoded speech samples
+    A_t buffer contains the decoded LP filter parameters
+
+ Returns:
+    return_value = 0 (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the decoding of one speech frame for a given codec
+ mode.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dec_amr.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Decoder_amr (
+    Decoder_amrState *st,      // i/o : State variables
+    enum Mode mode,            // i   : AMR mode
+    Word16 parm[],             // i   : vector of synthesis parameters
+                                        (PRM_SIZE)
+    enum RXFrameType frame_type, // i   : received frame type
+    Word16 synth[],            // o   : synthesis speech (L_FRAME)
+    Word16 A_t[]               // o   : decoded LP filter in 4 subframes
+                                        (AZ_SIZE)
+)
+{
+    // LPC coefficients
+
+    Word16 *Az;                // Pointer on A_t
+
+    // LSPs
+
+    Word16 lsp_new[M];
+    Word16 lsp_mid[M];
+
+    // LSFs
+
+    Word16 prev_lsf[M];
+    Word16 lsf_i[M];
+
+    // Algebraic codevector
+
+    Word16 code[L_SUBFR];
+
+    // excitation
+
+    Word16 excp[L_SUBFR];
+    Word16 exc_enhanced[L_SUBFR];
+
+    // Scalars
+
+    Word16 i, i_subfr;
+    Word16 T0, T0_frac, index, index_mr475 = 0;
+    Word16 gain_pit, gain_code, gain_code_mix, pit_sharp, pit_flag, pitch_fac;
+    Word16 t0_min, t0_max;
+    Word16 delta_frc_low, delta_frc_range;
+    Word16 tmp_shift;
+    Word16 temp;
+    Word32 L_temp;
+    Word16 flag4;
+    Word16 carefulFlag;
+    Word16 excEnergy;
+    Word16 subfrNr;
+    Word16 evenSubfr = 0;
+
+    Word16 bfi = 0;   // bad frame indication flag
+    Word16 pdfi = 0;  // potential degraded bad frame flag
+
+    enum DTXStateType newDTXState;  // SPEECH , DTX, DTX_MUTE
+
+    // find the new  DTX state  SPEECH OR DTX
+    newDTXState = rx_dtx_handler(st->dtxDecoderState, frame_type);
+
+    // DTX actions
+    if (sub(newDTXState, SPEECH) != 0 )
+    {
+       Decoder_amr_reset (st, MRDTX);
+
+       dtx_dec(st->dtxDecoderState,
+               st->mem_syn,
+               st->lsfState,
+               st->pred_state,
+               st->Cb_gain_averState,
+               newDTXState,
+               mode,
+               parm, synth, A_t);
+       // update average lsp
+
+       Lsf_lsp(st->lsfState->past_lsf_q, st->lsp_old, M);
+       lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
+       goto the_end;
+    }
+
+    // SPEECH action state machine
+    if ((sub(frame_type, RX_SPEECH_BAD) == 0) ||
+        (sub(frame_type, RX_NO_DATA) == 0) ||
+        (sub(frame_type, RX_ONSET) == 0))
+    {
+       bfi = 1;
+       if ((sub(frame_type, RX_NO_DATA) == 0) ||
+           (sub(frame_type, RX_ONSET) == 0))
+       {
+      build_CN_param(&st->nodataSeed,
+             prmno[mode],
+             bitno[mode],
+             parm);
+       }
+    }
+    else if (sub(frame_type, RX_SPEECH_DEGRADED) == 0)
+    {
+       pdfi = 1;
+    }
+
+    if (bfi != 0)
+    {
+        st->state = add (st->state, 1);
+    }
+    else if (sub (st->state, 6) == 0)
+
+    {
+        st->state = 5;
+    }
+    else
+    {
+        st->state = 0;
+    }
+
+    if (sub (st->state, 6) > 0)
+    {
+        st->state = 6;
+    }
+
+    // If this frame is the first speech frame after CNI period,
+    // set the BFH state machine to an appropriate state depending
+    // on whether there was DTX muting before start of speech or not
+    // If there was DTX muting, the first speech frame is muted.
+    // If there was no DTX muting, the first speech frame is not
+    // muted. The BFH state machine starts from state 5, however, to
+    // keep the audible noise resulting from a SID frame which is
+    // erroneously interpreted as a good speech frame as small as
+    // possible (the decoder output in this case is quickly muted)
+
+    if (sub(st->dtxDecoderState->dtxGlobalState, DTX) == 0)
+    {
+       st->state = 5;
+       st->prev_bf = 0;
+    }
+    else if (sub(st->dtxDecoderState->dtxGlobalState, DTX_MUTE) == 0)
+    {
+       st->state = 5;
+       st->prev_bf = 1;
+    }
+
+    // save old LSFs for CB gain smoothing
+    Copy (st->lsfState->past_lsf_q, prev_lsf, M);
+
+    // decode LSF parameters and generate interpolated lpc coefficients
+       for the 4 subframes
+    if (sub (mode, MR122) != 0)
+    {
+       D_plsf_3(st->lsfState, mode, bfi, parm, lsp_new);
+
+       // Advance synthesis parameters pointer
+       parm += 3;
+
+       Int_lpc_1to3(st->lsp_old, lsp_new, A_t);
+    }
+    else
+    {
+       D_plsf_5 (st->lsfState, bfi, parm, lsp_mid, lsp_new);
+
+       // Advance synthesis parameters pointer
+       parm += 5;
+
+       Int_lpc_1and3 (st->lsp_old, lsp_mid, lsp_new, A_t);
+    }
+
+    // update the LSPs for the next frame
+    for (i = 0; i < M; i++)
+    {
+       st->lsp_old[i] = lsp_new[i];
+    }
+
+    *------------------------------------------------------------------------*
+    *          Loop for every subframe in the analysis frame                 *
+    *------------------------------------------------------------------------*
+    * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
+    *  times                                                                 *
+    *     - decode the pitch delay                                           *
+    *     - decode algebraic code                                            *
+    *     - decode pitch and codebook gains                                  *
+    *     - find the excitation and compute synthesis speech                 *
+    *------------------------------------------------------------------------*
+
+    // pointer to interpolated LPC parameters
+    Az = A_t;
+
+    evenSubfr = 0;
+    subfrNr = -1;
+    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+    {
+       subfrNr = add(subfrNr, 1);
+       evenSubfr = sub(1, evenSubfr);
+
+       // flag for first and 3th subframe
+       pit_flag = i_subfr;
+
+       if (sub (i_subfr, L_FRAME_BY2) == 0)
+       {
+          if (sub(mode, MR475) != 0 && sub(mode, MR515) != 0)
+          {
+             pit_flag = 0;
+          }
+       }
+
+       // pitch index
+       index = *parm++;
+
+        *-------------------------------------------------------*
+        * - decode pitch lag and find adaptive codebook vector. *
+        *-------------------------------------------------------*
+
+       if (sub(mode, MR122) != 0)
+       {
+          // flag4 indicates encoding with 4 bit resolution;
+          // this is needed for mode MR475, MR515, MR59 and MR67
+
+          flag4 = 0;
+          if ((sub (mode, MR475) == 0) ||
+              (sub (mode, MR515) == 0) ||
+              (sub (mode, MR59) == 0) ||
+              (sub (mode, MR67) == 0) ) {
+             flag4 = 1;
+          }
+
+           *-------------------------------------------------------*
+           * - get ranges for the t0_min and t0_max                *
+           * - only needed in delta decoding                       *
+           *-------------------------------------------------------*
+
+          delta_frc_low = 5;
+          delta_frc_range = 9;
+
+          if ( sub(mode, MR795) == 0 )
+          {
+             delta_frc_low = 10;
+             delta_frc_range = 19;
+          }
+
+          t0_min = sub(st->old_T0, delta_frc_low);
+          if (sub(t0_min, PIT_MIN) < 0)
+          {
+             t0_min = PIT_MIN;
+          }
+          t0_max = add(t0_min, delta_frc_range);
+          if (sub(t0_max, PIT_MAX) > 0)
+          {
+             t0_max = PIT_MAX;
+             t0_min = sub(t0_max, delta_frc_range);
+          }
+
+          Dec_lag3 (index, t0_min, t0_max, pit_flag, st->old_T0,
+                    &T0, &T0_frac, flag4);
+
+          st->T0_lagBuff = T0;
+
+          if (bfi != 0)
+          {
+             if (sub (st->old_T0, PIT_MAX) < 0)
+             {                                      // Graceful pitch
+                st->old_T0 = add(st->old_T0, 1);    // degradation
+             }
+             T0 = st->old_T0;
+             T0_frac = 0;
+
+             if ( st->inBackgroundNoise != 0 &&
+                  sub(st->voicedHangover, 4) > 0 &&
+                  ((sub(mode, MR475) == 0 ) ||
+                   (sub(mode, MR515) == 0 ) ||
+                   (sub(mode, MR59) == 0) )
+                  )
+             {
+                T0 = st->T0_lagBuff;
+             }
+          }
+
+          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 1);
+       }
+       else
+       {
+          Dec_lag6 (index, PIT_MIN_MR122,
+                    PIT_MAX, pit_flag, &T0, &T0_frac);
+
+          if ( bfi == 0 && (pit_flag == 0 || sub (index, 61) < 0))
+          {
+          }
+          else
+          {
+             st->T0_lagBuff = T0;
+             T0 = st->old_T0;
+             T0_frac = 0;
+          }
+
+          Pred_lt_3or6 (st->exc, T0, T0_frac, L_SUBFR, 0);
+       }
+
+        *-------------------------------------------------------*
+        * - (MR122 only: Decode pitch gain.)                    *
+        * - Decode innovative codebook.                         *
+        * - set pitch sharpening factor                         *
+        *-------------------------------------------------------*
+
+        if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
+        {   // MR475, MR515
+           index = *parm++;        // index of position
+           i = *parm++;            // signs
+
+           decode_2i40_9bits (subfrNr, i, index, code);
+
+           pit_sharp = shl (st->sharp, 1);
+        }
+        else if (sub (mode, MR59) == 0)
+        {   // MR59
+           index = *parm++;        // index of position
+           i = *parm++;            // signs
+
+           decode_2i40_11bits (i, index, code);
+
+           pit_sharp = shl (st->sharp, 1);
+        }
+        else if (sub (mode, MR67) == 0)
+        {   // MR67
+           index = *parm++;        // index of position
+           i = *parm++;            // signs
+
+           decode_3i40_14bits (i, index, code);
+
+           pit_sharp = shl (st->sharp, 1);
+        }
+        else if (sub (mode, MR795) <= 0)
+        {   // MR74, MR795
+           index = *parm++;        // index of position
+           i = *parm++;            // signs
+
+           decode_4i40_17bits (i, index, code);
+
+           pit_sharp = shl (st->sharp, 1);
+        }
+        else if (sub (mode, MR102) == 0)
+        {  // MR102
+           dec_8i40_31bits (parm, code);
+           parm += 7;
+
+           pit_sharp = shl (st->sharp, 1);
+        }
+        else
+        {  // MR122
+           index = *parm++;
+           if (bfi != 0)
+           {
+              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
+           }
+           else
+           {
+              gain_pit = d_gain_pitch (mode, index);
+           }
+           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
+                                 &gain_pit);
+
+           dec_10i40_35bits (parm, code);
+           parm += 10;
+
+           // pit_sharp = gain_pit;
+           // if (pit_sharp > 1.0) pit_sharp = 1.0;
+
+           pit_sharp = shl (gain_pit, 1);
+        }
+
+         *-------------------------------------------------------*
+         * - Add the pitch contribution to code[].               *
+         *-------------------------------------------------------*
+        for (i = T0; i < L_SUBFR; i++)
+        {
+           temp = mult (code[i - T0], pit_sharp);
+           code[i] = add (code[i], temp);
+        }
+
+         *------------------------------------------------------------*
+         * - Decode codebook gain (MR122) or both pitch               *
+         *   gain and codebook gain (all others)                      *
+         * - Update pitch sharpening "sharp" with quantized gain_pit  *
+         *------------------------------------------------------------*
+
+        if (sub (mode, MR475) == 0)
+        {
+           // read and decode pitch and code gain
+           if (evenSubfr != 0)
+           {
+              index_mr475 = *parm++; // index of gain(s)
+           }
+
+           if (bfi == 0)
+           {
+              Dec_gain(st->pred_state, mode, index_mr475, code,
+                       evenSubfr, &gain_pit, &gain_code);
+           }
+           else
+           {
+              ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
+              ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
+                            &gain_code);
+           }
+           ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
+                                 &gain_pit);
+           ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
+                                &gain_code);
+
+           pit_sharp = gain_pit;
+           if (sub (pit_sharp, SHARPMAX) > 0)
+           {
+               pit_sharp = SHARPMAX;
+           }
+
+        }
+        else if ((sub (mode, MR74) <= 0) ||
+                 (sub (mode, MR102) == 0))
+        {
+            // read and decode pitch and code gain
+            index = *parm++; // index of gain(s)
+
+            if (bfi == 0)
+            {
+               Dec_gain(st->pred_state, mode, index, code,
+                        evenSubfr, &gain_pit, &gain_code);
+            }
+            else
+            {
+               ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
+               ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
+                             &gain_code);
+            }
+            ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
+                                  &gain_pit);
+            ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
+                                 &gain_code);
+
+            pit_sharp = gain_pit;
+            if (sub (pit_sharp, SHARPMAX) > 0)
+            {
+               pit_sharp = SHARPMAX;
+            }
+
+            if (sub (mode, MR102) == 0)
+            {
+               if (sub (st->old_T0, add(L_SUBFR, 5)) > 0)
+               {
+                  pit_sharp = shr(pit_sharp, 2);
+               }
+            }
+        }
+        else
+        {
+           // read and decode pitch gain
+           index = *parm++; // index of gain(s)
+
+           if (sub (mode, MR795) == 0)
+           {
+              // decode pitch gain
+              if (bfi != 0)
+              {
+                 ec_gain_pitch (st->ec_gain_p_st, st->state, &gain_pit);
+              }
+              else
+              {
+                 gain_pit = d_gain_pitch (mode, index);
+              }
+              ec_gain_pitch_update (st->ec_gain_p_st, bfi, st->prev_bf,
+                                    &gain_pit);
+
+              // read and decode code gain
+              index = *parm++;
+              if (bfi == 0)
+              {
+                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
+              }
+              else
+              {
+                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
+                               &gain_code);
+              }
+              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
+                                   &gain_code);
+
+              pit_sharp = gain_pit;
+              if (sub (pit_sharp, SHARPMAX) > 0)
+              {
+                 pit_sharp = SHARPMAX;
+              }
+           }
+           else
+           { // MR122
+              if (bfi == 0)
+              {
+                 d_gain_code (st->pred_state, mode, index, code, &gain_code);
+              }
+              else
+              {
+                 ec_gain_code (st->ec_gain_c_st, st->pred_state, st->state,
+                               &gain_code);
+              }
+              ec_gain_code_update (st->ec_gain_c_st, bfi, st->prev_bf,
+                                   &gain_code);
+
+              pit_sharp = gain_pit;
+           }
+        }
+
+        // store pitch sharpening for next subframe
+        // (for modes which use the previous pitch gain for
+        // pitch sharpening in the search phase)
+        // do not update sharpening in even subframes for MR475
+        if (sub(mode, MR475) != 0 || evenSubfr == 0)
+        {
+            st->sharp = gain_pit;
+            if (sub (st->sharp, SHARPMAX) > 0)
+            {
+                st->sharp = SHARPMAX;
+            }
+        }
+
+        pit_sharp = shl (pit_sharp, 1);
+        if (sub (pit_sharp, 16384) > 0)
+        {
+           for (i = 0; i < L_SUBFR; i++)
+            {
+               temp = mult (st->exc[i], pit_sharp);
+               L_temp = L_mult (temp, gain_pit);
+               if (sub(mode, MR122)==0)
+               {
+                  L_temp = L_shr (L_temp, 1);
+               }
+               excp[i] = pv_round (L_temp);
+            }
+        }
+
+         *-------------------------------------------------------*
+         * - Store list of LTP gains needed in the source        *
+         *   characteristic detector (SCD)                       *
+         *-------------------------------------------------------*
+        if ( bfi == 0 )
+        {
+           for (i = 0; i < 8; i++)
+           {
+              st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
+           }
+           st->ltpGainHistory[8] = gain_pit;
+        }
+
+         *-------------------------------------------------------*
+         * - Limit gain_pit if in background noise and BFI       *
+         *   for MR475, MR515, MR59                              *
+         *-------------------------------------------------------*
+
+        if ( (st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
+             ((sub(mode, MR475) == 0) ||
+              (sub(mode, MR515) == 0) ||
+              (sub(mode, MR59) == 0))
+             )
+        {
+           if ( sub (gain_pit, 12288) > 0)    // if (gain_pit > 0.75) in Q14
+              gain_pit = add( shr( sub(gain_pit, 12288), 1 ), 12288 );
+              // gain_pit = (gain_pit-0.75)/2.0 + 0.75;
+
+           if ( sub (gain_pit, 14745) > 0)    // if (gain_pit > 0.90) in Q14
+           {
+              gain_pit = 14745;
+           }
+        }
+
+         *-------------------------------------------------------*
+         *  Calculate CB mixed gain                              *
+         *-------------------------------------------------------*
+        Int_lsf(prev_lsf, st->lsfState->past_lsf_q, i_subfr, lsf_i);
+        gain_code_mix = Cb_gain_average(
+            st->Cb_gain_averState, mode, gain_code,
+            lsf_i, st->lsp_avg_st->lsp_meanSave, bfi,
+            st->prev_bf, pdfi, st->prev_pdf,
+            st->inBackgroundNoise, st->voicedHangover);
+
+        // make sure that MR74, MR795, MR122 have original code_gain
+        if ((sub(mode, MR67) > 0) && (sub(mode, MR102) != 0) )
+           // MR74, MR795, MR122
+        {
+           gain_code_mix = gain_code;
+        }
+
+         *-------------------------------------------------------*
+         * - Find the total excitation.                          *
+         * - Find synthesis speech corresponding to st->exc[].   *
+         *-------------------------------------------------------*
+        if (sub(mode, MR102) <= 0) // MR475, MR515, MR59, MR67, MR74, MR795, MR102
+        {
+           pitch_fac = gain_pit;
+           tmp_shift = 1;
+        }
+        else       // MR122
+        {
+           pitch_fac = shr (gain_pit, 1);
+           tmp_shift = 2;
+        }
+
+        // copy unscaled LTP excitation to exc_enhanced (used in phase
+         * dispersion below) and compute total excitation for LTP feedback
+
+        for (i = 0; i < L_SUBFR; i++)
+        {
+           exc_enhanced[i] = st->exc[i];
+
+           // st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i];
+           L_temp = L_mult (st->exc[i], pitch_fac);
+                                                      // 12.2: Q0 * Q13
+                                                      //  7.4: Q0 * Q14
+           L_temp = L_mac (L_temp, code[i], gain_code);
+                                                      // 12.2: Q12 * Q1
+                                                      //  7.4: Q13 * Q1
+           L_temp = L_shl (L_temp, tmp_shift);                   // Q16
+           st->exc[i] = pv_round (L_temp);
+        }
+
+         *-------------------------------------------------------*
+         * - Adaptive phase dispersion                           *
+         *-------------------------------------------------------*
+        ph_disp_release(st->ph_disp_st); // free phase dispersion adaption
+
+        if ( ((sub(mode, MR475) == 0) ||
+              (sub(mode, MR515) == 0) ||
+              (sub(mode, MR59) == 0))   &&
+             sub(st->voicedHangover, 3) > 0 &&
+             st->inBackgroundNoise != 0 &&
+             bfi != 0 )
+        {
+           ph_disp_lock(st->ph_disp_st); // Always Use full Phase Disp.
+        }                                // if error in bg noise
+
+        // apply phase dispersion to innovation (if enabled) and
+           compute total excitation for synthesis part
+        ph_disp(st->ph_disp_st, mode,
+                exc_enhanced, gain_code_mix, gain_pit, code,
+                pitch_fac, tmp_shift);
+
+         *-------------------------------------------------------*
+         * - The Excitation control module are active during BFI.*
+         * - Conceal drops in signal energy if in bg noise.      *
+         *-------------------------------------------------------*
+
+        L_temp = 0;
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            L_temp = L_mac (L_temp, exc_enhanced[i], exc_enhanced[i] );
+        }
+
+        L_temp = L_shr (L_temp, 1);     // excEnergy = sqrt(L_temp) in Q0
+        L_temp = sqrt_l_exp(L_temp, &temp); // function result
+        L_temp = L_shr(L_temp, add( shr(temp, 1), 15));
+        L_temp = L_shr(L_temp, 2);       // To cope with 16-bit and
+        excEnergy = extract_l(L_temp);   // scaling in ex_ctrl()
+
+        if ( ((sub (mode, MR475) == 0) ||
+              (sub (mode, MR515) == 0) ||
+              (sub (mode, MR59) == 0))  &&
+             sub(st->voicedHangover, 5) > 0 &&
+             st->inBackgroundNoise != 0 &&
+             sub(st->state, 4) < 0 &&
+             ( (pdfi != 0 && st->prev_pdf != 0) ||
+                bfi != 0 ||
+                st->prev_bf != 0) )
+        {
+           carefulFlag = 0;
+           if ( pdfi != 0 && bfi == 0 )
+           {
+              carefulFlag = 1;
+           }
+
+           Ex_ctrl(exc_enhanced,
+                   excEnergy,
+                   st->excEnergyHist,
+                   st->voicedHangover,
+                   st->prev_bf,
+                   carefulFlag);
+        }
+
+        if ( st->inBackgroundNoise != 0 &&
+             ( bfi != 0 || st->prev_bf != 0 ) &&
+             sub(st->state, 4) < 0 )
+        {
+           ; // do nothing!
+        }
+        else
+        {
+           // Update energy history for all modes
+           for (i = 0; i < 8; i++)
+           {
+              st->excEnergyHist[i] = st->excEnergyHist[i+1];
+           }
+           st->excEnergyHist[8] = excEnergy;
+        }
+         *-------------------------------------------------------*
+         * Excitation control module end.                        *
+         *-------------------------------------------------------*
+
+        if (sub (pit_sharp, 16384) > 0)
+        {
+           for (i = 0; i < L_SUBFR; i++)
+           {
+              excp[i] = add (excp[i], exc_enhanced[i]);
+           }
+           agc2 (exc_enhanced, excp, L_SUBFR);
+           Overflow = 0;
+           Syn_filt (Az, excp, &synth[i_subfr], L_SUBFR,
+                     st->mem_syn, 0);
+        }
+        else
+        {
+           Overflow = 0;
+           Syn_filt (Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
+                     st->mem_syn, 0);
+        }
+
+        if (Overflow != 0)    // Test for overflow
+        {
+           for (i = 0; i < PIT_MAX + L_INTERPOL + L_SUBFR; i++)
+           {
+              st->old_exc[i] = shr(st->old_exc[i], 2);
+           }
+           for (i = 0; i < L_SUBFR; i++)
+           {
+              exc_enhanced[i] = shr(exc_enhanced[i], 2);
+           }
+           Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
+        }
+        else
+        {
+           Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
+        }
+
+         *--------------------------------------------------*
+         * Update signal for next frame.                    *
+         * -> shift to the left by L_SUBFR  st->exc[]       *
+         *--------------------------------------------------*
+
+        Copy (&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
+
+        // interpolated LPC parameters for next subframe
+        Az += MP1;
+
+        // store T0 for next subframe
+        st->old_T0 = T0;
+    }
+
+     *-------------------------------------------------------*
+     * Call the Source Characteristic Detector which updates *
+     * st->inBackgroundNoise and st->voicedHangover.         *
+     *-------------------------------------------------------*
+
+    st->inBackgroundNoise = Bgn_scd(st->background_state,
+                                    &(st->ltpGainHistory[0]),
+                                    &(synth[0]),
+                                    &(st->voicedHangover) );
+
+    dtx_dec_activity_update(st->dtxDecoderState,
+                            st->lsfState->past_lsf_q,
+                            synth);
+
+    // store bfi for next subframe
+    st->prev_bf = bfi;
+    st->prev_pdf = pdfi;
+
+     *--------------------------------------------------*
+     * Calculate the LSF averages on the eight          *
+     * previous frames                                  *
+     *--------------------------------------------------*
+
+    lsp_avg(st->lsp_avg_st, st->lsfState->past_lsf_q);
+
+the_end:
+    st->dtxDecoderState->dtxGlobalState = newDTXState;
+
+    return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Decoder_amr(
+    Decoder_amrState *st,      /* i/o : State variables                   */
+    enum Mode mode,            /* i   : AMR mode                          */
+    Word16 parm[],             /* i   : vector of synthesis parameters
+                                        (PRM_SIZE)                        */
+    enum RXFrameType frame_type, /* i   : received frame type             */
+    Word16 synth[],            /* o   : synthesis speech (L_FRAME)        */
+    Word16 A_t[]               /* o   : decoded LP filter in 4 subframes
+                                        (AZ_SIZE)                         */
+)
+{
+    /* LPC coefficients */
+
+    Word16 *Az;                /* Pointer on A_t */
+
+    /* LSPs */
+
+    Word16 lsp_new[M];
+    Word16 lsp_mid[M];
+
+    /* LSFs */
+
+    Word16 prev_lsf[M];
+    Word16 lsf_i[M];
+
+    /* Algebraic codevector */
+
+    Word16 code[L_SUBFR];
+
+    /* excitation */
+
+    Word16 excp[L_SUBFR];
+    Word16 exc_enhanced[L_SUBFR];
+
+    /* Scalars */
+
+    Word16 i;
+    Word16 i_subfr;
+    Word16 T0;
+    Word16 T0_frac;
+    Word16 index;
+    Word16 index_mr475 = 0;
+    Word16 gain_pit;
+    Word16 gain_code;
+    Word16 gain_code_mix;
+    Word16 pit_sharp;
+    Word16 pit_flag;
+    Word16 pitch_fac;
+    Word16 t0_min;
+    Word16 t0_max;
+    Word16 delta_frc_low;
+    Word16 delta_frc_range;
+    Word16 tmp_shift;
+    Word16 temp;
+    Word32 L_temp;
+    Word16 flag4;
+    Word16 carefulFlag;
+    Word16 excEnergy;
+    Word16 subfrNr;
+    Word16 evenSubfr = 0;
+
+    Word16 bfi = 0;   /* bad frame indication flag                          */
+    Word16 pdfi = 0;  /* potential degraded bad frame flag                  */
+
+    enum DTXStateType newDTXState;  /* SPEECH , DTX, DTX_MUTE */
+    Flag   *pOverflow = &(st->overflow);     /* Overflow flag            */
+
+
+    /* find the new  DTX state  SPEECH OR DTX */
+    newDTXState = rx_dtx_handler(&(st->dtxDecoderState), frame_type, pOverflow);
+
+    /* DTX actions */
+
+    if (newDTXState != SPEECH)
+    {
+        Decoder_amr_reset(st, MRDTX);
+
+        dtx_dec(&(st->dtxDecoderState),
+                st->mem_syn,
+                &(st->lsfState),
+                &(st->pred_state),
+                &(st->Cb_gain_averState),
+                newDTXState,
+                mode,
+                parm, synth, A_t, pOverflow);
+
+        /* update average lsp */
+        Lsf_lsp(
+            st->lsfState.past_lsf_q,
+            st->lsp_old,
+            M,
+            pOverflow);
+
+        lsp_avg(
+            &(st->lsp_avg_st),
+            st->lsfState.past_lsf_q,
+            pOverflow);
+
+        goto the_end;
+    }
+
+    /* SPEECH action state machine  */
+    if ((frame_type == RX_SPEECH_BAD) || (frame_type == RX_NO_DATA) ||
+            (frame_type == RX_ONSET))
+    {
+        bfi = 1;
+
+        if ((frame_type == RX_NO_DATA) || (frame_type == RX_ONSET))
+        {
+            build_CN_param(&st->nodataSeed,
+                           prmno[mode],
+                           bitno[mode],
+                           parm,
+                           pOverflow);
+        }
+    }
+    else if (frame_type == RX_SPEECH_DEGRADED)
+    {
+        pdfi = 1;
+    }
+
+    if (bfi != 0)
+    {
+        st->state += 1;
+    }
+    else if (st->state == 6)
+
+    {
+        st->state = 5;
+    }
+    else
+    {
+        st->state = 0;
+    }
+
+
+    if (st->state > 6)
+    {
+        st->state = 6;
+    }
+
+    /* If this frame is the first speech frame after CNI period,     */
+    /* set the BFH state machine to an appropriate state depending   */
+    /* on whether there was DTX muting before start of speech or not */
+    /* If there was DTX muting, the first speech frame is muted.     */
+    /* If there was no DTX muting, the first speech frame is not     */
+    /* muted. The BFH state machine starts from state 5, however, to */
+    /* keep the audible noise resulting from a SID frame which is    */
+    /* erroneously interpreted as a good speech frame as small as    */
+    /* possible (the decoder output in this case is quickly muted)   */
+
+    if (st->dtxDecoderState.dtxGlobalState == DTX)
+    {
+        st->state = 5;
+        st->prev_bf = 0;
+    }
+    else if (st->dtxDecoderState.dtxGlobalState == DTX_MUTE)
+    {
+        st->state = 5;
+        st->prev_bf = 1;
+    }
+
+    /* save old LSFs for CB gain smoothing */
+    Copy(st->lsfState.past_lsf_q, prev_lsf, M);
+
+    /* decode LSF parameters and generate interpolated lpc coefficients
+       for the 4 subframes */
+
+    if (mode != MR122)
+    {
+        D_plsf_3(
+            &(st->lsfState),
+            mode,
+            bfi,
+            parm,
+            lsp_new,
+            pOverflow);
+
+        /* Advance synthesis parameters pointer */
+        parm += 3;
+
+        Int_lpc_1to3(
+            st->lsp_old,
+            lsp_new,
+            A_t,
+            pOverflow);
+    }
+    else
+    {
+        D_plsf_5(
+            &(st->lsfState),
+            bfi,
+            parm,
+            lsp_mid,
+            lsp_new,
+            pOverflow);
+
+        /* Advance synthesis parameters pointer */
+        parm += 5;
+
+        Int_lpc_1and3(
+            st->lsp_old,
+            lsp_mid,
+            lsp_new,
+            A_t,
+            pOverflow);
+    }
+
+    /* update the LSPs for the next frame */
+    for (i = 0; i < M; i++)
+    {
+        st->lsp_old[i] = lsp_new[i];
+    }
+
+    /*------------------------------------------------------------------------*
+     *          Loop for every subframe in the analysis frame                 *
+     *------------------------------------------------------------------------*
+     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
+     *  times                                                                 *
+     *     - decode the pitch delay                                           *
+     *     - decode algebraic code                                            *
+     *     - decode pitch and codebook gains                                  *
+     *     - find the excitation and compute synthesis speech                 *
+     *------------------------------------------------------------------------*/
+
+    /* pointer to interpolated LPC parameters */
+    Az = A_t;
+
+    evenSubfr = 0;
+    subfrNr = -1;
+    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+    {
+        subfrNr += 1;
+        evenSubfr = 1 - evenSubfr;
+
+        /* flag for first and 3th subframe */
+        pit_flag = i_subfr;
+
+
+        if (i_subfr == L_FRAME_BY2)
+        {
+            if ((mode != MR475) && (mode != MR515))
+            {
+                pit_flag = 0;
+            }
+        }
+
+        /* pitch index */
+        index = *parm++;
+
+        /*-------------------------------------------------------*
+        * - decode pitch lag and find adaptive codebook vector. *
+        *-------------------------------------------------------*/
+
+        if (mode != MR122)
+        {
+            /* flag4 indicates encoding with 4 bit resolution;     */
+            /* this is needed for mode MR475, MR515, MR59 and MR67 */
+
+            flag4 = 0;
+
+            if ((mode == MR475) || (mode == MR515) || (mode == MR59) ||
+                    (mode == MR67))
+            {
+                flag4 = 1;
+            }
+
+            /*-------------------------------------------------------*
+            * - get ranges for the t0_min and t0_max                *
+            * - only needed in delta decoding                       *
+            *-------------------------------------------------------*/
+
+            delta_frc_low = 5;
+            delta_frc_range = 9;
+
+            if (mode == MR795)
+            {
+                delta_frc_low = 10;
+                delta_frc_range = 19;
+            }
+
+            t0_min = sub(st->old_T0, delta_frc_low, pOverflow);
+
+            if (t0_min < PIT_MIN)
+            {
+                t0_min = PIT_MIN;
+            }
+            t0_max = add(t0_min, delta_frc_range, pOverflow);
+
+            if (t0_max > PIT_MAX)
+            {
+                t0_max = PIT_MAX;
+                t0_min = t0_max - delta_frc_range;
+            }
+
+            Dec_lag3(index, t0_min, t0_max, pit_flag, st->old_T0,
+                     &T0, &T0_frac, flag4, pOverflow);
+
+            st->T0_lagBuff = T0;
+
+            if (bfi != 0)
+            {
+                if (st->old_T0 < PIT_MAX)
+                {                               /* Graceful pitch */
+                    st->old_T0 += 1;            /* degradation    */
+                }
+                T0 = st->old_T0;
+                T0_frac = 0;
+
+                if ((st->inBackgroundNoise != 0) && (st->voicedHangover > 4) &&
+                        ((mode == MR475) || (mode == MR515) || (mode == MR59)))
+                {
+                    T0 = st->T0_lagBuff;
+                }
+            }
+
+            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 1, pOverflow);
+        }
+        else
+        {
+            Dec_lag6(index, PIT_MIN_MR122,
+                     PIT_MAX, pit_flag, &T0, &T0_frac, pOverflow);
+
+
+            if (!(bfi == 0 && (pit_flag == 0 || index < 61)))
+            {
+                st->T0_lagBuff = T0;
+                T0 = st->old_T0;
+                T0_frac = 0;
+            }
+
+            Pred_lt_3or6(st->exc, T0, T0_frac, L_SUBFR, 0, pOverflow);
+        }
+
+        /*-------------------------------------------------------*
+         * - (MR122 only: Decode pitch gain.)                    *
+         * - Decode innovative codebook.                         *
+         * - set pitch sharpening factor                         *
+         *-------------------------------------------------------*/
+        if ((mode == MR475) || (mode == MR515))
+        {   /* MR475, MR515 */
+            index = *parm++;        /* index of position */
+            i = *parm++;            /* signs             */
+
+            decode_2i40_9bits(subfrNr, i, index, code, pOverflow);
+
+            L_temp = (Word32)st->sharp << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        else if (mode == MR59)
+        {   /* MR59 */
+            index = *parm++;        /* index of position */
+            i = *parm++;            /* signs             */
+
+            decode_2i40_11bits(i, index, code);
+
+            L_temp = (Word32)st->sharp << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        else if (mode == MR67)
+        {   /* MR67 */
+            index = *parm++;        /* index of position */
+            i = *parm++;            /* signs             */
+
+            decode_3i40_14bits(i, index, code);
+
+            L_temp = (Word32)st->sharp << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        else if (mode <= MR795)
+        {   /* MR74, MR795 */
+            index = *parm++;        /* index of position */
+            i = *parm++;            /* signs             */
+
+            decode_4i40_17bits(i, index, code);
+
+            L_temp = (Word32)st->sharp << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        else if (mode == MR102)
+        {  /* MR102 */
+            dec_8i40_31bits(parm, code, pOverflow);
+            parm += 7;
+
+            L_temp = (Word32)st->sharp << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (st->sharp > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        else
+        {  /* MR122 */
+            index = *parm++;
+
+            if (bfi != 0)
+            {
+                ec_gain_pitch(
+                    &(st->ec_gain_p_st),
+                    st->state,
+                    &gain_pit,
+                    pOverflow);
+            }
+            else
+            {
+                gain_pit = d_gain_pitch(mode, index);
+            }
+            ec_gain_pitch_update(
+                &(st->ec_gain_p_st),
+                bfi,
+                st->prev_bf,
+                &gain_pit,
+                pOverflow);
+
+
+            dec_10i40_35bits(parm, code);
+            parm += 10;
+
+            /* pit_sharp = gain_pit;                   */
+            /* if (pit_sharp > 1.0) pit_sharp = 1.0;   */
+
+            L_temp = (Word32)gain_pit << 1;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                pit_sharp = (gain_pit > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                pit_sharp = (Word16) L_temp;
+            }
+        }
+        /*-------------------------------------------------------*
+         * - Add the pitch contribution to code[].               *
+         *-------------------------------------------------------*/
+        for (i = T0; i < L_SUBFR; i++)
+        {
+            temp = mult(*(code + i - T0), pit_sharp, pOverflow);
+            *(code + i) = add(*(code + i), temp, pOverflow);
+
+        }
+
+        /*------------------------------------------------------------*
+         * - Decode codebook gain (MR122) or both pitch               *
+         *   gain and codebook gain (all others)                      *
+         * - Update pitch sharpening "sharp" with quantized gain_pit  *
+         *------------------------------------------------------------*/
+        if (mode == MR475)
+        {
+            /* read and decode pitch and code gain */
+
+            if (evenSubfr != 0)
+            {
+                index_mr475 = *parm++;         /* index of gain(s) */
+            }
+
+            if (bfi == 0)
+            {
+                Dec_gain(
+                    &(st->pred_state),
+                    mode,
+                    index_mr475,
+                    code,
+                    evenSubfr,
+                    &gain_pit,
+                    &gain_code,
+                    pOverflow);
+            }
+            else
+            {
+                ec_gain_pitch(
+                    &(st->ec_gain_p_st),
+                    st->state,
+                    &gain_pit,
+                    pOverflow);
+
+                ec_gain_code(
+                    &(st->ec_gain_c_st),
+                    &(st->pred_state),
+                    st->state,
+                    &gain_code,
+                    pOverflow);
+            }
+            ec_gain_pitch_update(
+                &st->ec_gain_p_st,
+                bfi,
+                st->prev_bf,
+                &gain_pit,
+                pOverflow);
+
+            ec_gain_code_update(
+                &st->ec_gain_c_st,
+                bfi,
+                st->prev_bf,
+                &gain_code,
+                pOverflow);
+
+            pit_sharp = gain_pit;
+
+            if (pit_sharp > SHARPMAX)
+            {
+                pit_sharp = SHARPMAX;
+            }
+
+        }
+        else if ((mode <= MR74) || (mode == MR102))
+        {
+            /* read and decode pitch and code gain */
+            index = *parm++;                 /* index of gain(s) */
+
+            if (bfi == 0)
+            {
+                Dec_gain(
+                    &(st->pred_state),
+                    mode,
+                    index,
+                    code,
+                    evenSubfr,
+                    &gain_pit,
+                    &gain_code,
+                    pOverflow);
+            }
+            else
+            {
+                ec_gain_pitch(
+                    &(st->ec_gain_p_st),
+                    st->state,
+                    &gain_pit,
+                    pOverflow);
+
+                ec_gain_code(
+                    &(st->ec_gain_c_st),
+                    &(st->pred_state),
+                    st->state,
+                    &gain_code,
+                    pOverflow);
+            }
+
+            ec_gain_pitch_update(
+                &(st->ec_gain_p_st),
+                bfi,
+                st->prev_bf,
+                &gain_pit,
+                pOverflow);
+
+            ec_gain_code_update(
+                &(st->ec_gain_c_st),
+                bfi,
+                st->prev_bf,
+                &gain_code,
+                pOverflow);
+
+            pit_sharp = gain_pit;
+
+            if (pit_sharp > SHARPMAX)
+            {
+                pit_sharp = SHARPMAX;
+            }
+
+            if (mode == MR102)
+            {
+                if (st->old_T0 > (L_SUBFR + 5))
+                {
+                    if (pit_sharp < 0)
+                    {
+                        pit_sharp = ~((~pit_sharp) >> 2);
+                    }
+                    else
+                    {
+                        pit_sharp = pit_sharp >> 2;
+                    }
+                }
+            }
+        }
+        else
+        {
+            /* read and decode pitch gain */
+            index = *parm++;                 /* index of gain(s) */
+
+            if (mode == MR795)
+            {
+                /* decode pitch gain */
+                if (bfi != 0)
+                {
+                    ec_gain_pitch(
+                        &(st->ec_gain_p_st),
+                        st->state,
+                        &gain_pit,
+                        pOverflow);
+                }
+                else
+                {
+                    gain_pit = d_gain_pitch(mode, index);
+                }
+                ec_gain_pitch_update(
+                    &(st->ec_gain_p_st),
+                    bfi,
+                    st->prev_bf,
+                    &gain_pit,
+                    pOverflow);
+
+                /* read and decode code gain */
+                index = *parm++;
+
+                if (bfi == 0)
+                {
+                    d_gain_code(
+                        &(st->pred_state),
+                        mode,
+                        index,
+                        code,
+                        &gain_code,
+                        pOverflow);
+                }
+                else
+                {
+                    ec_gain_code(
+                        &(st->ec_gain_c_st),
+                        &(st->pred_state),
+                        st->state,
+                        &gain_code,
+                        pOverflow);
+                }
+
+                ec_gain_code_update(
+                    &(st->ec_gain_c_st),
+                    bfi,
+                    st->prev_bf,
+                    &gain_code,
+                    pOverflow);
+
+                pit_sharp = gain_pit;
+
+                if (pit_sharp > SHARPMAX)
+                {
+                    pit_sharp = SHARPMAX;
+                }
+            }
+            else
+            { /* MR122 */
+
+                if (bfi == 0)
+                {
+                    d_gain_code(
+                        &(st->pred_state),
+                        mode,
+                        index,
+                        code,
+                        &gain_code,
+                        pOverflow);
+                }
+                else
+                {
+                    ec_gain_code(
+                        &(st->ec_gain_c_st),
+                        &(st->pred_state),
+                        st->state,
+                        &gain_code,
+                        pOverflow);
+                }
+
+                ec_gain_code_update(
+                    &(st->ec_gain_c_st),
+                    bfi,
+                    st->prev_bf,
+                    &gain_code,
+                    pOverflow);
+
+                pit_sharp = gain_pit;
+            }
+        }
+
+        /* store pitch sharpening for next subframe             */
+        /* (for modes which use the previous pitch gain for     */
+        /* pitch sharpening in the search phase)                */
+        /* do not update sharpening in even subframes for MR475 */
+        if ((mode != MR475) || (evenSubfr == 0))
+        {
+            st->sharp = gain_pit;
+
+            if (st->sharp > SHARPMAX)
+            {
+                st->sharp = SHARPMAX;
+            }
+        }
+
+        pit_sharp = shl(pit_sharp, 1, pOverflow);
+
+        if (pit_sharp > 16384)
+        {
+            for (i = 0; i < L_SUBFR; i++)
+            {
+                temp = mult(st->exc[i], pit_sharp, pOverflow);
+                L_temp = L_mult(temp, gain_pit, pOverflow);
+
+                if (mode == MR122)
+                {
+                    if (L_temp < 0)
+                    {
+                        L_temp = ~((~L_temp) >> 1);
+                    }
+                    else
+                    {
+                        L_temp = L_temp >> 1;
+                    }
+                }
+                *(excp + i) = pv_round(L_temp, pOverflow);
+            }
+        }
+
+        /*-------------------------------------------------------*
+         * - Store list of LTP gains needed in the source        *
+         *   characteristic detector (SCD)                       *
+         *-------------------------------------------------------*/
+
+        if (bfi == 0)
+        {
+            for (i = 0; i < 8; i++)
+            {
+                st->ltpGainHistory[i] = st->ltpGainHistory[i+1];
+            }
+            st->ltpGainHistory[8] = gain_pit;
+        }
+
+        /*-------------------------------------------------------*
+        * - Limit gain_pit if in background noise and BFI       *
+        *   for MR475, MR515, MR59                              *
+        *-------------------------------------------------------*/
+
+
+        if ((st->prev_bf != 0 || bfi != 0) && st->inBackgroundNoise != 0 &&
+                ((mode == MR475) || (mode == MR515) || (mode == MR59)))
+        {
+
+            if (gain_pit > 12288)    /* if (gain_pit > 0.75) in Q14*/
+            {
+                gain_pit = ((gain_pit - 12288) >> 1) + 12288;
+                /* gain_pit = (gain_pit-0.75)/2.0 + 0.75; */
+            }
+
+            if (gain_pit > 14745)    /* if (gain_pit > 0.90) in Q14*/
+            {
+                gain_pit = 14745;
+            }
+        }
+
+        /*-------------------------------------------------------*
+         *  Calculate CB mixed gain                              *
+         *-------------------------------------------------------*/
+        Int_lsf(
+            prev_lsf,
+            st->lsfState.past_lsf_q,
+            i_subfr,
+            lsf_i,
+            pOverflow);
+
+        gain_code_mix =
+            Cb_gain_average(
+                &(st->Cb_gain_averState),
+                mode,
+                gain_code,
+                lsf_i,
+                st->lsp_avg_st.lsp_meanSave,
+                bfi,
+                st->prev_bf,
+                pdfi,
+                st->prev_pdf,
+                st->inBackgroundNoise,
+                st->voicedHangover,
+                pOverflow);
+
+        /* make sure that MR74, MR795, MR122 have original code_gain*/
+        if ((mode > MR67) && (mode != MR102))
+            /* MR74, MR795, MR122 */
+        {
+            gain_code_mix = gain_code;
+        }
+
+        /*-------------------------------------------------------*
+         * - Find the total excitation.                          *
+         * - Find synthesis speech corresponding to st->exc[].   *
+         *-------------------------------------------------------*/
+        if (mode <= MR102) /* MR475, MR515, MR59, MR67, MR74, MR795, MR102*/
+        {
+            pitch_fac = gain_pit;
+            tmp_shift = 1;
+        }
+        else       /* MR122 */
+        {
+            if (gain_pit < 0)
+            {
+                pitch_fac = ~((~gain_pit) >> 1);
+            }
+            else
+            {
+                pitch_fac = gain_pit >> 1;
+            }
+            tmp_shift = 2;
+        }
+
+        /* copy unscaled LTP excitation to exc_enhanced (used in phase
+         * dispersion below) and compute total excitation for LTP feedback
+         */
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            exc_enhanced[i] = st->exc[i];
+
+            /* st->exc[i] = gain_pit*st->exc[i] + gain_code*code[i]; */
+            L_temp = L_mult(st->exc[i], pitch_fac, pOverflow);
+            /* 12.2: Q0 * Q13 */
+            /*  7.4: Q0 * Q14 */
+            L_temp = L_mac(L_temp, code[i], gain_code, pOverflow);
+            /* 12.2: Q12 * Q1 */
+            /*  7.4: Q13 * Q1 */
+            L_temp = L_shl(L_temp, tmp_shift, pOverflow);     /* Q16 */
+            st->exc[i] = pv_round(L_temp, pOverflow);
+        }
+
+        /*-------------------------------------------------------*
+         * - Adaptive phase dispersion                           *
+         *-------------------------------------------------------*/
+        ph_disp_release(&(st->ph_disp_st)); /* free phase dispersion adaption */
+
+
+        if (((mode == MR475) || (mode == MR515) || (mode == MR59)) &&
+                (st->voicedHangover > 3) && (st->inBackgroundNoise != 0) &&
+                (bfi != 0))
+        {
+            ph_disp_lock(&(st->ph_disp_st)); /* Always Use full Phase Disp. */
+        }                                 /* if error in bg noise       */
+
+        /* apply phase dispersion to innovation (if enabled) and
+           compute total excitation for synthesis part           */
+        ph_disp(
+            &(st->ph_disp_st),
+            mode,
+            exc_enhanced,
+            gain_code_mix,
+            gain_pit,
+            code,
+            pitch_fac,
+            tmp_shift,
+            pOverflow);
+
+        /*-------------------------------------------------------*
+         * - The Excitation control module are active during BFI.*
+         * - Conceal drops in signal energy if in bg noise.      *
+         *-------------------------------------------------------*/
+        L_temp = 0;
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            L_temp = L_mac(L_temp, *(exc_enhanced + i), *(exc_enhanced + i), pOverflow);
+        }
+
+        /* excEnergy = sqrt(L_temp) in Q0 */
+        if (L_temp < 0)
+        {
+            L_temp = ~((~L_temp) >> 1);
+        }
+        else
+        {
+            L_temp = L_temp >> 1;
+        }
+
+        L_temp = sqrt_l_exp(L_temp, &temp, pOverflow);
+        /* To cope with 16-bit and scaling in ex_ctrl() */
+        L_temp = L_shr(L_temp, (Word16)((temp >> 1) + 15), pOverflow);
+        if (L_temp < 0)
+        {
+            excEnergy = (Word16)(~((~L_temp) >> 2));
+        }
+        else
+        {
+            excEnergy = (Word16)(L_temp >> 2);
+        }
+
+        if (((mode == MR475) || (mode == MR515) || (mode == MR59))  &&
+                (st->voicedHangover > 5) && (st->inBackgroundNoise != 0) &&
+                (st->state < 4) &&
+                ((pdfi != 0 && st->prev_pdf != 0) || bfi != 0 || st->prev_bf != 0))
+        {
+            carefulFlag = 0;
+
+            if (pdfi != 0 && bfi == 0)
+            {
+                carefulFlag = 1;
+            }
+
+            Ex_ctrl(exc_enhanced,
+                    excEnergy,
+                    st->excEnergyHist,
+                    st->voicedHangover,
+                    st->prev_bf,
+                    carefulFlag, pOverflow);
+        }
+
+        if (!((st->inBackgroundNoise != 0) && (bfi != 0 || st->prev_bf != 0) &&
+                (st->state < 4)))
+        {
+            /* Update energy history for all modes */
+            for (i = 0; i < 8; i++)
+            {
+                st->excEnergyHist[i] = st->excEnergyHist[i+1];
+            }
+            st->excEnergyHist[8] = excEnergy;
+        }
+        /*-------------------------------------------------------*
+         * Excitation control module end.                        *
+         *-------------------------------------------------------*/
+        if (pit_sharp > 16384)
+        {
+            for (i = 0; i < L_SUBFR; i++)
+            {
+                *(excp + i) = add(*(excp + i), *(exc_enhanced + i), pOverflow);
+
+            }
+            agc2(exc_enhanced, excp, L_SUBFR, pOverflow);
+            *pOverflow = 0;
+            Syn_filt(Az, excp, &synth[i_subfr], L_SUBFR,
+                     st->mem_syn, 0);
+        }
+        else
+        {
+            *pOverflow = 0;
+            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR,
+                     st->mem_syn, 0);
+        }
+
+        if (*pOverflow != 0)    /* Test for overflow */
+        {
+            for (i = PIT_MAX + L_INTERPOL + L_SUBFR - 1; i >= 0; i--)
+            {
+                if (st->old_exc[i] < 0)
+                {
+                    st->old_exc[i] = ~((~st->old_exc[i]) >> 2);
+                }
+                else
+                {
+                    st->old_exc[i] = st->old_exc[i] >> 2;
+                }
+
+            }
+
+            for (i = L_SUBFR - 1; i >= 0; i--)
+            {
+                if (*(exc_enhanced + i) < 0)
+                {
+                    *(exc_enhanced + i) = ~((~(*(exc_enhanced + i))) >> 2);
+                }
+                else
+                {
+                    *(exc_enhanced + i) = *(exc_enhanced + i) >> 2;
+                }
+            }
+            Syn_filt(Az, exc_enhanced, &synth[i_subfr], L_SUBFR, st->mem_syn, 1);
+        }
+        else
+        {
+            Copy(&synth[i_subfr+L_SUBFR-M], st->mem_syn, M);
+        }
+
+        /*--------------------------------------------------*
+         * Update signal for next frame.                    *
+         * -> shift to the left by L_SUBFR  st->exc[]       *
+         *--------------------------------------------------*/
+
+        Copy(&st->old_exc[L_SUBFR], &st->old_exc[0], PIT_MAX + L_INTERPOL);
+
+        /* interpolated LPC parameters for next subframe */
+        Az += MP1;
+
+        /* store T0 for next subframe */
+        st->old_T0 = T0;
+    }
+
+    /*-------------------------------------------------------*
+     * Call the Source Characteristic Detector which updates *
+     * st->inBackgroundNoise and st->voicedHangover.         *
+     *-------------------------------------------------------*/
+
+    st->inBackgroundNoise =
+        Bgn_scd(
+            &(st->background_state),
+            &(st->ltpGainHistory[0]),
+            &(synth[0]),
+            &(st->voicedHangover),
+            pOverflow);
+
+    dtx_dec_activity_update(
+        &(st->dtxDecoderState),
+        st->lsfState.past_lsf_q,
+        synth,
+        pOverflow);
+
+    /* store bfi for next subframe */
+    st->prev_bf = bfi;
+    st->prev_pdf = pdfi;
+
+    /*--------------------------------------------------*
+     * Calculate the LSF averages on the eight          *
+     * previous frames                                  *
+     *--------------------------------------------------*/
+    lsp_avg(
+        &(st->lsp_avg_st),
+        st->lsfState.past_lsf_q,
+        pOverflow);
+
+the_end:
+    st->dtxDecoderState.dtxGlobalState = newDTXState;
+
+//    return(0);
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_amr.h b/media/libstagefright/codecs/amrnb/dec/src/dec_amr.h
new file mode 100644
index 0000000..b04137d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_amr.h
@@ -0,0 +1,206 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/dec_amr.h
+
+     Date: 02/06/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Update function prototype for Decoder_amr(). Include overflow
+              flag in Decode_amrState structure
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+     File             : dec_amr.h
+     Purpose          : Speech decoder routine.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DEC_AMR_H
+#define DEC_AMR_H "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+#include "mode.h"
+#include "dtx_dec.h"
+#include "d_plsf.h"
+#include "gc_pred.h"
+#include "ec_gains.h"
+#include "ph_disp.h"
+#include "c_g_aver.h"
+#include "bgnscd.h"
+#include "lsp_avg.h"
+#include "frame.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define EXC_ENERGY_HIST_LEN  9
+#define LTP_GAIN_HISTORY_LEN 9
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct Decoder_amrState
+    {
+        /* Excitation vector */
+        Word16 old_exc[L_SUBFR + PIT_MAX + L_INTERPOL];
+        Word16 *exc;
+
+        /* Lsp (Line spectral pairs) */
+        /* Word16 lsp[M]; */      /* Used by CN codec */
+        Word16 lsp_old[M];
+
+        /* Filter's memory */
+        Word16 mem_syn[M];
+
+        /* pitch sharpening */
+        Word16 sharp;
+        Word16 old_T0;
+
+        /* Memories for bad frame handling */
+        Word16 prev_bf;
+        Word16 prev_pdf;
+        Word16 state;
+        Word16 excEnergyHist[EXC_ENERGY_HIST_LEN];
+
+        /* Variable holding received ltpLag, used in background noise and BFI */
+        Word16 T0_lagBuff;
+
+        /* Variables for the source characteristic detector (SCD) */
+        Word16 inBackgroundNoise;
+        Word16 voicedHangover;
+        Word16 ltpGainHistory[LTP_GAIN_HISTORY_LEN];
+
+        Bgn_scdState background_state;
+        Word16 nodataSeed;
+
+        Cb_gain_averageState Cb_gain_averState;
+        lsp_avgState lsp_avg_st;
+
+        D_plsfState lsfState;
+        ec_gain_pitchState ec_gain_p_st;
+        ec_gain_codeState ec_gain_c_st;
+        gc_predState pred_state;
+        ph_dispState ph_disp_st;
+        dtx_decState dtxDecoderState;
+        Flag overflow;
+    } Decoder_amrState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    /*
+     *  Function    : Decoder_amr_init
+     *  Purpose     : Allocates initializes state memory
+     *  Description : Stores pointer to filter status struct in *st. This
+     *                pointer has to be passed to Decoder_amr in each call.
+     *  Returns     : 0 on success
+     */
+    Word16 Decoder_amr_init(Decoder_amrState *st);
+
+    /*
+     *  Function    : Decoder_amr_reset
+     *  Purpose     : Resets state memory
+     *  Returns     : 0 on success
+     */
+    Word16 Decoder_amr_reset(Decoder_amrState *st, enum Mode mode);
+
+    /*
+     *  Function    : Decoder_amr
+     *  Purpose     : Speech decoder routine.
+     *  Returns     : 0
+     */
+    void Decoder_amr(
+        Decoder_amrState *st,  /* i/o : State variables                       */
+        enum Mode mode,        /* i   : AMR mode                              */
+        Word16 parm[],         /* i   : vector of synthesis parameters
+                                    (PRM_SIZE)                            */
+        enum RXFrameType frame_type, /* i   : received frame type               */
+        Word16 synth[],        /* o   : synthesis speech (L_FRAME)            */
+        Word16 A_t[]           /* o   : decoded LP filter in 4 subframes
+                                    (AZ_SIZE)                             */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* DEC_AMR_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_gain.cpp b/media/libstagefright/codecs/amrnb/dec/src/dec_gain.cpp
new file mode 100644
index 0000000..ceab48d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_gain.cpp
@@ -0,0 +1,305 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/dec_gain.c
+ Funtions: dec_gain
+
+     Date: 01/31/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updating include file lists, and other things as per review
+              comments.
+
+ Description: Added fixes to the code as per review comments. Removed nested
+              function calls and declared temp2 as a variable.
+
+ Description: A Word32 was being stored improperly in a Word16.
+
+ Description: Removed qua_gain.tab and qgain475.tab from Include section and
+              added qua_gain_tbl.h and qgain475_tab.h to Include section.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description:  Added casting to eliminate warnings
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "dec_gain.h"
+#include "typedef.h"
+#include "mode.h"
+#include "cnst.h"
+#include "pow2.h"
+#include "log2.h"
+#include "gc_pred.h"
+#include "basic_op.h"
+#include "qua_gain_tbl.h"
+#include "qgain475_tab.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dec_gain
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pred_state = pointer to MA predictor state of type gc_predState
+    index = AMR mode of type enum Mode
+    code[] = pointer to innovative vector of type Word16
+    evenSubfr = Flag for even subframes of type Word16
+    pOverflow = pointer to overflow flag
+
+
+ Outputs:
+    pred_state = pointer to MA predictor state of type gc_predState
+    gain_pit = pointer to pitch gain of type Word16
+    gain_cod = pointer to code gain of type Word16
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+      File             : dec_gain.c
+      Purpose          : Decode the pitch and codebook gains
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ agc.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+
+
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+
+void Dec_gain(
+    gc_predState *pred_state, /* i/o: MA predictor state           */
+    enum Mode mode,           /* i  : AMR mode                     */
+    Word16 index,             /* i  : index of quantization.       */
+    Word16 code[],            /* i  : Innovative vector.           */
+    Word16 evenSubfr,         /* i  : Flag for even subframes      */
+    Word16 * gain_pit,        /* o  : Pitch gain.                  */
+    Word16 * gain_cod,        /* o  : Code gain.                   */
+    Flag   * pOverflow
+)
+{
+    const Word16 *p;
+    Word16 frac;
+    Word16 gcode0;
+    Word16 exp;
+    Word16 qua_ener;
+    Word16 qua_ener_MR122;
+    Word16 g_code;
+    Word32 L_tmp;
+    Word16 temp1;
+    Word16 temp2;
+
+    /* Read the quantized gains (table depends on mode) */
+    index = shl(index, 2, pOverflow);
+
+    if (mode == MR102 || mode == MR74 || mode == MR67)
+    {
+        p = &table_gain_highrates[index];
+
+        *gain_pit = *p++;
+        g_code = *p++;
+        qua_ener_MR122 = *p++;
+        qua_ener = *p;
+    }
+    else
+    {
+        if (mode == MR475)
+        {
+            index += (1 ^ evenSubfr) << 1; /* evenSubfr is 0 or 1 */
+
+            if (index > (MR475_VQ_SIZE*4 - 2))
+            {
+                index = (MR475_VQ_SIZE * 4 - 2); /* avoid possible buffer overflow */
+            }
+
+            p = &table_gain_MR475[index];
+
+            *gain_pit = *p++;
+            g_code = *p++;
+
+            /*---------------------------------------------------------*
+             *  calculate predictor update values (not stored in 4.75  *
+             *  quantizer table to save space):                        *
+             *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
+             *                                                         *
+             *   qua_ener       = log2(g)                              *
+             *   qua_ener_MR122 = 20*log10(g)                          *
+             *---------------------------------------------------------*/
+
+            /* Log2(x Q12) = log2(x) + 12 */
+            temp1 = (Word16) L_deposit_l(g_code);
+            Log2(temp1, &exp, &frac, pOverflow);
+            exp = sub(exp, 12, pOverflow);
+
+            temp1 = shr_r(frac, 5, pOverflow);
+            temp2 = shl(exp, 10, pOverflow);
+            qua_ener_MR122 = add(temp1, temp2, pOverflow);
+
+            /* 24660 Q12 ~= 6.0206 = 20*log10(2) */
+            L_tmp = Mpy_32_16(exp, frac, 24660, pOverflow);
+            L_tmp = L_shl(L_tmp, 13, pOverflow);
+            qua_ener = pv_round(L_tmp, pOverflow);
+            /* Q12 * Q0 = Q13 -> Q10 */
+        }
+        else
+        {
+            p = &table_gain_lowrates[index];
+
+            *gain_pit = *p++;
+            g_code = *p++;
+            qua_ener_MR122 = *p++;
+            qua_ener = *p;
+        }
+    }
+
+    /*-------------------------------------------------------------------*
+     *  predict codebook gain                                            *
+     *  ~~~~~~~~~~~~~~~~~~~~~                                            *
+     *  gc0     = Pow2(int(d)+frac(d))                                   *
+     *          = 2^exp + 2^frac                                         *
+     *                                                                   *
+     *  gcode0 (Q14) = 2^14*2^frac = gc0 * 2^(14-exp)                    *
+     *-------------------------------------------------------------------*/
+
+    gc_pred(pred_state, mode, code, &exp, &frac, NULL, NULL, pOverflow);
+
+    gcode0 = (Word16) Pow2(14, frac, pOverflow);
+
+    /*------------------------------------------------------------------*
+     *  read quantized gains, update table of past quantized energies   *
+     *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   *
+     *  st->past_qua_en(Q10) = 20 * Log10(g_fac) / constant             *
+     *                       = Log2(g_fac)                              *
+     *                       = qua_ener                                 *
+     *                                           constant = 20*Log10(2) *
+     *------------------------------------------------------------------*/
+
+    L_tmp = L_mult(g_code, gcode0, pOverflow);
+    temp1 = sub(10, exp, pOverflow);
+    L_tmp = L_shr(L_tmp, temp1, pOverflow);
+    *gain_cod = extract_h(L_tmp);
+
+    /* update table of past quantized energies */
+
+    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
+
+    return;
+}
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_gain.h b/media/libstagefright/codecs/amrnb/dec/src/dec_gain.h
new file mode 100644
index 0000000..b9c6a8d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_gain.h
@@ -0,0 +1,127 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/dec_gain.h
+
+     Date: 01/31/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : dec_gain.h
+      Purpose          : Decode the pitch and codebook gains
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _DEC_GAIN_H_
+#define _DEC_GAIN_H_
+#define dec_gain_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "gc_pred.h"
+#include "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*
+     *   FUNCTION:  Dec_gain()
+     *   PURPOSE: Decode the pitch and codebook gains
+     */
+    void Dec_gain(
+        gc_predState *pred_state, /* i/o: MA predictor state           */
+        enum Mode mode,           /* i  : AMR mode                     */
+        Word16 index,             /* i  : index of quantization.       */
+        Word16 code[],            /* i  : Innovative vector.           */
+        Word16 evenSubfr,         /* i  : Flag for even subframes      */
+        Word16 * gain_pit,        /* o  : Pitch gain.                  */
+        Word16 * gain_cod,        /* o  : Code gain.                   */
+        Flag   * pOverflow
+    );
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _DEC_GAIN_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_input_format_tab.cpp b/media/libstagefright/codecs/amrnb/dec/src/dec_input_format_tab.cpp
new file mode 100644
index 0000000..a59f5fa
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_input_format_tab.cpp
@@ -0,0 +1,232 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+ Pathname: .audio/gsm-amr/c/src/dec_input_format_tab.c
+
+     Date: 03/01/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Renamed BytesThisFrame to WmfBytesPerFrame, changed its type
+              from 'const short' to 'const int'. Added If2BytesPerFrame
+              table for IF2 input format. Updated copyright year and I/O
+              definition sections, and added reference document for IF2.
+
+ Description: Renamed WmfBytesPerFrame to WmfDecBytesPerFrame, and
+              If2BytesPerFrame to If2DecBytesPerFrame.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This file contains the tables of the number of data bytes per codec mode in
+ both WMF and IF2 input formats.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] AMR Speech Codec Frame Structure, 3GPP TS 26.101 version 4.1.0 Release 4,
+     June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+    /* Table containing the number of core AMR data bytes for                */
+    /* each codec mode for WMF input format(number excludes frame type byte) */
+    extern const Word16 WmfDecBytesPerFrame[16] =
+    {
+        12, /* 4.75 */
+        13, /* 5.15 */
+        15, /* 5.90 */
+        17, /* 6.70 */
+        19, /* 7.40 */
+        20, /* 7.95 */
+        26, /* 10.2 */
+        31, /* 12.2 */
+        5, /* GsmAmr comfort noise */
+        6, /* Gsm-Efr comfort noise */
+        5, /* IS-641 comfort noise */
+        5, /* Pdc-Efr comfort noise */
+        0, /* future use */
+        0, /* future use */
+        0, /* future use */
+        0 /* No transmission */
+    };
+
+    /* Table containing the number of core AMR data bytes for   */
+    /* each codec mode for IF2 input format.                    */
+    extern const Word16 If2DecBytesPerFrame[16] =
+    {
+        13, /* 4.75 */
+        14, /* 5.15 */
+        16, /* 5.90 */
+        18, /* 6.70 */
+        19, /* 7.40 */
+        21, /* 7.95 */
+        26, /* 10.2 */
+        31, /* 12.2 */
+        6, /* GsmAmr comfort noise */
+        6, /* Gsm-Efr comfort noise */
+        6, /* IS-641 comfort noise */
+        6, /* Pdc-Efr comfort noise */
+        0, /* future use */
+        0, /* future use */
+        0, /* future use */
+        1 /* No transmission */
+    };
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; Define all local variables
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Function body here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Return nothing or data or data pointer
+----------------------------------------------------------------------------*/
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.cpp b/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.cpp
new file mode 100644
index 0000000..70baaba
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.cpp
@@ -0,0 +1,407 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/dec_lag3.c
+ Functions: Dec_lag3
+
+     Date: 01/31/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Updated to accept new parameter, Flag *pOverflow.
+ (2) Placed file in the proper PV Software template.
+
+ Description:
+ (1) Removed "count.h" and "basic_op.h" and replaced with individual include
+     files (add.h, sub.h, etc.)
+
+ Description:
+ (1) Removed optimization -- mult(i, 3, pOverflow) is NOT the same as adding
+     i to itself 3 times.  The reason is because the mult function does a
+     right shift by 15, which will obliterate smaller numbers.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    index   -- Word16 -- received pitch index
+    t0_min  -- Word16 -- minimum of search range
+    t0_max  -- Word16 -- maximum of search range
+    i_subfr -- Word16 -- subframe flag
+    T0_prev -- Word16 -- integer pitch delay of last subframe
+                         used in 2nd and 4th subframes
+    flag4   -- Word16 -- flag for encoding with 4 bits
+
+ Outputs:
+
+    T0 -- Pointer to type Word16 -- integer part of pitch lag
+    T0_frac -- Pointer to type Word16 -- fractional part of pitch lag
+    pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+
+              )
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE:  Decoding of fractional pitch lag with 1/3 resolution.
+           Extract the integer and fraction parts of the pitch lag from
+           the received adaptive codebook index.
+
+  See "Enc_lag3.c" for more details about the encoding procedure.
+
+  The fractional lag in 1st and 3rd subframes is encoded with 8 bits
+  while that in 2nd and 4th subframes is relatively encoded with 4, 5
+  and 6 bits depending on the mode.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dec_lag3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "dec_lag3.h"
+#include "typedef.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Dec_lag3(Word16 index,     /* i : received pitch index                 */
+              Word16 t0_min,    /* i : minimum of search range              */
+              Word16 t0_max,    /* i : maximum of search range              */
+              Word16 i_subfr,   /* i : subframe flag                        */
+              Word16 T0_prev,   /* i : integer pitch delay of last subframe
+                                       used in 2nd and 4th subframes        */
+              Word16 * T0,      /* o : integer part of pitch lag            */
+              Word16 * T0_frac, /* o : fractional part of pitch lag         */
+              Word16 flag4,     /* i : flag for encoding with 4 bits        */
+              Flag  *pOverflow  /* o : Flag set when overflow occurs        */
+             )
+{
+    Word16 i;
+    Word16 tmp_lag;
+
+    if (i_subfr == 0)    /* if 1st or 3rd subframe */
+    {
+
+        if (index < 197)
+        {
+
+            tmp_lag = index + 2;
+
+            tmp_lag =
+                mult(
+                    tmp_lag,
+                    10923,
+                    pOverflow);
+
+            i =
+                add(
+                    tmp_lag,
+                    19,
+                    pOverflow);
+
+            *T0 = i;
+
+            /* i = 3 * (*T0) */
+
+            i = add(i, i, pOverflow);
+            i = add(i, *T0, pOverflow);
+
+            tmp_lag =
+                sub(
+                    index,
+                    i,
+                    pOverflow);
+
+            *T0_frac =
+                add(
+                    tmp_lag,
+                    58,
+                    pOverflow);
+        }
+        else
+        {
+            *T0 = index - 112;
+
+            *T0_frac = 0;
+        }
+
+    }
+    else
+    {  /* 2nd or 4th subframe */
+
+        if (flag4 == 0)
+        {
+
+            /* 'normal' decoding: either with 5 or 6 bit resolution */
+
+            i =
+                add(
+                    index,
+                    2,
+                    pOverflow);
+
+            i =
+                mult(
+                    i,
+                    10923,
+                    pOverflow);
+
+            i =
+                sub(
+                    i,
+                    1,
+                    pOverflow);
+
+            *T0 =
+                add(
+                    i,
+                    t0_min,
+                    pOverflow);
+
+            /* i = 3* (*T0) */
+            i = add(add(i, i, pOverflow), i, pOverflow);
+
+            tmp_lag =
+                sub(
+                    index,
+                    2,
+                    pOverflow);
+
+            *T0_frac =
+                sub(
+                    tmp_lag,
+                    i,
+                    pOverflow);
+        }
+        else
+        {
+
+            /* decoding with 4 bit resolution */
+
+            tmp_lag = T0_prev;
+
+            i =
+                sub(
+                    tmp_lag,
+                    t0_min,
+                    pOverflow);
+
+            if (i > 5)
+            {
+                tmp_lag =
+                    add(
+                        t0_min,
+                        5,
+                        pOverflow);
+            }
+
+            i =
+                sub(
+                    t0_max,
+                    tmp_lag,
+                    pOverflow);
+
+            if (i > 4)
+            {
+                tmp_lag =
+                    sub(
+                        t0_max,
+                        4,
+                        pOverflow);
+            }
+
+            if (index < 4)
+            {
+                i =
+                    sub(
+                        tmp_lag,
+                        5,
+                        pOverflow);
+
+                *T0 =
+                    add(
+                        i,
+                        index,
+                        pOverflow);
+
+                *T0_frac = 0;
+            }
+            else
+            {
+                /* 4 >= index < 12 */
+                if (index < 12)
+                {
+                    i = index - 5;
+
+                    i = mult(
+                            i,
+                            10923,
+                            pOverflow);
+
+                    i--;
+
+                    *T0 = add(
+                              i,
+                              tmp_lag,
+                              pOverflow);
+
+                    i = add(
+                            add(
+                                i,
+                                i,
+                                pOverflow),
+                            i,
+                            pOverflow);
+
+                    tmp_lag = index - 9;
+
+                    *T0_frac =
+                        sub(
+                            tmp_lag,
+                            i,
+                            pOverflow);
+                }
+                else
+                {
+                    i = index - 12;
+
+                    i =
+                        add(
+                            i,
+                            tmp_lag,
+                            pOverflow);
+
+                    *T0 =
+                        add(
+                            i,
+                            1,
+                            pOverflow);
+
+                    *T0_frac = 0;
+                }
+            }
+
+        } /* end if (decoding with 4 bit resolution) */
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.h b/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.h
new file mode 100644
index 0000000..e758b92
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_lag3.h
@@ -0,0 +1,127 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/dec_lag3.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the dec_lag3.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef dec_lag3_h
+#define dec_lag3_h "$Id $"
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void Dec_lag3(Word16 index,     /* i : received pitch index                 */
+    Word16 T0_min,    /* i : minimum of search range              */
+    Word16 T0_max,    /* i : maximum of search range              */
+    Word16 i_subfr,   /* i : subframe flag                        */
+    Word16 T0_prev,   /* i : integer pitch delay of last subframe
+                                       used in 2nd and 4th subframes        */
+    Word16 * T0,      /* o : integer part of pitch lag            */
+    Word16 * T0_frac, /* o : fractional part of pitch lag         */
+    Word16 flag4,     /* i : flag for encoding with 4 bits        */
+    Flag   * pOverflow  /* o : Flag set when overflow occurs      */
+                 );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DEC_LAG_3_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.cpp b/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.cpp
new file mode 100644
index 0000000..7dc7a8d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.cpp
@@ -0,0 +1,337 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/dec_lag6.c
+ Functions: Dec_lag6
+
+     Date: 01/31/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Updated to accept new parameter, Flag *pOverflow.
+ (2) Placed file in the proper PV Software template.
+
+ Description:
+ (1) Removed "count.h" and "basic_op.h" and replaced with individual include
+     files (add.h, sub.h, etc.)
+
+ Description:
+ (1) Removed optimization -- mult(i, 3, pOverflow) is NOT the same as adding
+     i to itself 3 times.  The reason is because the mult function does a
+     right shift by 15, which will obliterate smaller numbers.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    index   -- Word16 -- received pitch index
+    pit_min  -- Word16 -- minimum pitch lag
+    pit_max  -- Word16 -- maximum pitch lag
+    i_subfr -- Word16 -- subframe flag
+    T0 -- Pointer to type Word16 -- integer part of pitch lag
+
+ Outputs:
+
+    T0 -- Pointer to type Word16 -- integer part of pitch lag
+    T0_frac -- Pointer to type Word16 -- fractional part of pitch lag
+    pOverflow -- Pointer to type Flag -- Flag set when overflow occurs
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ PURPOSE:  Decoding of fractional pitch lag with 1/6 resolution.
+           Extract the integer and fraction parts of the pitch lag from
+           the received adaptive codebook index.
+
+  See "Enc_lag6.c" for more details about the encoding procedure.
+
+  The fractional lag in 1st and 3rd subframes is encoded with 9 bits
+  while that in 2nd and 4th subframes is relatively encoded with 6 bits.
+  Note that in relative encoding only 61 values are used. If the
+  decoder receives 61, 62, or 63 as the relative pitch index, it means
+  that a transmission error occurred. In this case, the pitch lag from
+  previous subframe (actually from previous frame) is used.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dec_lag6.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE: [stack count for this module] + [variable to represent
+          stack usage for each subroutine called]
+
+     where: [stack usage variable] = stack usage for [subroutine
+         name] (see [filename].ext)
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES: [cycle count equation for this module] + [variable
+           used to represent cycle count for each subroutine
+           called]
+
+     where: [cycle count variable] = cycle count for [subroutine
+        name] (see [filename].ext)
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "dec_lag6.h"
+#include "typedef.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Dec_lag6(
+    Word16 index,      /* input : received pitch index           */
+    Word16 pit_min,    /* input : minimum pitch lag              */
+    Word16 pit_max,    /* input : maximum pitch lag              */
+    Word16 i_subfr,    /* input : subframe flag                  */
+    Word16 *T0,        /* in/out: integer part of pitch lag      */
+    Word16 *T0_frac,   /* output: fractional part of pitch lag   */
+    Flag   *pOverflow  /* o : Flag set when overflow occurs      */
+)
+{
+    Word16 i;
+    Word16 T0_min;
+    Word16 T0_max;
+    Word16 k;
+    Word16 w;
+
+    if (i_subfr == 0)          /* if 1st or 3rd subframe */
+    {
+        if (index < 463)
+        {
+            /* T0 = (index+5)/6 + 17 */
+            i = index + 5;
+            i =
+                mult(
+                    i,
+                    5462,
+                    pOverflow);
+
+            i =
+                add(
+                    i,
+                    17,
+                    pOverflow);
+
+            *T0 = i;
+
+            /* i = 3* (*T0) */
+
+            i = add(i, i, pOverflow);
+            i = add(i, *T0, pOverflow);
+
+            /* *T0_frac = index - T0*6 + 105 */
+
+            i =
+                add(
+                    i,
+                    i,
+                    pOverflow);
+
+            i =
+                sub(
+                    index,
+                    i,
+                    pOverflow);
+
+            *T0_frac =
+                add(
+                    i,
+                    105,
+                    pOverflow);
+        }
+        else
+        {
+            *T0 =
+                sub(
+                    index,
+                    368,
+                    pOverflow);
+
+            *T0_frac = 0;
+        }
+    }
+    else       /* second or fourth subframe */
+    {
+        /* find T0_min and T0_max for 2nd (or 4th) subframe */
+
+        T0_min =
+            sub(
+                *T0,
+                5,
+                pOverflow);
+
+        if (T0_min < pit_min)
+        {
+            T0_min = pit_min;
+        }
+
+        T0_max =
+            add(
+                T0_min,
+                9,
+                pOverflow);
+
+        if (T0_max > pit_max)
+        {
+            T0_max = pit_max;
+
+            T0_min =
+                sub(
+                    T0_max,
+                    9,
+                    pOverflow);
+        }
+
+        /* i = (index+5)/6 - 1 */
+        i =
+            add(
+                index,
+                5,
+                pOverflow);
+
+        i =
+            mult(
+                i,
+                5462,
+                pOverflow);
+
+        i =
+            sub(
+                i,
+                1,
+                pOverflow);
+
+        *T0 =
+            add(
+                i,
+                T0_min,
+                pOverflow);
+
+        /* i = 3* (*T0) */
+
+        w = add(i, i, pOverflow);
+        i = add(i, w, pOverflow);
+
+        i =
+            add(
+                i,
+                i,
+                pOverflow);
+
+        k =
+            sub(
+                index,
+                3,
+                pOverflow);
+
+        *T0_frac =
+            sub(
+                k,
+                i,
+                pOverflow);
+    }
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.h b/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.h
new file mode 100644
index 0000000..7322bc8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dec_lag6.h
@@ -0,0 +1,124 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/dec_lag6.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the dec_lag6.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef dec_lag6_h
+#define dec_lag6_h "$Id $"
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    void Dec_lag6(
+        Word16 index,      /* input : received pitch index           */
+        Word16 pit_min,    /* input : minimum pitch lag              */
+        Word16 pit_max,    /* input : maximum pitch lag              */
+        Word16 i_subfr,    /* input : subframe flag                  */
+        Word16 *T0,        /* in/out: integer part of pitch lag      */
+        Word16 *T0_frac,   /* output: fractional part of pitch lag   */
+        Flag   * pOverflow  /* o : Flag set when overflow occurs     */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DEC_LAG_6_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.cpp b/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.cpp
new file mode 100644
index 0000000..9d04373
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.cpp
@@ -0,0 +1,1956 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/dtx_dec.c
+ Functions:
+           dtx_dec_reset
+           dtx_dec
+           dtx_dec_activity_update
+           rx_dtx_handler
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ These modules decode the comfort noise when in DTX.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <string.h>
+
+#include "dtx_dec.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "copy.h"
+#include "set_zero.h"
+#include "mode.h"
+#include "log2.h"
+#include "lsp_az.h"
+#include "pow2.h"
+#include "a_refl.h"
+#include "b_cn_cod.h"
+#include "syn_filt.h"
+#include "lsp_lsf.h"
+#include "reorder.h"
+#include "lsp_tab.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define PN_INITIAL_SEED 0x70816958L   /* Pseudo noise generator seed value  */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/***************************************************
+ * Scaling factors for the lsp variability operation *
+ ***************************************************/
+static const Word16 lsf_hist_mean_scale[M] =
+{
+    20000,
+    20000,
+    20000,
+    20000,
+    20000,
+    18000,
+    16384,
+    8192,
+    0,
+    0
+};
+
+/*************************************************
+ * level adjustment for different modes Q11      *
+ *************************************************/
+static const Word16 dtx_log_en_adjust[9] =
+{
+    -1023, /* MR475 */
+    -878, /* MR515 */
+    -732, /* MR59  */
+    -586, /* MR67  */
+    -440, /* MR74  */
+    -294, /* MR795 */
+    -148, /* MR102 */
+    0, /* MR122 */
+    0, /* MRDTX */
+};
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dtx_dec_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type dtx_decState
+
+ Outputs:
+    Structure pointed to by st is initialized to a set of initial values.
+
+ Returns:
+    return_value = 0 if memory was successfully initialized,
+        otherwise returns -1 (int)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Reset of state memory for dtx_dec.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int dtx_dec_reset (dtx_decState *st)
+{
+   int i;
+
+   if (st == (dtx_decState *) NULL){
+      fprintf(stderr, "dtx_dec_reset: invalid parameter\n");
+      return -1;
+   }
+
+   st->since_last_sid = 0;
+   st->true_sid_period_inv = (1 << 13);
+
+   st->log_en = 3500;
+   st->old_log_en = 3500;
+   // low level noise for better performance in  DTX handover cases
+
+   st->L_pn_seed_rx = PN_INITIAL_SEED;
+
+   // Initialize state->lsp [] and state->lsp_old []
+   Copy(lsp_init_data, &st->lsp[0], M);
+   Copy(lsp_init_data, &st->lsp_old[0], M);
+
+   st->lsf_hist_ptr = 0;
+   st->log_pg_mean = 0;
+   st->log_en_hist_ptr = 0;
+
+   // initialize decoder lsf history
+   Copy(mean_lsf, &st->lsf_hist[0], M);
+
+   for (i = 1; i < DTX_HIST_SIZE; i++)
+   {
+      Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
+   }
+   Set_zero(st->lsf_hist_mean, M*DTX_HIST_SIZE);
+
+   // initialize decoder log frame energy
+   for (i = 0; i < DTX_HIST_SIZE; i++)
+   {
+      st->log_en_hist[i] = st->log_en;
+   }
+
+   st->log_en_adjust = 0;
+
+   st->dtxHangoverCount = DTX_HANG_CONST;
+   st->decAnaElapsedCount = 32767;
+
+   st->sid_frame = 0;
+   st->valid_data = 0;
+   st->dtxHangoverAdded = 0;
+
+   st->dtxGlobalState = DTX;
+   st->data_updated = 0;
+   return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 dtx_dec_reset(dtx_decState *st)
+{
+    Word16 i;
+
+    if (st == (dtx_decState *) NULL)
+    {
+        /* fprint(stderr, "dtx_dec_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    st->since_last_sid = 0;
+    st->true_sid_period_inv = (1 << 13);
+
+    st->log_en = 3500;
+    st->old_log_en = 3500;
+    /* low level noise for better performance in  DTX handover cases*/
+
+    st->L_pn_seed_rx = PN_INITIAL_SEED;
+
+    /* Initialize state->lsp [] */
+    st->lsp[0] = 30000;
+    st->lsp[1] = 26000;
+    st->lsp[2] = 21000;
+    st->lsp[3] = 15000;
+    st->lsp[4] = 8000;
+    st->lsp[5] = 0;
+    st->lsp[6] = -8000;
+    st->lsp[7] = -15000;
+    st->lsp[8] = -21000;
+    st->lsp[9] = -26000;
+
+    /* Initialize state->lsp_old [] */
+    st->lsp_old[0] = 30000;
+    st->lsp_old[1] = 26000;
+    st->lsp_old[2] = 21000;
+    st->lsp_old[3] = 15000;
+    st->lsp_old[4] = 8000;
+    st->lsp_old[5] = 0;
+    st->lsp_old[6] = -8000;
+    st->lsp_old[7] = -15000;
+    st->lsp_old[8] = -21000;
+    st->lsp_old[9] = -26000;
+
+    st->lsf_hist_ptr = 0;
+    st->log_pg_mean = 0;
+    st->log_en_hist_ptr = 0;
+
+    /* initialize decoder lsf history */
+    st->lsf_hist[0] =  1384;
+    st->lsf_hist[1] =  2077;
+    st->lsf_hist[2] =  3420;
+    st->lsf_hist[3] =  5108;
+    st->lsf_hist[4] =  6742;
+    st->lsf_hist[5] =  8122;
+    st->lsf_hist[6] =  9863;
+    st->lsf_hist[7] = 11092;
+    st->lsf_hist[8] = 12714;
+    st->lsf_hist[9] = 13701;
+
+    for (i = 1; i < DTX_HIST_SIZE; i++)
+    {
+        Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);
+    }
+    memset(st->lsf_hist_mean, 0, sizeof(Word16)*M*DTX_HIST_SIZE);
+
+    /* initialize decoder log frame energy */
+    for (i = 0; i < DTX_HIST_SIZE; i++)
+    {
+        st->log_en_hist[i] = st->log_en;
+    }
+
+    st->log_en_adjust = 0;
+
+    st->dtxHangoverCount = DTX_HANG_CONST;
+    st->decAnaElapsedCount = 32767;
+
+    st->sid_frame = 0;
+    st->valid_data = 0;
+    st->dtxHangoverAdded = 0;
+
+    st->dtxGlobalState = DTX;
+    st->data_updated = 0;
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dtx_dec
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type dtx_decState
+    mem_syn = AMR decoder state
+    lsfState = decoder lsf states
+    predState = prediction states
+    averState = CB gain average states
+    new_state = new DTX state
+    mode = AMR mode
+    parm = Vector of synthesis parameters
+
+ Outputs:
+    st points to an updated structure of type dtx_decState
+    mem_syn = AMR decoder state
+    lsfState = decoder lsf states
+    predState = prediction states
+    averState = CB gain average states
+    synth = synthesised speech
+    A_t = decoded LP filter in 4 subframes
+
+ Returns:
+    return_value = 0 (int)
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Decode comfort noise when in DTX.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int dtx_dec(
+   dtx_decState *st,                // i/o : State struct
+   Word16 mem_syn[],                // i/o : AMR decoder state
+   D_plsfState* lsfState,           // i/o : decoder lsf states
+   gc_predState* predState,         // i/o : prediction states
+   Cb_gain_averageState* averState, // i/o : CB gain average states
+   enum DTXStateType new_state,     // i   : new DTX state
+   enum Mode mode,                  // i   : AMR mode
+   Word16 parm[],                   // i   : Vector of synthesis parameters
+   Word16 synth[],                  // o   : synthesised speech
+   Word16 A_t[]                     // o   : decoded LP filter in 4 subframes
+   )
+{
+   Word16 log_en_index;
+   Word16 i, j;
+   Word16 int_fac;
+   Word32 L_log_en_int;
+   Word16 lsp_int[M];
+   Word16 log_en_int_e;
+   Word16 log_en_int_m;
+   Word16 level;
+   Word16 acoeff[M + 1];
+   Word16 refl[M];
+   Word16 pred_err;
+   Word16 ex[L_SUBFR];
+   Word16 ma_pred_init;
+   Word16 log_pg_e, log_pg_m;
+   Word16 log_pg;
+   Flag negative;
+   Word16 lsf_mean;
+   Word32 L_lsf_mean;
+   Word16 lsf_variab_index;
+   Word16 lsf_variab_factor;
+   Word16 lsf_int[M];
+   Word16 lsf_int_variab[M];
+   Word16 lsp_int_variab[M];
+   Word16 acoeff_variab[M + 1];
+
+   Word16 lsf[M];
+   Word32 L_lsf[M];
+   Word16 ptr;
+   Word16 tmp_int_length;
+
+
+    // This function is called if synthesis state is not SPEECH
+    // the globally passed  inputs to this function are
+    // st->sid_frame
+    // st->valid_data
+    // st->dtxHangoverAdded
+    // new_state  (SPEECH, DTX, DTX_MUTE)
+
+   if ((st->dtxHangoverAdded != 0) &&
+       (st->sid_frame != 0))
+   {
+      // sid_first after dtx hangover period
+      // or sid_upd after dtxhangover
+
+      // set log_en_adjust to correct value
+      st->log_en_adjust = dtx_log_en_adjust[mode];
+
+      ptr = add(st->lsf_hist_ptr, M);
+      if (sub(ptr, 80) == 0)
+      {
+         ptr = 0;
+      }
+      Copy( &st->lsf_hist[st->lsf_hist_ptr],&st->lsf_hist[ptr],M);
+
+      ptr = add(st->log_en_hist_ptr,1);
+      if (sub(ptr, DTX_HIST_SIZE) == 0)
+      {
+         ptr = 0;
+      }
+      st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; // Q11
+
+      // compute mean log energy and lsp
+      // from decoded signal (SID_FIRST)
+      st->log_en = 0;
+      for (i = 0; i < M; i++)
+      {
+         L_lsf[i] = 0;
+      }
+
+      // average energy and lsp
+      for (i = 0; i < DTX_HIST_SIZE; i++)
+      {
+         st->log_en = add(st->log_en,
+                          shr(st->log_en_hist[i],3));
+         for (j = 0; j < M; j++)
+         {
+            L_lsf[j] = L_add(L_lsf[j],
+                             L_deposit_l(st->lsf_hist[i * M + j]));
+         }
+      }
+
+      for (j = 0; j < M; j++)
+      {
+         lsf[j] = extract_l(L_shr(L_lsf[j],3)); // divide by 8
+      }
+
+      Lsf_lsp(lsf, st->lsp, M);
+
+      // make log_en speech coder mode independent
+      // added again later before synthesis
+      st->log_en = sub(st->log_en, st->log_en_adjust);
+
+      // compute lsf variability vector
+      Copy(st->lsf_hist, st->lsf_hist_mean, 80);
+
+      for (i = 0; i < M; i++)
+      {
+         L_lsf_mean = 0;
+         // compute mean lsf
+         for (j = 0; j < 8; j++)
+         {
+            L_lsf_mean = L_add(L_lsf_mean,
+                               L_deposit_l(st->lsf_hist_mean[i+j*M]));
+         }
+
+         lsf_mean = extract_l(L_shr(L_lsf_mean, 3));
+          // subtract mean and limit to within reasonable limits
+          // moreover the upper lsf's are attenuated
+         for (j = 0; j < 8; j++)
+         {
+            // subtract mean
+            st->lsf_hist_mean[i+j*M] =
+               sub(st->lsf_hist_mean[i+j*M], lsf_mean);
+
+            // attenuate deviation from mean, especially for upper lsf's
+            st->lsf_hist_mean[i+j*M] =
+               mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i]);
+
+            // limit the deviation
+            if (st->lsf_hist_mean[i+j*M] < 0)
+            {
+               negative = 1;
+            }
+            else
+            {
+               negative = 0;
+            }
+            st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
+
+            // apply soft limit
+            if (sub(st->lsf_hist_mean[i+j*M], 655) > 0)
+            {
+               st->lsf_hist_mean[i+j*M] =
+                  add(655, shr(sub(st->lsf_hist_mean[i+j*M], 655), 2));
+            }
+
+            // apply hard limit
+            if (sub(st->lsf_hist_mean[i+j*M], 1310) > 0)
+            {
+               st->lsf_hist_mean[i+j*M] = 1310;
+            }
+            if (negative != 0)
+            {
+               st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
+            }
+
+         }
+      }
+   }
+
+   if (st->sid_frame != 0 )
+   {
+      // Set old SID parameters, always shift
+      // even if there is no new valid_data
+      Copy(st->lsp, st->lsp_old, M);
+      st->old_log_en = st->log_en;
+
+      if (st->valid_data != 0 )  // new data available (no CRC)
+      {
+         // Compute interpolation factor, since the division only works
+         // for values of since_last_sid < 32 we have to limit the
+         // interpolation to 32 frames
+         tmp_int_length = st->since_last_sid;
+         st->since_last_sid = 0;
+
+         if (sub(tmp_int_length, 32) > 0)
+         {
+            tmp_int_length = 32;
+         }
+         if (sub(tmp_int_length, 2) >= 0)
+         {
+            st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
+         }
+         else
+         {
+            st->true_sid_period_inv = 1 << 14; // 0.5 it Q15
+         }
+
+         Init_D_plsf_3(lsfState, parm[0]);  // temporay initialization
+         D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp);
+         Set_zero(lsfState->past_r_q, M);   // reset for next speech frame
+
+         log_en_index = parm[4];
+         // Q11 and divide by 4
+         st->log_en = shl(log_en_index, (11 - 2));
+
+         // Subtract 2.5 in Q11
+         st->log_en = sub(st->log_en, (2560 * 2));
+
+         // Index 0 is reserved for silence
+         if (log_en_index == 0)
+         {
+            st->log_en = MIN_16;
+         }
+
+         // no interpolation at startup after coder reset
+         // or when SID_UPD has been received right after SPEECH
+         if ((st->data_updated == 0) ||
+             (sub(st->dtxGlobalState, SPEECH) == 0)
+             )
+         {
+            Copy(st->lsp, st->lsp_old, M);
+            st->old_log_en = st->log_en;
+         }
+      } // endif valid_data
+
+      // initialize gain predictor memory of other modes
+      ma_pred_init = sub(shr(st->log_en,1), 9000);
+      if (ma_pred_init > 0)
+      {
+         ma_pred_init = 0;
+      }
+      if (sub(ma_pred_init, -14436) < 0)
+      {
+         ma_pred_init = -14436;
+      }
+
+      predState->past_qua_en[0] = ma_pred_init;
+      predState->past_qua_en[1] = ma_pred_init;
+      predState->past_qua_en[2] = ma_pred_init;
+      predState->past_qua_en[3] = ma_pred_init;
+
+      // past_qua_en for other modes than MR122
+      ma_pred_init = mult(5443, ma_pred_init);
+      // scale down by factor 20*log10(2) in Q15
+      predState->past_qua_en_MR122[0] = ma_pred_init;
+      predState->past_qua_en_MR122[1] = ma_pred_init;
+      predState->past_qua_en_MR122[2] = ma_pred_init;
+      predState->past_qua_en_MR122[3] = ma_pred_init;
+   } // endif sid_frame
+
+   // CN generation
+   // recompute level adjustment factor Q11
+   // st->log_en_adjust = 0.9*st->log_en_adjust +
+   //                     0.1*dtx_log_en_adjust[mode]);
+   st->log_en_adjust = add(mult(st->log_en_adjust, 29491),
+                           shr(mult(shl(dtx_log_en_adjust[mode],5),3277),5));
+
+   // Interpolate SID info
+   int_fac = shl(add(1,st->since_last_sid), 10); // Q10
+   int_fac = mult(int_fac, st->true_sid_period_inv); // Q10 * Q15 -> Q10
+
+   // Maximize to 1.0 in Q10
+   if (sub(int_fac, 1024) > 0)
+   {
+      int_fac = 1024;
+   }
+   int_fac = shl(int_fac, 4); // Q10 -> Q14
+
+   L_log_en_int = L_mult(int_fac, st->log_en); // Q14 * Q11->Q26
+   for(i = 0; i < M; i++)
+   {
+      lsp_int[i] = mult(int_fac, st->lsp[i]);// Q14 * Q15 -> Q14
+   }
+
+   int_fac = sub(16384, int_fac); // 1-k in Q14
+
+   // (Q14 * Q11 -> Q26) + Q26 -> Q26
+   L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en);
+   for(i = 0; i < M; i++)
+   {
+      // Q14 + (Q14 * Q15 -> Q14) -> Q14
+      lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i]));
+      lsp_int[i] = shl(lsp_int[i], 1); // Q14 -> Q15
+   }
+
+   // compute the amount of lsf variability
+   lsf_variab_factor = sub(st->log_pg_mean,2457); // -0.6 in Q12
+   // *0.3 Q12*Q15 -> Q12
+   lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830));
+
+   // limit to values between 0..1 in Q12
+   if (sub(lsf_variab_factor, 4096) > 0)
+   {
+      lsf_variab_factor = 4096;
+   }
+   if (lsf_variab_factor < 0)
+   {
+      lsf_variab_factor = 0;
+   }
+   lsf_variab_factor = shl(lsf_variab_factor, 3); // -> Q15
+
+   // get index of vector to do variability with
+   lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
+
+   // convert to lsf
+   Lsp_lsf(lsp_int, lsf_int, M);
+
+   // apply lsf variability
+   Copy(lsf_int, lsf_int_variab, M);
+   for(i = 0; i < M; i++)
+   {
+      lsf_int_variab[i] = add(lsf_int_variab[i],
+                              mult(lsf_variab_factor,
+                                   st->lsf_hist_mean[i+lsf_variab_index*M]));
+   }
+
+   // make sure that LSP's are ordered
+   Reorder_lsf(lsf_int, LSF_GAP, M);
+   Reorder_lsf(lsf_int_variab, LSF_GAP, M);
+
+   // copy lsf to speech decoders lsf state
+   Copy(lsf_int, lsfState->past_lsf_q, M);
+
+   // convert to lsp
+   Lsf_lsp(lsf_int, lsp_int, M);
+   Lsf_lsp(lsf_int_variab, lsp_int_variab, M);
+
+   // Compute acoeffs Q12 acoeff is used for level
+   // normalization and postfilter, acoeff_variab is
+   // used for synthesis filter
+   // by doing this we make sure that the level
+   // in high frequenncies does not jump up and down
+
+   Lsp_Az(lsp_int, acoeff);
+   Lsp_Az(lsp_int_variab, acoeff_variab);
+
+   // For use in postfilter
+   Copy(acoeff, &A_t[0],           M + 1);
+   Copy(acoeff, &A_t[M + 1],       M + 1);
+   Copy(acoeff, &A_t[2 * (M + 1)], M + 1);
+   Copy(acoeff, &A_t[3 * (M + 1)], M + 1);
+
+   // Compute reflection coefficients Q15
+   A_Refl(&acoeff[1], refl);
+
+   // Compute prediction error in Q15
+   pred_err = MAX_16; // 0.99997 in Q15
+   for (i = 0; i < M; i++)
+   {
+      pred_err = mult(pred_err, sub(MAX_16, mult(refl[i], refl[i])));
+   }
+
+   // compute logarithm of prediction gain
+   Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m);
+
+   // convert exponent and mantissa to Word16 Q12
+   log_pg = shl(sub(log_pg_e,15), 12);  // Q12
+   log_pg = shr(sub(0,add(log_pg, shr(log_pg_m, 15-12))), 1);
+   st->log_pg_mean = add(mult(29491,st->log_pg_mean),
+                         mult(3277, log_pg));
+
+   // Compute interpolated log energy
+   L_log_en_int = L_shr(L_log_en_int, 10); // Q26 -> Q16
+
+   // Add 4 in Q16
+   L_log_en_int = L_add(L_log_en_int, 4 * 65536L);
+
+   // subtract prediction gain
+   L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4));
+
+   // adjust level to speech coder mode
+   L_log_en_int = L_add(L_log_en_int,
+                        L_shl(L_deposit_l(st->log_en_adjust), 5));
+
+   log_en_int_e = extract_h(L_log_en_int);
+   log_en_int_m = extract_l(L_shr(L_sub(L_log_en_int,
+                                        L_deposit_h(log_en_int_e)), 1));
+   level = extract_l(Pow2(log_en_int_e, log_en_int_m)); // Q4
+
+   for (i = 0; i < 4; i++)
+   {
+      // Compute innovation vector
+      build_CN_code(&st->L_pn_seed_rx, ex);
+      for (j = 0; j < L_SUBFR; j++)
+      {
+         ex[j] = mult(level, ex[j]);
+      }
+      // Synthesize
+      Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
+               mem_syn, 1);
+
+   } // next i
+
+   // reset codebook averaging variables
+   averState->hangVar = 20;
+   averState->hangCount = 0;
+
+   if (sub(new_state, DTX_MUTE) == 0)
+   {
+      // mute comfort noise as it has been quite a long time since
+       * last SID update  was performed
+
+      tmp_int_length = st->since_last_sid;
+      if (sub(tmp_int_length, 32) > 0)
+      {
+         tmp_int_length = 32;
+      }
+
+      // safety guard against division by zero
+      if(tmp_int_length <= 0) {
+         tmp_int_length = 8;
+      }
+
+      st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));
+
+      st->since_last_sid = 0;
+      Copy(st->lsp, st->lsp_old, M);
+      st->old_log_en = st->log_en;
+      // subtract 1/8 in Q11 i.e -6/8 dB
+      st->log_en = sub(st->log_en, 256);
+   }
+
+   // reset interpolation length timer
+   // if data has been updated.
+   if ((st->sid_frame != 0) &&
+       ((st->valid_data != 0) ||
+        ((st->valid_data == 0) &&  (st->dtxHangoverAdded) != 0)))
+   {
+      st->since_last_sid =  0;
+      st->data_updated = 1;
+   }
+
+   return 0;
+}
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void dtx_dec(
+    dtx_decState *st,                /* i/o : State struct                    */
+    Word16 mem_syn[],                /* i/o : AMR decoder state               */
+    D_plsfState* lsfState,           /* i/o : decoder lsf states              */
+    gc_predState* predState,         /* i/o : prediction states               */
+    Cb_gain_averageState* averState, /* i/o : CB gain average states          */
+    enum DTXStateType new_state,     /* i   : new DTX state                   */
+    enum Mode mode,                  /* i   : AMR mode                        */
+    Word16 parm[],                   /* i   : Vector of synthesis parameters  */
+    Word16 synth[],                  /* o   : synthesised speech              */
+    Word16 A_t[],                    /* o   : decoded LP filter in 4 subframes*/
+    Flag   *pOverflow
+)
+{
+    Word16 log_en_index;
+    Word16 i;
+    Word16 j;
+    Word16 int_fac;
+    Word32 L_log_en_int;
+    Word16 lsp_int[M];
+    Word16 log_en_int_e;
+    Word16 log_en_int_m;
+    Word16 level;
+    Word16 acoeff[M + 1];
+    Word16 refl[M];
+    Word16 pred_err;
+    Word16 ex[L_SUBFR];
+    Word16 ma_pred_init;
+    Word16 log_pg_e;
+    Word16 log_pg_m;
+    Word16 log_pg;
+    Flag negative;
+    Word16 lsf_mean;
+    Word32 L_lsf_mean;
+    Word16 lsf_variab_index;
+    Word16 lsf_variab_factor;
+    Word16 lsf_int[M];
+    Word16 lsf_int_variab[M];
+    Word16 lsp_int_variab[M];
+    Word16 acoeff_variab[M + 1];
+
+    Word16 lsf[M];
+    Word32 L_lsf[M];
+    Word16 ptr;
+    Word16 tmp_int_length;
+
+    Word32 L_temp;
+    Word16 temp;
+
+    /*  This function is called if synthesis state is not SPEECH
+     *  the globally passed  inputs to this function are
+     * st->sid_frame
+     * st->valid_data
+     * st->dtxHangoverAdded
+     * new_state  (SPEECH, DTX, DTX_MUTE)
+     */
+
+    if ((st->dtxHangoverAdded != 0) &&
+            (st->sid_frame != 0))
+    {
+        /* sid_first after dtx hangover period */
+        /* or sid_upd after dtxhangover        */
+
+        /* set log_en_adjust to correct value */
+        st->log_en_adjust = dtx_log_en_adjust[mode];
+
+        ptr = st->lsf_hist_ptr + M;
+
+        if (ptr == 80)
+        {
+            ptr = 0;
+        }
+        Copy(&st->lsf_hist[st->lsf_hist_ptr], &st->lsf_hist[ptr], M);
+
+        ptr = st->log_en_hist_ptr + 1;
+
+        if (ptr == DTX_HIST_SIZE)
+        {
+            ptr = 0;
+        }
+
+        st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; /* Q11 */
+
+        /* compute mean log energy and lsp *
+         * from decoded signal (SID_FIRST) */
+        st->log_en = 0;
+        for (i = M - 1; i >= 0; i--)
+        {
+            L_lsf[i] = 0;
+        }
+
+        /* average energy and lsp */
+        for (i = DTX_HIST_SIZE - 1; i >= 0; i--)
+        {
+            if (st->log_en_hist[i] < 0)
+            {
+                temp = ~((~st->log_en_hist[i]) >> 3);
+            }
+            else
+            {
+                temp = st->log_en_hist[i] >> 3;
+            }
+            st->log_en = add(st->log_en, temp, pOverflow);
+            for (j = M - 1; j >= 0; j--)
+            {
+                L_lsf[j] = L_add(L_lsf[j],
+                                 L_deposit_l(st->lsf_hist[i * M + j]), pOverflow);
+            }
+        }
+
+        for (j = M - 1; j >= 0; j--)
+        {
+            if (L_lsf[j] < 0)
+            {
+                lsf[j] = (Word16)(~((~L_lsf[j]) >> 3));
+            }
+            else
+            {
+                lsf[j] = (Word16)(L_lsf[j] >> 3);
+            }
+        }
+
+        Lsf_lsp(lsf, st->lsp, M, pOverflow);
+
+        /* make log_en speech coder mode independent */
+        /* added again later before synthesis        */
+        st->log_en = sub(st->log_en, st->log_en_adjust, pOverflow);
+
+        /* compute lsf variability vector */
+        Copy(st->lsf_hist, st->lsf_hist_mean, 80);
+
+        for (i = M - 1; i >= 0; i--)
+        {
+            L_lsf_mean = 0;
+            /* compute mean lsf */
+            for (j = 8 - 1; j >= 0; j--)
+            {
+                L_lsf_mean = L_add(L_lsf_mean,
+                                   L_deposit_l(st->lsf_hist_mean[i+j*M]), pOverflow);
+            }
+
+            if (L_lsf_mean < 0)
+            {
+                lsf_mean = (Word16)(~((~L_lsf_mean) >> 3));
+            }
+            else
+            {
+                lsf_mean = (Word16)(L_lsf_mean >> 3);
+            }
+            /* subtract mean and limit to within reasonable limits  *
+            * moreover the upper lsf's are attenuated              */
+            for (j = 8 - 1; j >= 0; j--)
+            {
+                /* subtract mean */
+                st->lsf_hist_mean[i+j*M] =
+                    sub(st->lsf_hist_mean[i+j*M], lsf_mean, pOverflow);
+
+                /* attenuate deviation from mean, especially for upper lsf's */
+                st->lsf_hist_mean[i+j*M] =
+                    mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i], pOverflow);
+
+                /* limit the deviation */
+                if (st->lsf_hist_mean[i+j*M] < 0)
+                {
+                    negative = 1;
+                }
+                else
+                {
+                    negative = 0;
+                }
+                st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);
+
+                /* apply soft limit */
+                if (st->lsf_hist_mean[i+j*M] > 655)
+                {
+                    st->lsf_hist_mean[i+j*M] = 655 + ((st->lsf_hist_mean[i+j*M]
+                                                       - 655) >> 2);
+                }
+
+                /* apply hard limit */
+                if (st->lsf_hist_mean[i+j*M] > 1310)
+                {
+                    st->lsf_hist_mean[i+j*M] = 1310;
+                }
+
+                if (negative != 0)
+                {
+                    st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];
+                }
+            }
+        }
+    }
+
+
+    if (st->sid_frame != 0)
+    {
+        /* Set old SID parameters, always shift */
+        /* even if there is no new valid_data   */
+        Copy(st->lsp, st->lsp_old, M);
+        st->old_log_en = st->log_en;
+
+        if (st->valid_data != 0)   /* new data available (no CRC) */
+        {
+            /* Compute interpolation factor, since the division only works *
+             * for values of since_last_sid < 32 we have to limit the      *
+             * interpolation to 32 frames                                  */
+            tmp_int_length = st->since_last_sid;
+            st->since_last_sid = 0;
+
+            if (tmp_int_length >= 32)
+            {
+                tmp_int_length = 32;
+            }
+
+            L_temp = ((Word32) tmp_int_length) << 10;
+            if (L_temp != (Word32)((Word16) L_temp))
+            {
+                *pOverflow = 1;
+                L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
+            }
+            temp = (Word16) L_temp;
+
+            if (tmp_int_length >= 2)
+            {
+                st->true_sid_period_inv = div_s(1 << 10, temp);
+            }
+            else
+            {
+                st->true_sid_period_inv = 1 << 14; /* 0.5 it Q15 */
+            }
+
+            Init_D_plsf_3(lsfState, parm[0]);
+            D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp, pOverflow);
+            Set_zero(lsfState->past_r_q, M);   /* reset for next speech frame */
+
+            log_en_index = parm[4];
+            /* Q11 and divide by 4 */
+            if ((log_en_index > 63) || (log_en_index < -64))
+            {
+                st->log_en = (log_en_index > 0) ? MAX_16 : MIN_16;
+            }
+            else
+            {
+                st->log_en = (log_en_index) << (11 - 2);
+            }
+
+            /* Subtract 2.5 in Q11 */
+            st->log_en = sub(st->log_en, (2560 * 2), pOverflow);
+
+            /* Index 0 is reserved for silence */
+            if (log_en_index == 0)
+            {
+                st->log_en = MIN_16;
+            }
+
+            /* no interpolation at startup after coder reset        */
+            /* or when SID_UPD has been received right after SPEECH */
+
+            if ((st->data_updated == 0) ||
+                    (st->dtxGlobalState == SPEECH))
+            {
+                Copy(st->lsp, st->lsp_old, M);
+                st->old_log_en = st->log_en;
+            }
+        } /* endif valid_data */
+
+        /* initialize gain predictor memory of other modes */
+        if (st->log_en < 0)
+        {
+            temp = ~((~st->log_en) >> 1);
+        }
+        else
+        {
+            temp = st->log_en >> 1;
+        }
+        ma_pred_init = sub(temp, 9000, pOverflow);
+
+        if (ma_pred_init > 0)
+        {
+            ma_pred_init = 0;
+        }
+        else if (ma_pred_init < -14436)
+        {
+            ma_pred_init = -14436;
+        }
+
+        predState->past_qua_en[0] = ma_pred_init;
+        predState->past_qua_en[1] = ma_pred_init;
+        predState->past_qua_en[2] = ma_pred_init;
+        predState->past_qua_en[3] = ma_pred_init;
+
+        /* past_qua_en for other modes than MR122 */
+        ma_pred_init = mult(5443, ma_pred_init, pOverflow);
+        /* scale down by factor 20*log10(2) in Q15 */
+        predState->past_qua_en_MR122[0] = ma_pred_init;
+        predState->past_qua_en_MR122[1] = ma_pred_init;
+        predState->past_qua_en_MR122[2] = ma_pred_init;
+        predState->past_qua_en_MR122[3] = ma_pred_init;
+    } /* endif sid_frame */
+
+    /* CN generation */
+    /* recompute level adjustment factor Q11             *
+     * st->log_en_adjust = 0.9*st->log_en_adjust +       *
+     *                     0.1*dtx_log_en_adjust[mode]); */
+    if (dtx_log_en_adjust[mode] > 1023)
+    {
+        temp = MAX_16;
+    }
+    else if (dtx_log_en_adjust[mode] < -1024)
+    {
+        temp = MIN_16;
+    }
+    else
+    {
+        temp = mult((Word16)((Word32)dtx_log_en_adjust[mode] << 5), 3277, pOverflow);
+    }
+
+    if (temp < 0)
+    {
+        temp = ~((~temp) >> 5);
+    }
+    else
+    {
+        temp >>= 5;
+    }
+    st->log_en_adjust = add(mult(st->log_en_adjust, 29491, pOverflow), temp, pOverflow);
+
+    /* Interpolate SID info */
+    int_fac = shl(add(1, st->since_last_sid, pOverflow), 10, pOverflow); /* Q10 */
+    int_fac = mult(int_fac, st->true_sid_period_inv, pOverflow); /* Q10 * Q15 -> Q10 */
+
+    /* Maximize to 1.0 in Q10 */
+    if (int_fac > 1024)
+    {
+        int_fac = 16384;
+    }
+    else if (int_fac < -2048)
+    {
+        int_fac = MIN_16;
+    }
+    else
+    {
+        int_fac <<= 4;      /* Q10 -> Q14 */
+    }
+
+    L_log_en_int = L_mult(int_fac, st->log_en, pOverflow); /* Q14 * Q11->Q26 */
+    for (i = M - 1; i >= 0; i--)
+    {
+        lsp_int[i] = mult(int_fac, st->lsp[i], pOverflow);/* Q14 * Q15 -> Q14 */
+    }
+
+    int_fac = sub(16384, int_fac, pOverflow); /* 1-k in Q14 */
+
+    /* (Q14 * Q11 -> Q26) + Q26 -> Q26 */
+    L_log_en_int = L_mac(L_log_en_int, int_fac, st->old_log_en, pOverflow);
+    for (i = M - 1; i >= 0; i--)
+    {
+        /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */
+        lsp_int[i] = add(lsp_int[i], mult(int_fac, st->lsp_old[i], pOverflow), pOverflow);
+
+        L_temp = ((Word32) lsp_int[i]) << 1;    /* Q14 -> Q15 */
+        if (L_temp != (Word32)((Word16) L_temp))
+        {
+            *pOverflow = 1;
+            L_temp = (Word32)((lsp_int[i] > 0) ? MAX_16 : MIN_16);
+        }
+        lsp_int[i] = (Word16) L_temp;
+    }
+
+    /* compute the amount of lsf variability */
+    lsf_variab_factor = sub(st->log_pg_mean, 2457, pOverflow); /* -0.6 in Q12 */
+    /* *0.3 Q12*Q15 -> Q12 */
+    lsf_variab_factor = sub(4096, mult(lsf_variab_factor, 9830, pOverflow), pOverflow);
+
+    /* limit to values between 0..1 in Q12 */
+    if (lsf_variab_factor > 4095)
+    {
+        lsf_variab_factor = MAX_16;
+    }
+    else if (lsf_variab_factor < 0)
+    {
+        lsf_variab_factor = 0;
+    }
+    else
+    {
+        lsf_variab_factor <<= 3; /* -> Q15 */
+    }
+
+    /* get index of vector to do variability with */
+    lsf_variab_index = pseudonoise(&st->L_pn_seed_rx, 3);
+
+    /* convert to lsf */
+    Lsp_lsf(lsp_int, lsf_int, M, pOverflow);
+
+    /* apply lsf variability */
+    Copy(lsf_int, lsf_int_variab, M);
+    for (i = M - 1; i >= 0; i--)
+    {
+        lsf_int_variab[i] = add(lsf_int_variab[i],
+                                mult(lsf_variab_factor,
+                                     st->lsf_hist_mean[i+lsf_variab_index*M], pOverflow)
+                                , pOverflow);
+    }
+
+    /* make sure that LSP's are ordered */
+    Reorder_lsf(lsf_int, LSF_GAP, M, pOverflow);
+    Reorder_lsf(lsf_int_variab, LSF_GAP, M, pOverflow);
+
+    /* copy lsf to speech decoders lsf state */
+    Copy(lsf_int, lsfState->past_lsf_q, M);
+
+    /* convert to lsp */
+    Lsf_lsp(lsf_int, lsp_int, M, pOverflow);
+    Lsf_lsp(lsf_int_variab, lsp_int_variab, M, pOverflow);
+
+    /* Compute acoeffs Q12 acoeff is used for level    *
+     * normalization and postfilter, acoeff_variab is  *
+     * used for synthesis filter                       *
+     * by doing this we make sure that the level       *
+     * in high frequenncies does not jump up and down  */
+
+    Lsp_Az(lsp_int, acoeff, pOverflow);
+    Lsp_Az(lsp_int_variab, acoeff_variab, pOverflow);
+
+    /* For use in postfilter */
+    Copy(acoeff, &A_t[0],           M + 1);
+    Copy(acoeff, &A_t[M + 1],       M + 1);
+    Copy(acoeff, &A_t[2 *(M + 1)], M + 1);
+    Copy(acoeff, &A_t[3 *(M + 1)], M + 1);
+
+    /* Compute reflection coefficients Q15 */
+    A_Refl(&acoeff[1], refl, pOverflow);
+
+    /* Compute prediction error in Q15 */
+    pred_err = MAX_16; /* 0.99997 in Q15 */
+    for (i = 0; i < M; i++)
+    {
+        L_temp = (((Word32) refl[i]) * refl[i]) >> 15;
+        if (L_temp <= 0x00007fffL)
+        {
+            temp = MAX_16 - (Word16) L_temp;
+        }
+        else
+        {
+            *pOverflow = 1;
+            temp = 0;
+        }
+        pred_err = mult(pred_err, temp, pOverflow);
+    }
+
+    /* compute logarithm of prediction gain */
+    Log2(L_deposit_l(pred_err), &log_pg_e, &log_pg_m, pOverflow);
+
+    /* convert exponent and mantissa to Word16 Q12 */
+    log_pg = shl(sub(log_pg_e, 15, pOverflow), 12, pOverflow); /* Q12 */
+    log_pg = shr(sub(0, add(log_pg, shr(log_pg_m, 15 - 12, pOverflow),
+                            pOverflow), pOverflow), 1, pOverflow);
+    st->log_pg_mean = add(mult(29491, st->log_pg_mean, pOverflow),
+                          mult(3277, log_pg, pOverflow), pOverflow);
+
+    /* Compute interpolated log energy */
+    L_log_en_int = L_shr(L_log_en_int, 10, pOverflow); /* Q26 -> Q16 */
+
+    /* Add 4 in Q16 */
+    L_log_en_int = L_add(L_log_en_int, 4 * 65536L, pOverflow);
+
+    /* subtract prediction gain */
+    L_log_en_int = L_sub(L_log_en_int, L_shl(L_deposit_l(log_pg), 4, pOverflow), pOverflow);
+
+    /* adjust level to speech coder mode */
+    L_log_en_int = L_add(L_log_en_int,
+                         L_shl(L_deposit_l(st->log_en_adjust), 5, pOverflow), pOverflow);
+
+    log_en_int_e = (Word16)(L_log_en_int >> 16);
+
+    log_en_int_m = (Word16)(L_shr(L_sub(L_log_en_int,
+                                        L_deposit_h(log_en_int_e), pOverflow), 1, pOverflow));
+    level = (Word16)(Pow2(log_en_int_e, log_en_int_m, pOverflow));  /* Q4 */
+
+    for (i = 0; i < 4; i++)
+    {
+        /* Compute innovation vector */
+        build_CN_code(&st->L_pn_seed_rx, ex, pOverflow);
+        for (j = L_SUBFR - 1; j >= 0; j--)
+        {
+            ex[j] = mult(level, ex[j], pOverflow);
+        }
+        /* Synthesize */
+        Syn_filt(acoeff_variab, ex, &synth[i * L_SUBFR], L_SUBFR,
+                 mem_syn, 1);
+
+    } /* next i */
+
+    /* reset codebook averaging variables */
+    averState->hangVar = 20;
+    averState->hangCount = 0;
+
+    if (new_state == DTX_MUTE)
+    {
+        /* mute comfort noise as it has been quite a long time since
+         * last SID update  was performed                            */
+
+        tmp_int_length = st->since_last_sid;
+
+        if (tmp_int_length > 32)
+        {
+            tmp_int_length = 32;
+        }
+        else if (tmp_int_length <= 0)
+        {
+            /* safety guard against division by zero */
+            tmp_int_length = 8;
+        }
+
+        L_temp = ((Word32) tmp_int_length) << 10;
+        if (L_temp != (Word32)((Word16) L_temp))
+        {
+            *pOverflow = 1;
+            L_temp = (Word32)((tmp_int_length > 0) ? MAX_16 : MIN_16);
+        }
+        temp = (Word16) L_temp;
+
+        st->true_sid_period_inv = div_s(1 << 10, temp);
+
+        st->since_last_sid = 0;
+        Copy(st->lsp, st->lsp_old, M);
+        st->old_log_en = st->log_en;
+        /* subtract 1/8 in Q11 i.e -6/8 dB */
+        st->log_en = sub(st->log_en, 256, pOverflow);
+    }
+
+    /* reset interpolation length timer
+     * if data has been updated.        */
+    if ((st->sid_frame != 0) &&
+            ((st->valid_data != 0) ||
+             ((st->valid_data == 0) && (st->dtxHangoverAdded) != 0)))
+    {
+        st->since_last_sid =  0;
+        st->data_updated = 1;
+    }
+
+    return;
+}
+
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: dtx_dec_activity_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type dtx_decState
+    lsf =
+        frame =
+
+ Outputs:
+    st points to an updated structure of type dtx_decState
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function updates the DTX parameters.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void dtx_dec_activity_update(dtx_decState *st,
+                             Word16 lsf[],
+                             Word16 frame[])
+{
+   Word16 i;
+
+   Word32 L_frame_en;
+   Word16 log_en_e, log_en_m, log_en;
+
+   // update lsp history
+   st->lsf_hist_ptr = add(st->lsf_hist_ptr,M);
+   if (sub(st->lsf_hist_ptr, 80) == 0)
+   {
+      st->lsf_hist_ptr = 0;
+   }
+   Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
+
+   // compute log energy based on frame energy
+   L_frame_en = 0;     // Q0
+   for (i=0; i < L_FRAME; i++)
+   {
+      L_frame_en = L_mac(L_frame_en, frame[i], frame[i]);
+   }
+   Log2(L_frame_en, &log_en_e, &log_en_m);
+
+   // convert exponent and mantissa to Word16 Q10
+   log_en = shl(log_en_e, 10);  // Q10
+   log_en = add(log_en, shr(log_en_m, 15-10));
+
+   // divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193
+   log_en = sub(log_en, 7497+1024);
+
+   // insert into log energy buffer, no division by two as  *
+    * log_en in decoder is Q11
+   st->log_en_hist_ptr = add(st->log_en_hist_ptr, 1);
+   if (sub(st->log_en_hist_ptr, DTX_HIST_SIZE) == 0)
+   {
+      st->log_en_hist_ptr = 0;
+   }
+   st->log_en_hist[st->log_en_hist_ptr] = log_en; // Q11
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void dtx_dec_activity_update(dtx_decState *st,
+                             Word16 lsf[],
+                             Word16 frame[],
+                             Flag   *pOverflow)
+{
+    Word16 i;
+
+    Word32 L_frame_en;
+    Word32 L_temp;
+    Word16 log_en_e;
+    Word16 log_en_m;
+    Word16 log_en;
+
+    /* update lsp history */
+    st->lsf_hist_ptr += M;
+
+    if (st->lsf_hist_ptr == 80)
+    {
+        st->lsf_hist_ptr = 0;
+    }
+    Copy(lsf, &st->lsf_hist[st->lsf_hist_ptr], M);
+
+    /* compute log energy based on frame energy */
+    L_frame_en = 0;     /* Q0 */
+    for (i = L_FRAME - 1; i >= 0; i--)
+    {
+        L_temp = ((Word32) frame[i]) * frame[i];
+        if (L_temp != (Word32) 0x40000000L)
+        {
+            L_temp = L_temp << 1;
+        }
+        else
+        {
+            L_temp = MAX_32;
+        }
+        L_frame_en = L_add(L_frame_en, L_temp, pOverflow);
+    }
+    Log2(L_frame_en, &log_en_e, &log_en_m, pOverflow);
+
+    /* convert exponent and mantissa to Word16 Q10 */
+    L_temp = ((Word32) log_en_e) << 10;
+
+    if (L_temp != (Word32)((Word16) L_temp))
+    {
+        *pOverflow = 1;
+        L_temp = (Word32)((log_en_e > 0) ? MAX_16 : MIN_16);
+    }
+    log_en_e = (Word16) L_temp;
+
+    if (log_en_m < 0)
+    {
+        log_en_m = ~((~log_en_m) >> 5);
+    }
+    else
+    {
+        log_en_m >>= 5;
+    }
+    log_en = add(log_en_e, log_en_m, pOverflow);
+
+    /* divide with L_FRAME i.e subtract with log2(L_FRAME) = 7.32193 */
+    log_en = sub(log_en, 7497 + 1024, pOverflow);
+
+    /* insert into log energy buffer, no division by two as  *
+    * log_en in decoder is Q11                              */
+    st->log_en_hist_ptr += 1;
+
+    if (st->log_en_hist_ptr == DTX_HIST_SIZE)
+    {
+        st->log_en_hist_ptr = 0;
+    }
+    st->log_en_hist[st->log_en_hist_ptr] = log_en; /* Q11 */
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: rx_dtx_handler
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type dtx_decState
+    frame_type = RX frame type
+
+ Returns:
+    newState = variable of type DTXStateType
+
+ Outputs:
+    st points to an updated structure of type dtx_decState
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function determines the new state of the decoder based on the frame_type
+ and sets up the decoder parameters according to newState.
+
+ Table of new SPD synthesis states
+
+                           |     previous SPD_synthesis_state
+     Incoming              |
+     frame_type            | SPEECH       | DTX           | DTX_MUTE
+     ---------------------------------------------------------------
+     RX_SPEECH_GOOD ,      |              |               |
+     RX_SPEECH_PR_DEGRADED | SPEECH       | SPEECH        | SPEECH
+     ----------------------------------------------------------------
+     RX_SPEECH_PR_BAD,     |              |               |
+     RX_SPEECH_BAD,        | SPEECH       | DTX           | DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_FIRST,         | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_UPDATE,        | DTX          | DTX           | DTX
+     ----------------------------------------------------------------
+     RX_SID_BAD,           | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_NO_DATA            | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
+                           |(class2 garb.)|               |
+     ----------------------------------------------------------------
+     RX_ONSET              | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
+                           |(class2 garb.)|               |
+     ----------------------------------------------------------------
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ dtx_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.3.0, December 12, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+enum DTXStateType rx_dtx_handler(
+                      dtx_decState *st,           // i/o : State struct
+                      enum RXFrameType frame_type // i   : Frame type
+                      )
+{
+   enum DTXStateType newState;
+   enum DTXStateType encState;
+
+   // DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH)
+   if ((sub(frame_type, RX_SID_FIRST) == 0)   ||
+       (sub(frame_type, RX_SID_UPDATE) == 0)  ||
+       (sub(frame_type, RX_SID_BAD) == 0)     ||
+       (((sub(st->dtxGlobalState, DTX) == 0) ||
+         (sub(st->dtxGlobalState, DTX_MUTE) == 0)) &&
+        ((sub(frame_type, RX_NO_DATA) == 0) ||
+         (sub(frame_type, RX_SPEECH_BAD) == 0) ||
+         (sub(frame_type, RX_ONSET) == 0))))
+   {
+      newState = DTX;
+
+      // stay in mute for these input types
+      if ((sub(st->dtxGlobalState, DTX_MUTE) == 0) &&
+          ((sub(frame_type, RX_SID_BAD) == 0) ||
+           (sub(frame_type, RX_SID_FIRST) ==  0) ||
+           (sub(frame_type, RX_ONSET) ==  0) ||
+           (sub(frame_type, RX_NO_DATA) == 0)))
+      {
+         newState = DTX_MUTE;
+      }
+
+      // evaluate if noise parameters are too old
+      // since_last_sid is reset when CN parameters have been updated
+      st->since_last_sid = add(st->since_last_sid, 1);
+
+      // no update of sid parameters in DTX for a long while
+      // Due to the delayed update of  st->since_last_sid counter
+      // SID_UPDATE frames need to be handled separately to avoid
+      // entering DTX_MUTE for late SID_UPDATE frames
+      if((sub(frame_type, RX_SID_UPDATE) != 0) &&
+         (sub(st->since_last_sid, DTX_MAX_EMPTY_THRESH) > 0))
+      {
+         newState = DTX_MUTE;
+      }
+   }
+   else
+   {
+      newState = SPEECH;
+      st->since_last_sid = 0;
+   }
+
+    // reset the decAnaElapsed Counter when receiving CNI data the first
+    // time, to robustify counter missmatch after handover
+    // this might delay the bwd CNI analysis in the new decoder slightly.
+
+   if ((st->data_updated == 0) &&
+       (sub(frame_type, RX_SID_UPDATE) == 0))
+   {
+      st->decAnaElapsedCount = 0;
+   }
+
+   // update the SPE-SPD DTX hangover synchronization
+   // to know when SPE has added dtx hangover
+   st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
+   st->dtxHangoverAdded = 0;
+
+   if ((sub(frame_type, RX_SID_FIRST) == 0)  ||
+       (sub(frame_type, RX_SID_UPDATE) == 0) ||
+       (sub(frame_type, RX_SID_BAD) == 0)    ||
+       (sub(frame_type, RX_ONSET) == 0)      ||
+       (sub(frame_type, RX_NO_DATA) == 0))
+   {
+      encState = DTX;
+
+      // In frame errors simulations RX_NO_DATA may occasionally mean that
+      // a speech packet was probably sent by the encoder,
+      // the assumed _encoder_ state should be SPEECH in such cases.
+      if((sub(frame_type, RX_NO_DATA) == 0) &&
+         (sub(newState, SPEECH) == 0))
+      {
+         encState = SPEECH;
+      }
+
+      // Note on RX_ONSET operation differing from RX_NO_DATA operation:
+      // If a  RX_ONSET is received in the decoder (by "accident")
+      // it is still most likely that the encoder  state
+      // for the "ONSET frame" was DTX.
+
+   }
+   else
+   {
+      encState = SPEECH;
+   }
+
+   if (sub(encState, SPEECH) == 0)
+   {
+      st->dtxHangoverCount = DTX_HANG_CONST;
+   }
+   else
+   {
+      if (sub(st->decAnaElapsedCount, DTX_ELAPSED_FRAMES_THRESH) > 0)
+      {
+         st->dtxHangoverAdded = 1;
+         st->decAnaElapsedCount = 0;
+         st->dtxHangoverCount = 0;
+      }
+      else if (st->dtxHangoverCount == 0)
+      {
+         st->decAnaElapsedCount = 0;
+      }
+      else
+      {
+         st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
+      }
+   }
+
+   if (sub(newState, SPEECH) != 0)
+   {
+      // DTX or DTX_MUTE
+      // CN data is not in a first SID, first SIDs are marked as SID_BAD
+      //  but will do backwards analysis if a hangover period has been added
+      // according to the state machine above
+
+      st->sid_frame = 0;
+      st->valid_data = 0;
+
+      if (sub(frame_type, RX_SID_FIRST) == 0)
+      {
+         st->sid_frame = 1;
+      }
+      else if (sub(frame_type, RX_SID_UPDATE) == 0)
+      {
+         st->sid_frame = 1;
+         st->valid_data = 1;
+      }
+      else if (sub(frame_type, RX_SID_BAD) == 0)
+      {
+         st->sid_frame = 1;
+         st->dtxHangoverAdded = 0; // use old data
+      }
+   }
+
+   return newState;
+   // newState is used by both SPEECH AND DTX synthesis routines
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+enum DTXStateType rx_dtx_handler(
+    dtx_decState *st,           /* i/o : State struct     */
+    enum RXFrameType frame_type,/* i   : Frame type       */
+    Flag *pOverflow)
+{
+    enum DTXStateType newState;
+    enum DTXStateType encState;
+
+
+    /* DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH) */
+
+    if ((frame_type == RX_SID_FIRST)   ||
+            (frame_type == RX_SID_UPDATE)  ||
+            (frame_type == RX_SID_BAD)     ||
+            (((st->dtxGlobalState == DTX) || (st->dtxGlobalState == DTX_MUTE)) &&
+             ((frame_type == RX_NO_DATA) || (frame_type == RX_SPEECH_BAD) ||
+              (frame_type == RX_ONSET))))
+    {
+        newState = DTX;
+
+        /* stay in mute for these input types */
+
+        if ((st->dtxGlobalState == DTX_MUTE) &&
+                ((frame_type == RX_SID_BAD) ||
+                 (frame_type == RX_SID_FIRST) ||
+                 (frame_type == RX_ONSET) ||
+                 (frame_type == RX_NO_DATA)))
+        {
+            newState = DTX_MUTE;
+        }
+
+        /* evaluate if noise parameters are too old                     */
+        /* since_last_sid is reset when CN parameters have been updated */
+        st->since_last_sid = add(st->since_last_sid, 1, pOverflow);
+
+        /* no update of sid parameters in DTX for a long while      */
+        /* Due to the delayed update of  st->since_last_sid counter */
+        /* SID_UPDATE frames need to be handled separately to avoid */
+        /* entering DTX_MUTE for late SID_UPDATE frames             */
+        if ((frame_type != RX_SID_UPDATE) &&
+                (st->since_last_sid > DTX_MAX_EMPTY_THRESH))
+        {
+            newState = DTX_MUTE;
+        }
+    }
+    else
+    {
+        newState = SPEECH;
+        st->since_last_sid = 0;
+    }
+
+    /*
+    reset the decAnaElapsed Counter when receiving CNI data the first
+    time, to robustify counter missmatch after handover
+    this might delay the bwd CNI analysis in the new decoder slightly.
+    */
+
+    if ((st->data_updated == 0) &&
+            (frame_type == RX_SID_UPDATE))
+    {
+        st->decAnaElapsedCount = 0;
+    }
+
+    /* update the SPE-SPD DTX hangover synchronization */
+    /* to know when SPE has added dtx hangover         */
+    st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1, pOverflow);
+    st->dtxHangoverAdded = 0;
+
+    if ((frame_type == RX_SID_FIRST)  ||
+            (frame_type == RX_SID_UPDATE) ||
+            (frame_type == RX_SID_BAD)    ||
+            (frame_type == RX_ONSET) ||
+            (frame_type == RX_NO_DATA))
+    {
+        encState = DTX;
+
+        /*
+         In frame errors simulations RX_NO_DATA may occasionally mean that
+         a speech packet was probably sent by the encoder,
+         the assumed _encoder_ state should be SPEECH in such cases.
+        */
+        if ((frame_type == RX_NO_DATA) &&
+                (newState == SPEECH))
+        {
+            encState = SPEECH;
+        }
+
+        /*
+         Note on RX_ONSET operation differing from RX_NO_DATA operation:
+         If a  RX_ONSET is received in the decoder (by "accident")
+         it is still most likely that the encoder  state
+         for the "ONSET frame" was DTX.
+        */
+    }
+    else
+    {
+        encState = SPEECH;
+    }
+
+
+    if (encState == SPEECH)
+    {
+        st->dtxHangoverCount = DTX_HANG_CONST;
+    }
+    else
+    {
+
+        if (st->decAnaElapsedCount > DTX_ELAPSED_FRAMES_THRESH)
+        {
+            st->dtxHangoverAdded = 1;
+            st->decAnaElapsedCount = 0;
+            st->dtxHangoverCount = 0;
+        }
+        else if (st->dtxHangoverCount == 0)
+        {
+            st->decAnaElapsedCount = 0;
+        }
+        else
+        {
+            st->dtxHangoverCount -= 1;
+        }
+    }
+
+    if (newState != SPEECH)
+    {
+        /* DTX or DTX_MUTE
+         * CN data is not in a first SID, first SIDs are marked as SID_BAD
+         *  but will do backwards analysis if a hangover period has been added
+         *  according to the state machine above
+        */
+
+        st->sid_frame = 0;
+        st->valid_data = 0;
+
+        if (frame_type == RX_SID_FIRST)
+        {
+            st->sid_frame = 1;
+        }
+        else if (frame_type == RX_SID_UPDATE)
+        {
+            st->sid_frame = 1;
+            st->valid_data = 1;
+        }
+        else if (frame_type == RX_SID_BAD)
+        {
+            st->sid_frame = 1;
+            st->dtxHangoverAdded = 0; /* use old data */
+        }
+    }
+
+    /* newState is used by both SPEECH AND DTX synthesis routines */
+    return(newState);
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.h b/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.h
new file mode 100644
index 0000000..2b5a614
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/dtx_dec.h
@@ -0,0 +1,191 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/dtx_dec.h
+
+     Date: 02/06/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+    File             : dtx_dec.h
+    Purpose          : Decode comfort noice when in DTX
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DTX_DEC_H
+#define DTX_DEC_H
+#define dtx_dec_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "d_plsf.h"
+#include "gc_pred.h"
+#include "c_g_aver.h"
+#include "frame.h"
+#include "dtx_common_def.h"
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    enum DTXStateType {SPEECH = 0, DTX, DTX_MUTE};
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 since_last_sid;
+        Word16 true_sid_period_inv;
+        Word16 log_en;
+        Word16 old_log_en;
+        Word32 L_pn_seed_rx;
+        Word16 lsp[M];
+        Word16 lsp_old[M];
+
+        Word16 lsf_hist[M*DTX_HIST_SIZE];
+        Word16 lsf_hist_ptr;
+        Word16 lsf_hist_mean[M*DTX_HIST_SIZE];
+        Word16 log_pg_mean;
+        Word16 log_en_hist[DTX_HIST_SIZE];
+        Word16 log_en_hist_ptr;
+
+        Word16 log_en_adjust;
+
+        Word16 dtxHangoverCount;
+        Word16 decAnaElapsedCount;
+
+        Word16 sid_frame;
+        Word16 valid_data;
+        Word16 dtxHangoverAdded;
+
+        enum DTXStateType dtxGlobalState;     /* contains previous state */
+        /* updated in main decoder */
+
+        Word16 data_updated;      /* marker to know if CNI data is ever renewed */
+
+    } dtx_decState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*
+     *  Function    : dtx_dec_reset
+     *  Purpose     : Resets state memory
+     *  Returns     : 0 on success
+     */
+    Word16 dtx_dec_reset(dtx_decState *st);
+
+    /*
+     *  Function    : dtx_dec
+     *  Purpose     :
+     *  Description :
+     */
+    void dtx_dec(
+        dtx_decState *st,                /* i/o : State struct                    */
+        Word16 mem_syn[],                /* i/o : AMR decoder state               */
+        D_plsfState* lsfState,           /* i/o : decoder lsf states              */
+        gc_predState* predState,         /* i/o : prediction states               */
+        Cb_gain_averageState* averState, /* i/o : CB gain average states          */
+        enum DTXStateType new_state,     /* i   : new DTX state                   */
+        enum Mode mode,                  /* i   : AMR mode                        */
+        Word16 parm[],                   /* i   : Vector of synthesis parameters  */
+        Word16 synth[],                  /* o   : synthesised speech              */
+        Word16 A_t[],                    /* o   : decoded LP filter in 4 subframes*/
+        Flag   *pOverflow
+    );
+
+    void dtx_dec_activity_update(dtx_decState *st,
+                                 Word16 lsf[],
+                                 Word16 frame[],
+                                 Flag   *pOverflow);
+
+    /*
+     *  Function    : rx_dtx_handler
+     *  Purpose     : reads the frame type and checks history
+     *  Description : to decide what kind of DTX/CNI action to perform
+     */
+    enum DTXStateType rx_dtx_handler(dtx_decState *st,           /* i/o : State struct */
+                                     enum RXFrameType frame_type,/* i   : Frame type   */
+                                     Flag *pOverflow);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* DEC_AMR_H_ */
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ec_gains.cpp b/media/libstagefright/codecs/amrnb/dec/src/ec_gains.cpp
new file mode 100644
index 0000000..e73db62
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ec_gains.cpp
@@ -0,0 +1,842 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/ec_gain.c
+ Funtions:
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed the functions ec_gain_code_init, ec_gain_pitch_init,
+ ech_gain_code_exit, and ec_gain_pitch_exit.
+
+ The ec_gains related structures are no longer dynamically allocated.
+
+ Description: Updated include files and input/output sections.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Added #ifdef __cplusplus around extern'ed table.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ These modules execute the code book gains for error concealment. This module
+ contains the init, reset, exit, and "main" functions in this process.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "ec_gains.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "gmed_n.h"
+#include "gc_pred.h"
+#include "basic_op.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here. Include conditional
+    ; compile variables also.
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; Variable declaration - defined here and used outside this module
+    ----------------------------------------------------------------------------*/
+
+    extern const Word16 qua_gain_pitch[];
+    extern const Word16 qua_gain_code[];
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_code_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  state = pointer to a pointer to a structure containing code state data of
+          stucture type ec_gain_codeState
+
+ Outputs:
+    None.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function resets the state data for the ec_gain module.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ None
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int ec_gain_code_reset (ec_gain_codeState *state)
+{
+  Word16 i;
+
+  if (state == (ec_gain_codeState *) NULL){
+      // fprintf(stderr, "ec_gain_code_reset: invalid parameter\n");
+      return -1;
+  }
+
+  for ( i = 0; i < 5; i++)
+      state->gbuf[i] = 1;
+  state->past_gain_code = 0;
+  state->prev_gc = 1;
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 ec_gain_code_reset(ec_gain_codeState *state)
+{
+    Word16 i;
+
+    if (state == (ec_gain_codeState *) NULL)
+    {
+        /* fprintf(stderr, "ec_gain_code_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    for (i = 0; i < 5; i++)
+        state->gbuf[i] = 1;
+    state->past_gain_code = 0;
+    state->prev_gc = 1;
+
+    return 0;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_code
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  st = pointer to a pointer to a structure containing code state data of
+       stucture type ec_gain_codeState
+  pred_state = pointer to MA predictor state of type gc_predState
+  state  = state of the state machine of type Word16
+  gain_code = pointer to decoded innovation gain of type Word16
+  pOverflow = pointer to overflow indicator of type Flag
+
+ Outputs:
+  st = pointer to a pointer to a structure containing code state data of
+       stucture type ec_gain_codeState
+  pred_state = pointer to MA predictor state of type gc_predState
+  pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+This function does error concealment using the codebook. Call this function
+only in BFI (instead of normal gain decoding function).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    static const Word16 cdown[7] =
+    {
+        32767, 32112, 32112, 32112,
+        32112, 32112, 22937
+    };
+
+    Word16 tmp;
+    Word16 qua_ener_MR122;
+    Word16 qua_ener;
+
+    // calculate median of last five gain values
+    tmp = gmed_n (st->gbuf,5);
+
+    // new gain = minimum(median, past_gain) * cdown[state]
+    if (sub (tmp, st->past_gain_code) > 0)
+    {
+        tmp = st->past_gain_code;
+    }
+    tmp = mult (tmp, cdown[state]);
+    *gain_code = tmp;
+
+    // update table of past quantized energies with average of
+    // current values
+
+    gc_pred_average_limited(pred_state, &qua_ener_MR122, &qua_ener);
+    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void ec_gain_code(
+    ec_gain_codeState *st,    /* i/o : State struct                     */
+    gc_predState *pred_state, /* i/o : MA predictor state               */
+    Word16 state,             /* i   : state of the state machine       */
+    Word16 *gain_code,        /* o   : decoded innovation gain          */
+    Flag   *pOverflow
+)
+{
+    static const Word16 cdown[7] =
+    {
+        32767, 32112, 32112, 32112,
+        32112, 32112, 22937
+    };
+
+    Word16 tmp;
+    Word16 qua_ener_MR122;
+    Word16 qua_ener;
+
+    /* calculate median of last five gain values */
+    tmp = gmed_n(st->gbuf, 5);
+
+    /* new gain = minimum(median, past_gain) * cdown[state] */
+    if (sub(tmp, st->past_gain_code, pOverflow) > 0)
+    {
+        tmp = st->past_gain_code;
+    }
+    tmp = mult(tmp, cdown[state], pOverflow);
+    *gain_code = tmp;
+
+    /* update table of past quantized energies with average of
+     * current values
+     */
+    gc_pred_average_limited(pred_state, &qua_ener_MR122, &qua_ener, pOverflow);
+    gc_pred_update(pred_state, qua_ener_MR122, qua_ener);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_code_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  st = pointer to a pointer to a structure containing code state data of
+       stucture type ec_gain_codeState
+  bfi = a flag that indicates if the frame is bad of type Word16
+  prev_bf = a flag that indicates if the previous frame was bad of type Word16
+  gain_code = pointer to decoded innovation gain of type Word16
+  pOverflow = pointer to overflow indicator of type Flag
+
+ Outputs:
+  st = pointer to a pointer to a structure containing code state data of
+       stucture type ec_gain_codeState
+  gain_code = pointer to decoded innovation gain of type Word16
+  pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Purpose     : update the codebook gain concealment state;
+                limit gain_code if the previous frame was bad
+                Call this function always after decoding (or concealing)
+                the gain
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    Word16 i;
+
+    // limit gain_code by previous good gain if previous frame was bad
+    if (bfi == 0)
+    {
+        if (prev_bf != 0)
+        {
+            if (sub (*gain_code, st->prev_gc) > 0)
+            {
+                *gain_code = st->prev_gc;
+            }
+        }
+        st->prev_gc = *gain_code;
+    }
+
+    // update EC states: previous gain, gain buffer
+    st->past_gain_code = *gain_code;
+
+    for (i = 1; i < 5; i++)
+    {
+        st->gbuf[i - 1] = st->gbuf[i];
+    }
+    st->gbuf[4] = *gain_code;
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void ec_gain_code_update(
+    ec_gain_codeState *st,    /* i/o : State struct                     */
+    Word16 bfi,               /* i   : flag: frame is bad               */
+    Word16 prev_bf,           /* i   : flag: previous frame was bad     */
+    Word16 *gain_code,        /* i/o : decoded innovation gain          */
+    Flag   *pOverflow
+)
+{
+    Word16 i;
+
+    /* limit gain_code by previous good gain if previous frame was bad */
+    if (bfi == 0)
+    {
+        if (prev_bf != 0)
+        {
+            if (sub(*gain_code, st->prev_gc, pOverflow) > 0)
+            {
+                *gain_code = st->prev_gc;
+            }
+        }
+        st->prev_gc = *gain_code;
+    }
+
+    /* update EC states: previous gain, gain buffer */
+    st->past_gain_code = *gain_code;
+
+    for (i = 1; i < 5; i++)
+    {
+        st->gbuf[i - 1] = st->gbuf[i];
+    }
+    st->gbuf[4] = *gain_code;
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_pitch
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  st = pointer to a pointer to a structure containing code
+       state data of stucture type ec_gain_pitchState
+  state = state of the state machine of type Word16
+  pOverflow = pointer to overflow indicator of type Flag
+
+  Outputs:
+  state = pointer to a pointer to a structure containing code
+          state data of stucture type ec_gain_pitchState
+  gain_pitch = pointer to pitch gain (Q14) of type Word16
+  pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function conceals the error using code gain implementation in this
+ function.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+    static const Word16 pdown[7] =
+    {
+        32767, 32112, 32112, 26214,
+        9830, 6553, 6553
+    };
+
+    Word16 tmp;
+
+    // calculate median of last five gains
+    tmp = gmed_n (st->pbuf, 5);
+
+    // new gain = minimum(median, past_gain) * pdown[state]
+    if (sub (tmp, st->past_gain_pit) > 0)
+    {
+        tmp = st->past_gain_pit;
+    }
+    *gain_pitch = mult (tmp, pdown[state]);
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void ec_gain_pitch(
+    ec_gain_pitchState *st, /* i/o : state variables                   */
+    Word16 state,           /* i   : state of the state machine        */
+    Word16 *gain_pitch,     /* o   : pitch gain (Q14)                  */
+    Flag   *pOverflow
+)
+{
+    static const Word16 pdown[7] =
+    {
+        32767, 32112, 32112, 26214,
+        9830, 6553, 6553
+    };
+
+    Word16 tmp;
+
+    /* calculate median of last five gains */
+    tmp = gmed_n(st->pbuf, 5);
+
+    /* new gain = minimum(median, past_gain) * pdown[state] */
+    if (sub(tmp, st->past_gain_pit, pOverflow) > 0)
+    {
+        tmp = st->past_gain_pit;
+    }
+    *gain_pitch = mult(tmp, pdown[state], pOverflow);
+}
+
+/****************************************************************************/
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_pitch_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  state = state of the state machine of type Word16
+  pOverflow = pointer to overflow indicator of type Flag
+
+  Outputs:
+  state = pointer to a pointer to a structure containing code
+          state data of stucture type ec_gain_pitchState
+  pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Function:   ec_gain_pitch_reset
+ Purpose:    Resets state memory
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int ec_gain_pitch_reset (ec_gain_pitchState *state)
+{
+  Word16 i;
+
+  if (state == (ec_gain_pitchState *) NULL){
+      // fprintf(stderr, "ec_gain_pitch_reset: invalid parameter\n");
+      return -1;
+  }
+
+  for(i = 0; i < 5; i++)
+      state->pbuf[i] = 1640;
+  state->past_gain_pit = 0;
+  state->prev_gp = 16384;
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+Word16 ec_gain_pitch_reset(ec_gain_pitchState *state)
+{
+    Word16 i;
+
+    if (state == (ec_gain_pitchState *) NULL)
+    {
+        /* fprintf(stderr, "ec_gain_pitch_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    for (i = 0; i < 5; i++)
+        state->pbuf[i] = 1640;
+    state->past_gain_pit = 0;
+    state->prev_gp = 16384;
+
+    return 0;
+}
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ec_gain_pitch_update
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+  st = pointer to a pointer to a structure containing code
+       state data of stucture type ec_gain_pitchState
+  bfi = flag indicating the frame is bad of type Word16
+  prev_bf = flag indicating the previous frame was bad of type Word16
+  gain_pitch = pointer to pitch gain of type Word16
+  pOverflow = pointer to overflow indicator of type Flag
+
+  Outputs:
+  state = pointer to a pointer to a structure containing code
+          state data of stucture type ec_gain_pitchState
+  gain_pitch = pointer to pitch gain of type Word16
+  pOverflow = 1 if there is an overflow else it is zero.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Purpose     : update the pitch gain concealment state;
+                limit gain_pitch if the previous frame was bad
+                Call this function always after decoding (or concealing)
+                the gain
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ec_gain.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    Word16 i;
+
+    if (bfi == 0)
+    {
+        if (prev_bf != 0)
+        {
+            if (sub (*gain_pitch, st->prev_gp) > 0)
+            {
+                *gain_pitch = st->prev_gp;
+            }
+        }
+        st->prev_gp = *gain_pitch;
+    }
+
+    st->past_gain_pit = *gain_pitch;
+
+    if (sub (st->past_gain_pit, 16384) > 0)  // if (st->past_gain_pit > 1.0)
+    {
+        st->past_gain_pit = 16384;
+    }
+    for (i = 1; i < 5; i++)
+    {
+        st->pbuf[i - 1] = st->pbuf[i];
+    }
+    st->pbuf[4] = st->past_gain_pit;
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+void ec_gain_pitch_update(
+    ec_gain_pitchState *st, /* i/o : state variables                   */
+    Word16 bfi,             /* i   : flag: frame is bad                */
+    Word16 prev_bf,         /* i   : flag: previous frame was bad      */
+    Word16 *gain_pitch,     /* i/o : pitch gain                        */
+    Flag   *pOverflow
+)
+{
+    Word16 i;
+
+    if (bfi == 0)
+    {
+        if (prev_bf != 0)
+        {
+            if (sub(*gain_pitch, st->prev_gp, pOverflow) > 0)
+            {
+                *gain_pitch = st->prev_gp;
+            }
+        }
+        st->prev_gp = *gain_pitch;
+    }
+
+    st->past_gain_pit = *gain_pitch;
+
+    if (sub(st->past_gain_pit, 16384, pOverflow) > 0)
+        /* if (st->past_gain_pit > 1.0) */
+    {
+        st->past_gain_pit = 16384;
+    }
+    for (i = 1; i < 5; i++)
+    {
+        st->pbuf[i - 1] = st->pbuf[i];
+    }
+    st->pbuf[4] = st->past_gain_pit;
+}
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ec_gains.h b/media/libstagefright/codecs/amrnb/dec/src/ec_gains.h
new file mode 100644
index 0000000..e05a0af
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ec_gains.h
@@ -0,0 +1,209 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/ec_gains.h
+
+     Date: 01/28/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : ec_gains.c
+      Purpose:         : Error concealment for pitch and codebook gains
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _EC_GAINS_H_
+#define _EC_GAINS_H_
+#define ec_gains_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "gc_pred.h"
+
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 pbuf[5];
+        Word16 past_gain_pit;
+        Word16 prev_gp;
+    } ec_gain_pitchState;
+
+    typedef struct
+    {
+        Word16 gbuf[5];
+        Word16 past_gain_code;
+        Word16 prev_gc;
+    } ec_gain_codeState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*
+     *  Function    : ec_gain_code_reset
+     *  Purpose     : Resets state memory
+     *
+     */
+    Word16 ec_gain_code_reset(
+        ec_gain_codeState *state
+    );
+
+
+    /*
+     *  Function    : ec_gain_code
+     *  Purpose     : conceal the codebook gain
+     *                Call this function only in BFI (instead of normal gain
+     *                decoding function)
+     */
+    void ec_gain_code(
+        ec_gain_codeState *st,    /* i/o : State struct                     */
+        gc_predState *pred_state, /* i/o : MA predictor state               */
+        Word16 state,             /* i   : state of the state machine       */
+        Word16 *gain_code,        /* o   : decoded innovation gain          */
+        Flag   *pOverflow
+    );
+
+    /*
+     *  Function    : ec_gain_code_update
+     *  Purpose     : update the codebook gain concealment state;
+     *                limit gain_code if the previous frame was bad
+     *                Call this function always after decoding (or concealing)
+     *                the gain
+     */
+    void ec_gain_code_update(
+        ec_gain_codeState *st,    /* i/o : State struct                     */
+        Word16 bfi,               /* i   : flag: frame is bad               */
+        Word16 prev_bf,           /* i   : flag: previous frame was bad     */
+        Word16 *gain_code,        /* i/o : decoded innovation gain          */
+        Flag   *pOverflow
+    );
+
+
+    /*
+     *  Function:   ec_gain_pitch_reset
+     *  Purpose:    Resets state memory
+     */
+    Word16 ec_gain_pitch_reset(
+        ec_gain_pitchState *state
+    );
+
+    /*
+     *  Function    : ec_gain_pitch_exit
+     *  Purpose     : The memory used for state memory is freed
+     */
+    void ec_gain_pitch_exit(
+        ec_gain_pitchState **state
+    );
+
+    /*
+     *  Function    : ec_gain_pitch
+     *  Purpose     : conceal the pitch gain
+     *                Call this function only in BFI (instead of normal gain
+     *                decoding function)
+     */
+    void ec_gain_pitch(
+        ec_gain_pitchState *st, /* i/o : state variables                   */
+        Word16 state,           /* i   : state of the state machine        */
+        Word16 *gain_pitch,     /* o   : pitch gain (Q14)                  */
+        Flag   *pOverflow
+    );
+
+    /*
+     *  Function    : ec_gain_pitch_update
+     *  Purpose     : update the pitch gain concealment state;
+     *                limit gain_pitch if the previous frame was bad
+     *                Call this function always after decoding (or concealing)
+     *                the gain
+     */
+    void ec_gain_pitch_update(
+        ec_gain_pitchState *st, /* i/o : state variables                   */
+        Word16 bfi,             /* i   : flag: frame is bad                */
+        Word16 prev_bf,         /* i   : flag: previous frame was bad      */
+        Word16 *gain_pitch,     /* i/o : pitch gain                        */
+        Flag   *pOverflow
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _EC_GAINS_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.cpp b/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.cpp
new file mode 100644
index 0000000..f18054b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.cpp
@@ -0,0 +1,219 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/ex_ctrl.c
+ Funtions: ex_ctrl
+
+     Date: 02/08/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "ex_ctrl.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "copy.h"
+#include "set_zero.h"
+#include "gmed_n.h"
+#include "sqrt_l.h"
+#include "basic_op.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ex_ctrl
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+ excitation = pointer to current subframe excitation of type Word16
+ excEnergy = Exc. Energy, sqrt(totEx*totEx) of type Word16
+ exEnergyHist = pointer to history of subframe energies of type Word16
+ voicedHangover = # of fr. after last voiced fr  of type Word16
+ carefulFlag = restrict dynamic in scaling of type Word16
+ pOverflow = pointer to overflow indicator
+
+ Outputs:
+ pOverflow = 1 if overflow exists in the math functions called by this function.
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Function    : Ex_ctrl
+ Purpose     : Charaterice synthesis speech and detect background noise
+ Returns     : background noise decision; 0 = no bgn, 1 = bgn
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ex_ctrl.c, 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+Word16 Ex_ctrl(Word16 excitation[],    /*i/o: Current subframe excitation   */
+               Word16 excEnergy,      /* i : Exc. Energy, sqrt(totEx*totEx)*/
+               Word16 exEnergyHist[], /* i : History of subframe energies  */
+               Word16 voicedHangover, /* i : # of fr. after last voiced fr.*/
+               Word16 prevBFI,        /* i : Set i previous BFI            */
+               Word16 carefulFlag,    /* i : Restrict dymamic in scaling   */
+               Flag   *pOverflow
+              )
+{
+    Word16 i, exp;
+    Word16 testEnergy, scaleFactor, avgEnergy, prevEnergy;
+    Word32 t0;
+
+    /* get target level */
+    avgEnergy = gmed_n(exEnergyHist, 9);
+
+    prevEnergy = shr(add(exEnergyHist[7], exEnergyHist[8], pOverflow) , 1, pOverflow);
+
+    if (exEnergyHist[8] < prevEnergy)
+    {
+        prevEnergy = exEnergyHist[8];
+    }
+
+    /* upscaling to avoid too rapid energy rises  for some cases */
+    if ((excEnergy < avgEnergy) && (excEnergy > 5))
+    {
+        testEnergy = shl(prevEnergy, 2, pOverflow);  /* testEnergy = 4*prevEnergy; */
+
+        if ((voicedHangover < 7) || prevBFI != 0)
+        {
+            /* testEnergy = 3*prevEnergy */
+            testEnergy = sub(testEnergy, prevEnergy, pOverflow);
+        }
+
+        if (avgEnergy > testEnergy)
+        {
+            avgEnergy = testEnergy;
+        }
+
+        /* scaleFactor=avgEnergy/excEnergy in Q0 (const 29 below)*/
+        exp = norm_s(excEnergy);
+        excEnergy = shl(excEnergy, exp, pOverflow);
+        excEnergy = div_s((Word16) 16383, excEnergy);
+        t0 = L_mult(avgEnergy, excEnergy, pOverflow);
+        t0 = L_shr(t0, sub(20, exp, pOverflow), pOverflow);
+        /* const=30 for t0 in Q0, 20 for Q10 */
+        if (t0 > 32767)
+        {
+            t0 = 32767; /* saturate  */
+        }
+        scaleFactor = extract_l(t0);
+
+        /* test if scaleFactor > 3.0 */
+        if (carefulFlag != 0 && (scaleFactor > 3072))
+        {
+            scaleFactor = 3072;
+        }
+
+        /* scale the excitation by scaleFactor */
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            t0 = L_mult(scaleFactor, excitation[i], pOverflow);
+            t0 = L_shr(t0, 11, pOverflow);
+            excitation[i] = extract_l(t0);
+        }
+    }
+
+    return 0;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.h b/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.h
new file mode 100644
index 0000000..11c632e
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ex_ctrl.h
@@ -0,0 +1,131 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/ex_ctrl.h
+
+     Date: 02/08/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+     File             : ex_ctrl.h
+     Purpose          : Excitation Control module in background noise
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef ex_ctrl_h
+#define ex_ctrl_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define L_ENERGYHIST 60
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    /*
+     *  Function    : Ex_ctrl
+     *  Purpose     : Charaterice synthesis speech and detect background noise
+     *  Returns     : background noise decision; 0 = bgn, 1 = no bgn
+     */
+    Word16 Ex_ctrl(Word16 excitation[],    /*i/o: Current subframe excitation   */
+    Word16 excEnergy,      /* i : Exc. Energy, sqrt(totEx*totEx)*/
+    Word16 exEnergyHist[], /* i : History of subframe energies  */
+    Word16 voicedHangover, /* i : # of fr. after last voiced fr.*/
+    Word16 prevBFI,        /* i : Set i previous BFI            */
+    Word16 carefulFlag,    /* i : Restrict dymamic in scaling   */
+    Flag   *pOverflow
+                  );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ex_ctrl_h_ */
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/gsmamr_dec.h b/media/libstagefright/codecs/amrnb/dec/src/gsmamr_dec.h
new file mode 100644
index 0000000..673a94a
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/gsmamr_dec.h
@@ -0,0 +1,187 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm-amr/c/include/gsmamr_dec.h
+
+     Date: 09/10/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Adding comments and removing some tables as per review comments.
+
+ Description: Replace enum Mode with enum Frame_Type_3GPP and updated function
+              prototype of AMRDecode().
+
+ Description: Added back the enum Mode type definition, removed RXFrameType
+              type definition, and updated AMRDecode and GSMInitDecode function
+              prototypes.
+
+ Description: Added #defines for WMF and IF2. Updated AMRDecode function
+              prototype.
+
+ Description: Removed enum Mode type definition and updated AMRDecode function
+              prototype.
+
+ Description: Renamed WMF and IF2 to AMR_WMF and AMR_IF2, respectively. Added
+              #define for AMR_ETS format.
+
+ Description: Rename input format defines to make it unique to the decoder.
+
+ Description: Added comment to describe L_FRAME.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description: Included file "typedefs.h" to avoid re-declaring similar typedef
+              this for OSCL-ed compatibility
+
+ Description: Included file "gsm_amr_typedefs.h" and eliminated re-definition
+              of types UWord8, Word8, Word16
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This header contains all the necessary information needed to allow the gsm amr
+ decoder library to be used properly upon release.
+
+------------------------------------------------------------------------------
+*/
+#ifndef _GSMAMR_DEC_H_
+#define _GSMAMR_DEC_H_
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "gsm_amr_typedefs.h"
+#include "pvamrnbdecoder_api.h"
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ----------------------------------------------------------------------------*/
+    /* Number of 13-bit linear PCM samples per 20 ms frame */
+    /* L_FRAME = (8 kHz) * (20 msec) = 160 samples         */
+#define L_FRAME     160
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    enum Frame_Type_3GPP
+    {
+        AMR_475 = 0,        /* 4.75 kbps    */
+        AMR_515,            /* 5.15 kbps    */
+        AMR_59,             /* 5.9 kbps     */
+        AMR_67,             /* 6.7 kbps     */
+        AMR_74,             /* 7.4 kbps     */
+        AMR_795,            /* 7.95 kbps    */
+        AMR_102,            /* 10.2 kbps    */
+        AMR_122,            /* 12.2 kbps    */
+        AMR_SID,            /* GSM AMR DTX  */
+        GSM_EFR_SID,        /* GSM EFR DTX  */
+        TDMA_EFR_SID,       /* TDMA EFR DTX */
+        PDC_EFR_SID,        /* PDC EFR DTX  */
+        FOR_FUTURE_USE1,    /* Unused 1     */
+        FOR_FUTURE_USE2,    /* Unused 2     */
+        FOR_FUTURE_USE3,    /* Unused 3     */
+        AMR_NO_DATA
+    };      /* No data      */
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ----------------------------------------------------------------------------*/
+    /*
+     * This function allocates memory for filter structure and initializes state
+     * memory used by the GSM AMR decoder. This function returns zero. It will
+     * return negative one if there is an error.
+     */
+    Word16 GSMInitDecode(void **state_data,
+                         Word8 *id);
+
+    /*
+     * AMRDecode steps into the part of the library that decodes the raw data
+     * speech bits for the decoding process. It returns the address offset of
+     * the next frame to be decoded.
+     */
+    Word16 AMRDecode(
+        void                      *state_data,
+        enum Frame_Type_3GPP      frame_type,
+        UWord8                    *speech_bits_ptr,
+        Word16                    *raw_pcm_buffer,
+        Word16                    input_format
+    );
+
+    /*
+     * This function resets the state memory used by the GSM AMR decoder. This
+     * function returns zero. It will return negative one if there is an error.
+     */
+    Word16 Speech_Decode_Frame_reset(void *state_data);
+
+    /*
+     * This function frees up the memory used for the state memory of the
+     * GSM AMR decoder.
+     */
+    void GSMDecodeFrameExit(void **state_data);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _GSMAMR_DEC_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.cpp b/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.cpp
new file mode 100644
index 0000000..733c8b8
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.cpp
@@ -0,0 +1,196 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Pathname: ./audio/gsm-amr/c/src/if2_to_ets.c
+ Funtions: if2_to_ets
+
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "frame_type_3gpp.h"
+#include "if2_to_ets.h"
+#include "typedef.h"
+#include "bitreorder_tab.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: if2_to_ets
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
+    if2_input_ptr   = pointer to input encoded speech bits in IF2 format (Word8)
+    ets_output_ptr  = pointer to output encoded speech bits in ETS format (Word16)
+
+ Outputs:
+    ets_output_ptr  = pointer to encoded speech bits in the ETS format (Word16)
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs a transformation on the data buffers. It converts the
+ data format from IF2 to ETS. IF2 is the storage format where the frame type
+ is in the first four bits of the first byte. The upper four bits of that byte
+ contain the first four encoded speech bits for the frame. The following bytes
+ contain the rest of the encoded speech bits. The final byte has padded zeros
+ to make the frame byte aligned. ETS format has the encoded speech
+ bits each separate with only one bit stored in each word.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void if2_to_ets(
+    enum Frame_Type_3GPP frame_type_3gpp,
+    UWord8   *if2_input_ptr,
+    Word16   *ets_output_ptr)
+{
+
+    Word16 i;
+    Word16 j;
+    Word16 x = 0;
+
+    /*
+     * The following section of code accesses bits in the IF2 method of
+     * bit ordering. Each bit is given its own location in the buffer pointed
+     * to by ets_output_ptr. The bits (for modes less than AMR_SID) are
+     * reordered using the tables in bitreorder.c before the data is stored
+     * into the buffer pointed to by ets_output_ptr.
+     */
+
+    if (frame_type_3gpp < AMR_SID)
+    {
+        for (j = 4; j < 8; j++)
+        {
+            ets_output_ptr[reorderBits[frame_type_3gpp][x++]] =
+                (if2_input_ptr[0] >> j) & 0x01;
+        }
+        for (i = 1; i < numCompressedBytes[frame_type_3gpp]; i++)
+        {
+            for (j = 0; j < 8; j++)
+            {
+                if (x >= numOfBits[frame_type_3gpp])
+                {
+                    break;
+                }
+                ets_output_ptr[reorderBits[frame_type_3gpp][x++]] =
+                    (if2_input_ptr[i] >> j) & 0x01;
+            }
+        }
+    }
+    else
+    {
+        for (j = 4; j < 8; j++)
+        {
+            ets_output_ptr[x++] =
+                (if2_input_ptr[0] >> j) & 0x01;
+        }
+        for (i = 1; i < numCompressedBytes[frame_type_3gpp]; i++)
+        {
+            for (j = 0; j < 8; j++)
+            {
+                ets_output_ptr[x++] =
+                    (if2_input_ptr[i] >> j) & 0x01;
+            }
+        }
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.h b/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.h
new file mode 100644
index 0000000..490565d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/if2_to_ets.h
@@ -0,0 +1,124 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/include/src/if2_to_ets.h
+
+     Date: 01/22/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed mode to frame_type_3gpp
+
+ Description: Updated template to make it build in Symbian. Updated copyright
+              year.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the if2_to_ets function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef IF2_TO_ETS_H
+#define IF2_TO_ETS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "frame_type_3gpp.h"
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void if2_to_ets(enum Frame_Type_3GPP frame_type_3gpp,
+    UWord8   *if2_input_ptr,
+    Word16   *ets_output_ptr);
+
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp
new file mode 100644
index 0000000..c5aefe4
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/int_lsf.cpp
@@ -0,0 +1,315 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/int_lsf.c
+
+     Date: 04/20/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Put file into template and first pass at optimization.
+
+ Description: Made changes based on comments from the review meeting. Used
+    pointers instead of index addressing in the arrays.
+
+ Description: Added type definition to the input/output section. Fixed tabs.
+              Deleted pseudo-code.
+
+ Description: Synchronized file with UMTS versin 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Modified FOR loops to count down.
+              2. Made some cosmetic changes in the Pseudo-code section.
+
+ Description: Changed to pass in overflow flag pointer to the add() routine.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "int_lsf.h"
+#include    "typedef.h"
+#include    "basic_op.h"
+#include    "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Int_lsf
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    lsf_old = LSF vector at the 4th SF of past frame (Word16)
+    lsf_new = LSF vector at the 4th SF of present frame (Word16)
+    i_subfr = Current subframe (equal to 0,40,80 or 120) (Word16)
+    lsf_out = interpolated LSF parameters for current subframe (Word16)
+
+ Outputs:
+    lsf_out   = new interpolated LSF parameters for current subframe
+    pOverflow = pointer of type Flag * to overflow indicator.
+
+ Returns:
+    None.
+
+ Global Variables Used:
+    None.
+
+ Local Variables Needed:
+    None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function interpolates the LSFs for selected subframe.
+ The 20 ms speech frame is divided into 4 subframes. The LSFs are
+ interpolated at the 1st, 2nd and 3rd subframe and only forwarded
+ at the 4th subframe.
+
+                      |------|------|------|------|
+                         sf1    sf2    sf3    sf4
+                   F0                          F1
+
+                 sf1:   3/4 F0 + 1/4 F1         sf3:   1/4 F0 + 3/4 F1
+                 sf2:   1/2 F0 + 1/2 F1         sf4:       F1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ int_lsf.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void Int_lsf(
+    Word16 lsf_old[], // i : LSF vector at the 4th SF of past frame
+    Word16 lsf_new[], // i : LSF vector at the 4th SF of present frame
+    Word16 i_subfr,   // i : Pointer to current sf (equal to 0,40,80 or 120)
+    Word16 lsf_out[]  // o : interpolated LSF parameters for current sf
+)
+{
+    Word16 i;
+
+    if ( i_subfr == 0 )
+    {
+       for (i = 0; i < M; i++) {
+          lsf_out[i] = add(sub(lsf_old[i], shr(lsf_old[i], 2)),
+                           shr(lsf_new[i], 2));
+       }
+    }
+    else if ( sub(i_subfr, 40) == 0 )
+    {
+       for (i = 0; i < M; i++) {
+          lsf_out[i] = add(shr(lsf_old[i],1), shr(lsf_new[i], 1) );
+       }
+    }
+    else if ( sub(i_subfr, 80) == 0 )
+    {
+       for (i = 0; i < M; i++) {
+          lsf_out[i] = add(shr(lsf_old[i], 2),
+                           sub(lsf_new[i], shr(lsf_new[i], 2)));
+       }
+    }
+    else if ( sub(i_subfr, 120) == 0 )
+    {
+       for (i = 0; i < M; i++) {
+          lsf_out[i] = lsf_new[i];
+       }
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Int_lsf(
+    Word16 lsf_old[], /* i : LSF vector at the 4th SF of past frame         */
+    Word16 lsf_new[], /* i : LSF vector at the 4th SF of present frame      */
+    Word16 i_subfr,   /* i : Current sf (equal to 0,40,80 or 120)           */
+    Word16 lsf_out[], /* o : interpolated LSF parameters for current sf     */
+    Flag  *pOverflow  /* o : flag set if overflow occurs                    */
+)
+{
+    register Word16 i;
+    register Word16 temp1;
+    register Word16 temp2;
+
+    if (i_subfr == 0)
+    {
+        for (i = M - 1; i >= 0; i--)
+        {
+            if (*(lsf_old + i) < 0)
+            {
+                temp1 = ~(~(*(lsf_old + i)) >> 2);
+            }
+            else
+            {
+                temp1 = *(lsf_old + i) >> 2;
+            }
+            if (*(lsf_new + i) < 0)
+            {
+                temp2 = ~(~(*(lsf_new + i)) >> 2);
+            }
+            else
+            {
+                temp2 = *(lsf_new + i) >> 2;
+            }
+            *(lsf_out + i) = add((Word16)(*(lsf_old + i) - temp1),
+                                 (Word16)temp2,
+                                 pOverflow);
+        }
+    }
+
+    else if (i_subfr == 40)
+    {
+        for (i = M - 1; i >= 0; i--)
+        {
+            if (*(lsf_old + i) < 0)
+            {
+                temp1 = ~(~(*(lsf_old + i)) >> 1);
+            }
+            else
+            {
+                temp1 = *(lsf_old + i) >> 1;
+            }
+            if (*(lsf_new + i) < 0)
+            {
+                temp2 = ~(~(*(lsf_new + i)) >> 1);
+            }
+            else
+            {
+                temp2 = *(lsf_new + i) >> 1;
+            }
+            *(lsf_out + i) = add(
+                                 temp1,
+                                 temp2,
+                                 pOverflow);
+        }
+    }
+
+    else if (i_subfr == 80)
+    {
+        for (i = M - 1; i >= 0; i--)
+        {
+            if (*(lsf_old + i) < 0)
+            {
+                temp1 = ~(~(*(lsf_old + i)) >> 2);
+            }
+            else
+            {
+                temp1 = *(lsf_old + i) >> 2;
+            }
+            if (*(lsf_new + i) < 0)
+            {
+                temp2 = ~(~(*(lsf_new + i)) >> 2);
+            }
+            else
+            {
+                temp2 = *(lsf_new + i) >> 2;
+            }
+            *(lsf_out + i) = add((Word16)temp1,
+                                 (Word16)(*(lsf_new + i) - temp2),
+                                 pOverflow);
+
+        }
+    }
+
+    else if (i_subfr == 120)
+    {
+        for (i = M - 1; i >= 0; i--)
+        {
+            *(lsf_out + i) = *(lsf_new + i);
+        }
+    }
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.cpp b/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.cpp
new file mode 100644
index 0000000..9b65c7a
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.cpp
@@ -0,0 +1,317 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/lsp_avg.c
+ Functions:
+
+
+     Date: 04/14/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed the functions lsp_avg_init and lsp_avg_exit.
+ The lsp_avg related structure is no longer dynamically allocated.
+
+ Also, placed code in the proper PV Software Template.
+
+ Description: Per review comments, updated the inputs/outputs section
+ for the function lsp_avg.
+
+ Description: Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description: Per review comments, I added a description of pOverflow
+ to the input/output section of the template.  I also removed an unnecessary
+ include file, <stdio.h>
+
+ Description: Removed q_plsf_5.tab from Include section and added
+              q_plsf_5_tbl.h to Include section. Changed "mean_lsf"
+              to "mean_lsf_5" in lsp_avg_reset().
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+    LSP averaging and history
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "lsp_avg.h"
+#include "basic_op.h"
+#include "oper_32b.h"
+#include "copy.h"
+#include "q_plsf_5_tbl.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp_avg_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to structure of type lsp_avgState
+
+ Outputs:
+    fields of the structure pointed to by state are initialized.
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+lsp_avg.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int lsp_avg_reset (lsp_avgState *st)
+{
+  if (st == (lsp_avgState *) NULL){
+      // fprintf(stderr, "lsp_avg_reset: invalid parameter\n");
+      return -1;
+  }
+
+  Copy(mean_lsf, &st->lsp_meanSave[0], M);
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 lsp_avg_reset(lsp_avgState *st)
+{
+    if (st == (lsp_avgState *) NULL)
+    {
+        /* fprintf(stderr, "lsp_avg_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    Copy(mean_lsf_5, &st->lsp_meanSave[0], M);
+
+    return 0;
+}
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: lsp_avg
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st  = pointer to structure of type lsp_avgState
+    lsp = pointer to Word16, which reflects the state of the state machine
+
+ Outputs:
+    st = pointer to structure of type lsp_avgState
+    pOverflow = pointer to type Flag -- overflow indicator
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+lsp_avg.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+void lsp_avg (
+    lsp_avgState *st,         // i/o : State struct                 Q15
+    Word16 *lsp               // i   : state of the state machine   Q15
+)
+{
+    Word16 i;
+    Word32 L_tmp;            // Q31
+
+    for (i = 0; i < M; i++) {
+
+       // mean = 0.84*mean
+       L_tmp = L_deposit_h(st->lsp_meanSave[i]);
+       L_tmp = L_msu(L_tmp, EXPCONST, st->lsp_meanSave[i]);
+
+       // Add 0.16 of newest LSPs to mean
+       L_tmp = L_mac(L_tmp, EXPCONST, lsp[i]);
+
+       // Save means
+       st->lsp_meanSave[i] = pv_round(L_tmp);   // Q15
+    }
+
+    return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void lsp_avg(
+    lsp_avgState *st,         /* i/o : State struct                 Q15 */
+    Word16 *lsp,              /* i   : state of the state machine   Q15 */
+    Flag   *pOverflow         /* o   : Flag set when overflow occurs    */
+)
+{
+    Word16 i;
+    Word32 L_tmp;            /* Q31 */
+
+    for (i = 0; i < M; i++)
+    {
+
+        /* mean = 0.84*mean */
+        L_tmp = L_deposit_h(st->lsp_meanSave[i]);
+        L_tmp = L_msu(L_tmp, EXPCONST, st->lsp_meanSave[i], pOverflow);
+
+        /* Add 0.16 of newest LSPs to mean */
+        L_tmp = L_mac(L_tmp, EXPCONST, lsp[i], pOverflow);
+
+        /* Save means */
+        st->lsp_meanSave[i] = pv_round(L_tmp, pOverflow);   /* Q15 */
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.h b/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.h
new file mode 100644
index 0000000..b289c08
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/lsp_avg.h
@@ -0,0 +1,136 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/lsp_avg.h
+
+     Date: 01/29/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description: Per review comments, I removed the prototype definition
+ of lsp_avg_init and lsp_avg_exit.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the lsp_avg.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef lsp_avg_h
+#define lsp_avg_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "cnst.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define EXPCONST          5243               /* 0.16 in Q15 */
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 lsp_meanSave[M];          /* Averaged LSPs saved for efficiency  */
+    } lsp_avgState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word16 lsp_avg_reset(
+        lsp_avgState *state
+    );
+
+
+    void lsp_avg(
+        lsp_avgState *st,     /* i/o : State struct                 Q15 */
+        Word16 *lsp,          /* i   : LSP vector                   Q15 */
+        Flag   *pOverflow     /* o   : Flag set when overflow occurs    */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LSP_LSF_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp
new file mode 100644
index 0000000..da5445b
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.cpp
@@ -0,0 +1,898 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/ph_disp.c
+ Functions:
+            ph_disp_reset
+            ph_disp_lock
+            ph_disp_release
+            ph_disp
+
+     Date: 04/05/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Updated file per comments gathered from Phase 2/3 review.
+
+ Description: Clarified grouping in the equation to calculated L_temp from the
+          product of state->prevCbGain and ONFACTPLUS1 in the ph_disp
+          function.
+
+ Description: Added setting of Overflow flag in inlined code.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              coding template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header file of the math functions
+              used in the file.
+
+ Description: Removed the functions ph_disp_init and ph_disp_exit.
+ The ph_disp related structure is no longer dynamically allocated.
+
+ Description: Pass in pointer to overflow flag for EPOC compatibility.
+              Change code for ph_disp() function to reflect this. Remove
+              inclusion of ph_disp.tab. This table will now be referenced
+              externally.
+
+ Description: Optimized ph_disp() to reduce clock cycle usage. Updated
+              copyright year and removed unused files in Include section.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the function that performs adaptive phase dispersion of
+ the excitation signal. The phase dispersion initialization, reset, and
+ exit functions are included in this file, as well as, the phase dispersion
+ lock and release functions.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "ph_disp.h"
+#include "typedef.h"
+#include "basic_op.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ph_disp_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type ph_dispState
+
+ Outputs:
+    Structure pointed to by state is initialized to zeros
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function resets the variables used by the phase dispersion function.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ph_disp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int ph_disp_reset (ph_dispState *state)
+{
+  Word16 i;
+
+   if (state == (ph_dispState *) NULL){
+      fprint(stderr, "ph_disp_reset: invalid parameter\n");
+      return -1;
+   }
+   for (i=0; i<PHDGAINMEMSIZE; i++)
+   {
+       state->gainMem[i] = 0;
+   }
+   state->prevState = 0;
+   state->prevCbGain = 0;
+   state->lockFull = 0;
+   state->onset = 0;          // assume no onset in start
+
+   return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 ph_disp_reset(ph_dispState *state)
+{
+    register Word16 i;
+
+    if (state == (ph_dispState *) NULL)
+    {
+        /*  fprint(stderr, "ph_disp_reset: invalid parameter\n");  */
+        return(-1);
+    }
+    for (i = 0; i < PHDGAINMEMSIZE; i++)
+    {
+        state->gainMem[i] = 0;
+    }
+    state->prevState = 0;
+    state->prevCbGain = 0;
+    state->lockFull = 0;
+    state->onset = 0;          /* assume no onset in start */
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ph_disp_lock
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type ph_dispState
+
+ Outputs:
+    lockFull field of the structure pointed to by state is set to 1
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function sets the lockFull flag to indicate a lock condition.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ph_disp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void ph_disp_lock (ph_dispState *state)
+{
+  state->lockFull = 1;
+  return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void ph_disp_lock(ph_dispState *state)
+{
+    state->lockFull = 1;
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ph_disp_release
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type ph_dispState
+
+ Outputs:
+    lockFull field of the structure pointed to by state is set to 0
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function clears the lockFull flag to indicate an unlocked state.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ph_disp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void ph_disp_release (ph_dispState *state)
+{
+  state->lockFull = 0;
+  return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void ph_disp_release(ph_dispState *state)
+{
+    state->lockFull = 0;
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: ph_disp
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type ph_dispState
+    mode = codec mode (enum Mode)
+    x = LTP excitation signal buffer (Word16)
+    cbGain = codebook gain (Word16)
+    ltpGain = LTP gain (Word16)
+    inno = innovation buffer (Word16)
+    pitch_fac = pitch factor used to scale the LTP excitation (Word16)
+    tmp_shift = shift factor applied to sum of scaled LTP excitation and
+                innovation before rounding (Word16)
+    pOverflow = pointer to overflow indicator (Flag)
+
+ Outputs:
+    structure pointed to by state contains the updated gainMem array,
+      prevState, prevCbGain, and onset fields
+    x buffer contains the new excitation signal
+    inno buffer contains the new innovation signal
+    pOverflow -> 1 if there is overflow
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs adaptive phase dispersion, i.e., forming of total
+ excitation for the synthesis part of the decoder.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ph_disp.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void ph_disp (
+      ph_dispState *state, // i/o     : State struct
+      enum Mode mode,      // i       : codec mode
+      Word16 x[],          // i/o Q0  : in:  LTP excitation signal
+                           //           out: total excitation signal
+      Word16 cbGain,       // i   Q1  : Codebook gain
+      Word16 ltpGain,      // i   Q14 : LTP gain
+      Word16 inno[],       // i/o Q13 : Innovation vector (Q12 for 12.2)
+      Word16 pitch_fac,    // i   Q14 : pitch factor used to scale the
+                                        LTP excitation (Q13 for 12.2)
+      Word16 tmp_shift     // i   Q0  : shift factor applied to sum of
+                                        scaled LTP ex & innov. before
+                                        rounding
+)
+{
+   Word16 i, i1;
+   Word16 tmp1;
+   Word32 L_temp;
+   Word16 impNr;           // indicator for amount of disp./filter used
+
+   Word16 inno_sav[L_SUBFR];
+   Word16 ps_poss[L_SUBFR];
+   Word16 j, nze, nPulse, ppos;
+   const Word16 *ph_imp;   // Pointer to phase dispersion filter
+
+   // Update LTP gain memory
+   for (i = PHDGAINMEMSIZE-1; i > 0; i--)
+   {
+       state->gainMem[i] = state->gainMem[i-1];
+   }
+   state->gainMem[0] = ltpGain;
+
+   // basic adaption of phase dispersion
+   if (sub(ltpGain, PHDTHR2LTP) < 0) {    // if (ltpGain < 0.9)
+       if (sub(ltpGain, PHDTHR1LTP) > 0)
+       {  // if (ltpGain > 0.6
+          impNr = 1; // medium dispersion
+       }
+       else
+       {
+          impNr = 0; // maximum dispersion
+       }
+   }
+   else
+   {
+      impNr = 2; // no dispersion
+   }
+
+   // onset indicator
+   // onset = (cbGain  > onFact * cbGainMem[0])
+   tmp1 = pv_round(L_shl(L_mult(state->prevCbGain, ONFACTPLUS1), 2));
+   if (sub(cbGain, tmp1) > 0)
+   {
+       state->onset = ONLENGTH;
+   }
+   else
+   {
+       if (state->onset > 0)
+       {
+           state->onset = sub (state->onset, 1);
+       }
+   }
+
+   // if not onset, check ltpGain buffer and use max phase dispersion if
+      half or more of the ltpGain-parameters say so
+   if (state->onset == 0)
+   {
+       // Check LTP gain memory and set filter accordingly
+       i1 = 0;
+       for (i = 0; i < PHDGAINMEMSIZE; i++)
+       {
+           if (sub(state->gainMem[i], PHDTHR1LTP) < 0)
+           {
+               i1 = add (i1, 1);
+           }
+       }
+       if (sub(i1, 2) > 0)
+       {
+           impNr = 0;
+       }
+
+   }
+   // Restrict decrease in phase dispersion to one step if not onset
+   if ((sub(impNr, add(state->prevState, 1)) > 0) && (state->onset == 0))
+   {
+       impNr = sub (impNr, 1);
+   }
+   // if onset, use one step less phase dispersion
+   if((sub(impNr, 2) < 0) && (state->onset > 0))
+   {
+       impNr = add (impNr, 1);
+   }
+
+   // disable for very low levels
+   if(sub(cbGain, 10) < 0)
+   {
+       impNr = 2;
+   }
+
+   if(sub(state->lockFull, 1) == 0)
+   {
+       impNr = 0;
+   }
+
+   // update static memory
+   state->prevState = impNr;
+   state->prevCbGain = cbGain;
+
+   // do phase dispersion for all modes but 12.2 and 7.4;
+   // don't modify the innovation if impNr >=2 (= no phase disp)
+   if (sub(mode, MR122) != 0 &&
+       sub(mode, MR102) != 0 &&
+       sub(mode, MR74) != 0 &&
+       sub(impNr, 2) < 0)
+   {
+       // track pulse positions, save innovation,
+          and initialize new innovation
+       nze = 0;
+       for (i = 0; i < L_SUBFR; i++)
+       {
+           if (inno[i] != 0)
+           {
+               ps_poss[nze] = i;
+               nze = add (nze, 1);
+           }
+           inno_sav[i] = inno[i];
+           inno[i] = 0;
+       }
+       // Choose filter corresponding to codec mode and dispersion criterium
+       if (sub (mode, MR795) == 0)
+       {
+           if (impNr == 0)
+           {
+               ph_imp = ph_imp_low_MR795;
+           }
+           else
+           {
+               ph_imp = ph_imp_mid_MR795;
+           }
+       }
+       else
+       {
+           if (impNr == 0)
+           {
+               ph_imp = ph_imp_low;
+           }
+           else
+           {
+               ph_imp = ph_imp_mid;
+           }
+       }
+
+       // Do phase dispersion of innovation
+       for (nPulse = 0; nPulse < nze; nPulse++)
+       {
+           ppos = ps_poss[nPulse];
+
+           // circular convolution with impulse response
+           j = 0;
+           for (i = ppos; i < L_SUBFR; i++)
+           {
+               // inno[i1] += inno_sav[ppos] * ph_imp[i1-ppos]
+               tmp1 = mult(inno_sav[ppos], ph_imp[j++]);
+               inno[i] = add(inno[i], tmp1);
+           }
+
+           for (i = 0; i < ppos; i++)
+           {
+               // inno[i] += inno_sav[ppos] * ph_imp[L_SUBFR-ppos+i]
+               tmp1 = mult(inno_sav[ppos], ph_imp[j++]);
+               inno[i] = add(inno[i], tmp1);
+           }
+       }
+   }
+
+   // compute total excitation for synthesis part of decoder
+   // (using modified innovation if phase dispersion is active)
+   for (i = 0; i < L_SUBFR; i++)
+   {
+       // x[i] = gain_pit*x[i] + cbGain*code[i];
+       L_temp = L_mult (        x[i],    pitch_fac);
+                                                // 12.2: Q0 * Q13
+                                                //  7.4: Q0 * Q14
+       L_temp = L_mac  (L_temp, inno[i], cbGain);
+                                                // 12.2: Q12 * Q1
+                                                //  7.4: Q13 * Q1
+       L_temp = L_shl (L_temp, tmp_shift);                 // Q16
+       x[i] = pv_round (L_temp);
+   }
+
+   return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void ph_disp(
+    ph_dispState *state,    /* i/o     : State struct                       */
+    enum Mode mode,         /* i       : codec mode                         */
+    Word16 x[],             /* i/o Q0  : in:  LTP excitation signal         */
+    /*           out: total excitation signal       */
+    Word16 cbGain,          /* i   Q1  : Codebook gain                      */
+    Word16 ltpGain,         /* i   Q14 : LTP gain                           */
+    Word16 inno[],          /* i/o Q13 : Innovation vector (Q12 for 12.2)   */
+    Word16 pitch_fac,       /* i   Q14 : pitch factor used to scale the
+                                         LTP excitation (Q13 for 12.2)      */
+    Word16 tmp_shift,       /* i   Q0  : shift factor applied to sum of
+                                         scaled LTP ex & innov. before
+                                         rounding                           */
+    Flag   *pOverflow       /* i/o     : oveflow indicator                  */
+)
+{
+    register Word16 i, i1;
+    register Word16 tmp1;
+    Word32 L_temp;
+    Word32 L_temp2;
+    Word16 impNr;           /* indicator for amount of disp./filter used */
+
+    Word16 inno_sav[L_SUBFR];
+    Word16 ps_poss[L_SUBFR];
+    register Word16 nze, nPulse;
+    Word16 ppos;
+    const Word16 *ph_imp;   /* Pointer to phase dispersion filter */
+
+    Word16 *p_inno;
+    Word16 *p_inno_sav;
+    Word16 *p_x;
+    const Word16 *p_ph_imp;
+    Word16 c_inno_sav;
+
+    /* Update LTP gain memory */
+    /* Unrolled FOR loop below since PHDGAINMEMSIZE is assumed to stay */
+    /* the same.                                                       */
+    /* for (i = PHDGAINMEMSIZE-1; i > 0; i--)                          */
+    /* {                                                               */
+    /*    state->gainMem[i] = state->gainMem[i-1];                     */
+    /* }                                                               */
+    state->gainMem[4] = state->gainMem[3];
+    state->gainMem[3] = state->gainMem[2];
+    state->gainMem[2] = state->gainMem[1];
+    state->gainMem[1] = state->gainMem[0];
+    state->gainMem[0] = ltpGain;
+
+    /* basic adaption of phase dispersion */
+
+    if (ltpGain < PHDTHR2LTP)    /* if (ltpGain < 0.9) */
+    {
+        if (ltpGain > PHDTHR1LTP)
+        {  /* if (ltpGain > 0.6 */
+            impNr = 1; /* medium dispersion */
+        }
+        else
+        {
+            impNr = 0; /* maximum dispersion */
+        }
+    }
+    else
+    {
+        impNr = 2; /* no dispersion */
+    }
+
+    /* onset indicator */
+    /* onset = (cbGain  > onFact * cbGainMem[0]) */
+
+    L_temp = ((Word32) state->prevCbGain * ONFACTPLUS1) << 1;
+
+    /* (L_temp << 2) calculation with saturation check */
+    if (L_temp > (Word32) 0X1fffffffL)
+    {
+        *pOverflow = 1;
+        L_temp = MAX_32;
+    }
+    else if (L_temp < (Word32) 0xe0000000L)
+    {
+        *pOverflow = 1;
+        L_temp = MIN_32;
+    }
+    else
+    {
+        L_temp <<= 2;
+    }
+
+    tmp1 = pv_round(L_temp, pOverflow);
+
+    if (cbGain > tmp1)
+    {
+        state->onset = ONLENGTH;
+    }
+    else
+    {
+
+        if (state->onset > 0)
+        {
+            state->onset -= 1;
+        }
+    }
+
+    /* if not onset, check ltpGain buffer and use max phase dispersion if
+       half or more of the ltpGain-parameters say so */
+    if (state->onset == 0)
+    {
+        /* Check LTP gain memory and set filter accordingly */
+        i1 = 0;
+        for (i = 0; i < PHDGAINMEMSIZE; i++)
+        {
+            if (state->gainMem[i] < PHDTHR1LTP)
+            {
+                i1 += 1;
+            }
+        }
+
+        if (i1 > 2)
+        {
+            impNr = 0;
+        }
+    }
+    /* Restrict decrease in phase dispersion to one step if not onset */
+    if ((impNr > ((state->prevState) + 1)) && (state->onset == 0))
+    {
+        impNr -= 1;
+    }
+
+    /* if onset, use one step less phase dispersion */
+    if ((impNr < 2) && (state->onset > 0))
+    {
+        impNr += 1;
+    }
+
+    /* disable for very low levels */
+    if (cbGain < 10)
+    {
+        impNr = 2;
+    }
+
+    if (state->lockFull == 1)
+    {
+        impNr = 0;
+    }
+
+    /* update static memory */
+    state->prevState = impNr;
+    state->prevCbGain = cbGain;
+
+    /* do phase dispersion for all modes but 12.2 and 7.4;
+       don't modify the innovation if impNr >=2 (= no phase disp) */
+    if ((mode != MR122) && (mode != MR102) && (mode != MR74) && (impNr < 2))
+    {
+        /* track pulse positions, save innovation,
+           and initialize new innovation          */
+        nze = 0;
+        p_inno = &inno[0];
+        p_inno_sav = &inno_sav[0];
+
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            if (*(p_inno) != 0)
+            {
+                ps_poss[nze] = i;
+                nze += 1;
+            }
+            *(p_inno_sav++) = *(p_inno);
+            *(p_inno++) = 0;
+        }
+
+        /* Choose filter corresponding to codec mode and dispersion criterium */
+        if (mode == MR795)
+        {
+            if (impNr == 0)
+            {
+                ph_imp = ph_imp_low_MR795;
+            }
+            else
+            {
+                ph_imp = ph_imp_mid_MR795;
+            }
+        }
+        else
+        {
+            if (impNr == 0)
+            {
+                ph_imp = ph_imp_low;
+            }
+            else
+            {
+                ph_imp = ph_imp_mid;
+            }
+        }
+
+        /* Do phase dispersion of innovation */
+        for (nPulse = 0; nPulse < nze; nPulse++)
+        {
+            ppos = ps_poss[nPulse];
+
+            /* circular convolution with impulse response */
+            c_inno_sav = inno_sav[ppos];
+            p_inno = &inno[ppos];
+            p_ph_imp = ph_imp;
+
+            for (i = ppos; i < L_SUBFR; i++)
+            {
+                /* inno[i1] += inno_sav[ppos] * ph_imp[i1-ppos] */
+                L_temp = ((Word32) c_inno_sav * *(p_ph_imp++)) >> 15;
+                tmp1 = (Word16) L_temp;
+                *(p_inno) = add(*(p_inno), tmp1, pOverflow);
+                p_inno += 1;
+            }
+
+            p_inno = &inno[0];
+
+            for (i = 0; i < ppos; i++)
+            {
+                /* inno[i] += inno_sav[ppos] * ph_imp[L_SUBFR-ppos+i] */
+                L_temp = ((Word32) c_inno_sav * *(p_ph_imp++)) >> 15;
+                tmp1 = (Word16) L_temp;
+                *(p_inno) = add(*(p_inno), tmp1, pOverflow);
+                p_inno += 1;
+            }
+        }
+    }
+
+    /* compute total excitation for synthesis part of decoder
+       (using modified innovation if phase dispersion is active) */
+    p_inno = &inno[0];
+    p_x = &x[0];
+
+    for (i = 0; i < L_SUBFR; i++)
+    {
+        /* x[i] = gain_pit*x[i] + cbGain*code[i]; */
+        L_temp = L_mult(x[i], pitch_fac, pOverflow);
+        /* 12.2: Q0 * Q13 */
+        /*  7.4: Q0 * Q14 */
+        L_temp2 = ((Word32) * (p_inno++) * cbGain) << 1;
+        L_temp = L_add(L_temp, L_temp2, pOverflow);
+        /* 12.2: Q12 * Q1 */
+        /*  7.4: Q13 * Q1 */
+        L_temp = L_shl(L_temp, tmp_shift, pOverflow);                  /* Q16 */
+        *(p_x++) = pv_round(L_temp, pOverflow);
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/ph_disp.h b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.h
new file mode 100644
index 0000000..58e2e4f
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/ph_disp.h
@@ -0,0 +1,192 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/ph_disp.h
+
+
+     Date: 08/11/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template. Updated function prototype declaration for
+              ph_disp(). Included extern declaration for ph_imp_low_MR795 and
+              ph_imp_mid_MR795
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the Phase dispersion of excitation signal ph_disp() function.
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PH_DISP_H
+#define PH_DISP_H "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "typedef.h"
+#include    "mode.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define PHDGAINMEMSIZE 5
+#define PHDTHR1LTP     9830  /* 0.6 in Q14 */
+#define PHDTHR2LTP     14746 /* 0.9 in Q14 */
+#define ONFACTPLUS1    16384 /* 2.0 in Q13   */
+#define ONLENGTH 2
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern Word16 ph_imp_low_MR795[];
+    extern Word16 ph_imp_mid_MR795[];
+    extern Word16 ph_imp_low[];
+    extern Word16 ph_imp_mid[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 gainMem[PHDGAINMEMSIZE];
+        Word16 prevState;
+        Word16 prevCbGain;
+        Word16 lockFull;
+        Word16 onset;
+    } ph_dispState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:   ph_disp_reset
+    ;  Purpose:    Initializes state memory
+    ;
+    ----------------------------------------------------------------------------*/
+    Word16 ph_disp_reset(ph_dispState *state);
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:   ph_disp_exit
+    ;  Purpose:    The memory used for state memory is freed
+    ;
+    ----------------------------------------------------------------------------*/
+    void ph_disp_exit(ph_dispState **state);
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:   ph_disp_lock
+    ;  Purpose:    mark phase dispersion as locked in state struct
+    ;
+    ----------------------------------------------------------------------------*/
+    void ph_disp_lock(ph_dispState *state);
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:   ph_disp_release
+    ;  Purpose:    mark phase dispersion as unlocked in state struct
+    ;
+    ----------------------------------------------------------------------------*/
+
+    void ph_disp_release(ph_dispState *state);
+
+    /*----------------------------------------------------------------------------
+    ;
+    ;  Function:   ph_disp
+    ;  Purpose:    perform phase dispersion according to the specified codec
+    ;              mode and computes total excitation for synthesis part
+    ;              if decoder
+    ;
+    ----------------------------------------------------------------------------*/
+
+    void ph_disp(
+        ph_dispState *state,    /* i/o     : State struct                       */
+        enum Mode mode,         /* i       : codec mode                         */
+        Word16 x[],             /* i/o Q0  : in:  LTP excitation signal         */
+        /*           out: total excitation signal       */
+        Word16 cbGain,          /* i   Q1  : Codebook gain                      */
+        Word16 ltpGain,         /* i   Q14 : LTP gain                           */
+        Word16 inno[],          /* i/o Q13 : Innovation vector (Q12 for 12.2)   */
+        Word16 pitch_fac,       /* i   Q14 : pitch factor used to scale the
+                                         LTP excitation (Q13 for 12.2)      */
+        Word16 tmp_shift,       /* i   Q0  : shift factor applied to sum of
+                                         scaled LTP ex & innov. before
+                                         rounding                           */
+        Flag   *pOverflow       /* i/o     : oveflow indicator                  */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PH_DISP_H_ */
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp b/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp
new file mode 100644
index 0000000..ce31793
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp
@@ -0,0 +1,395 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/post_pro.c
+ Functions:
+           Post_Process_reset
+           Post_Process
+
+     Date: 04/03/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Deleted variables listed in the Local Stores Needed/Modified
+          sections. Optimized the "else" portion of the first "if"
+          statement in Post_Process function.
+
+ Description: Made grouping more explicit in the calculation of
+          signal[i] << 1 in the Post_Process function.
+
+ Description: Added setting of Overflow flag in inlined code.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header file of the math functions
+              used in the file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Updated copyright year.
+              2. Fixed typecasting issue with TI C compiler.
+              3. Used short-hand notation for math operations, e.g., "+=",
+                 in the code.
+
+ Description: Removed the functions post_pro_init and post_pro_exit.
+ The post_pro related structure is no longer dynamically allocated.
+
+ Description: Added pOverflow as a passed in variable as per changes needed
+              for the EPOC release.
+
+ Description: Optimized file to reduce clock cycle usage. Updated copyright
+              year and removed unused files in Include section.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Changed round function name to pv_round to avoid conflict with
+              round function in C standard library.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the function that performs post-processing on the output
+ speech. Post-processing include filtering the output speech through a second
+ order high pass filter with cutoff frequency of 60 Hz, and up-scaling the
+ output speech by a factor of 2. In addition to the post-processing function
+ itself, a post-processing initialization function, post-processing reset
+ function, and post-processing exit function are also included in this file.
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "post_pro.h"
+#include "typedef.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* filter coefficients (fc = 60 Hz) */
+static const Word16 b[3] = {7699, -15398, 7699};
+static const Word16 a[3] = {8192, 15836, -7667};
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Post_Process_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to a structure of type Post_ProcessState
+
+ Outputs:
+    structure pointed to by state will have all its fields initialized
+      to zero
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function initializes state memory to zero.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ post_pro.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Post_Process_reset (Post_ProcessState *state)
+{
+  if (state == (Post_ProcessState *) NULL){
+      fprint(stderr, "Post_Process_reset: invalid parameter\n");
+      return -1;
+  }
+
+  state->y2_hi = 0;
+  state->y2_lo = 0;
+  state->y1_hi = 0;
+  state->y1_lo = 0;
+  state->x0 = 0;
+  state->x1 = 0;
+
+  return 0;
+}
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Post_Process_reset(Post_ProcessState *state)
+{
+    if (state == (Post_ProcessState *) NULL)
+    {
+        /*  fprint(stderr, "Post_Process_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    state->y2_hi = 0;
+    state->y2_lo = 0;
+    state->y1_hi = 0;
+    state->y1_lo = 0;
+    state->x0 = 0;
+    state->x1 = 0;
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Post_Process
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type Post_ProcessState
+    signal = buffer containing the input signal (Word16)
+    lg = length of the input signal (Word16)
+    pOverflow = pointer to overflow indicator of type Flag
+
+ Outputs:
+    structure pointed to by st contains new filter input and output values
+    signal buffer contains the HP filtered and up-scaled input signal
+    pOverflow points to 1 if overflow occurs in the math functions called
+              else it points to 0.
+
+ Returns:
+    return_value = 0 (int)
+
+ Global Variables Used:
+    a = buffer containing filter coefficients
+    b = buffer containing filter coefficients
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs post-processing on the output speech signal. First,
+ the output speech goes through a second order high pass filter with a
+ cutoff frequency of 60 Hz. Then, the filtered output speech is multiplied
+ by a factor of 2. The algorithm implemented follows the following difference
+ equation:
+
+ y[i] = b[0]*x[i]*2 + b[1]*x[i-1]*2 + b[2]*x[i-2]*2 + a[1]*y[i-1] + a[2]*y[i-2];
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ post_pro.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Post_Process (
+    Post_ProcessState *st,  //i/o : post process state
+    Word16 signal[],        //i/o : signal
+    Word16 lg               //i   : length of signal
+    )
+{
+    Word16 i, x2;
+    Word32 L_tmp;
+
+    for (i = 0; i < lg; i++)
+    {
+        x2 = st->x1;
+        st->x1 = st->x0;
+        st->x0 = signal[i];
+
+        // y[i] = b[0]*x[i]*2 + b[1]*x[i-1]*2 + b140[2]*x[i-2]/2
+        //                    + a[1]*y[i-1] + a[2] * y[i-2];
+
+        L_tmp = Mpy_32_16 (st->y1_hi, st->y1_lo, a[1]);
+        L_tmp = L_add (L_tmp, Mpy_32_16 (st->y2_hi, st->y2_lo, a[2]));
+        L_tmp = L_mac (L_tmp, st->x0, b[0]);
+        L_tmp = L_mac (L_tmp, st->x1, b[1]);
+        L_tmp = L_mac (L_tmp, x2, b[2]);
+        L_tmp = L_shl (L_tmp, 2);
+
+        //Multiplication by two of output speech with saturation.
+        signal[i] = pv_round(L_shl(L_tmp, 1));
+
+        st->y2_hi = st->y1_hi;
+        st->y2_lo = st->y1_lo;
+        L_Extract (L_tmp, &st->y1_hi, &st->y1_lo);
+    }
+
+    return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Post_Process(
+    Post_ProcessState *st,  /* i/o : post process state                   */
+    Word16 signal[],        /* i/o : signal                               */
+    Word16 lg,              /* i   : length of signal                     */
+    Flag   *pOverflow
+)
+{
+    Word16 i, x2;
+    Word32 L_tmp;
+
+    Word16 *p_signal;
+    Word16 c_a1 = a[1];
+    Word16 c_a2 = a[2];
+    Word16 c_b0 = b[0];
+    Word16 c_b1 = b[1];
+    Word16 c_b2 = b[2];
+
+    p_signal = &signal[0];
+
+    for (i = 0; i < lg; i++)
+    {
+        x2 = st->x1;
+        st->x1 = st->x0;
+        st->x0 = *(p_signal);
+
+        /*  y[i] = b[0]*x[i]*2 + b[1]*x[i-1]*2 + b140[2]*x[i-2]/2  */
+        /*                     + a[1]*y[i-1] + a[2] * y[i-2];      */
+
+        L_tmp = ((Word32) st->y1_hi) * c_a1;
+        L_tmp += (((Word32) st->y1_lo) * c_a1) >> 15;
+        L_tmp += ((Word32) st->y2_hi) * c_a2;
+        L_tmp += (((Word32) st->y2_lo) * c_a2) >> 15;
+        L_tmp += ((Word32) st->x0) * c_b0;
+        L_tmp += ((Word32) st->x1) * c_b1;
+        L_tmp += ((Word32) x2) * c_b2;
+        L_tmp <<= 3;
+
+
+        /* Multiplication by two of output speech with saturation. */
+
+        *(p_signal++) = pv_round(L_shl(L_tmp, 1, pOverflow), pOverflow);
+
+        st->y2_hi = st->y1_hi;
+        st->y2_lo = st->y1_lo;
+
+        st->y1_hi = (Word16)(L_tmp >> 16);
+        st->y1_lo = (Word16)((L_tmp >> 1) - ((Word32) st->y1_hi << 15));
+
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/post_pro.h b/media/libstagefright/codecs/amrnb/dec/src/post_pro.h
new file mode 100644
index 0000000..85e5888
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/post_pro.h
@@ -0,0 +1,140 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/post_pro.h
+
+     Date: 02/04/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : post_pro.h
+      Purpose          : Postprocessing of output speech.
+
+                         - 2nd order high pass filtering with cut
+                           off frequency at 60 Hz.
+                         - Multiplication of output by two.
+------------------------------------------------------------------------------
+*/
+
+#ifndef _POST_PRO_H_
+#define _POST_PRO_H_
+#define post_pro_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 y2_hi;
+        Word16 y2_lo;
+        Word16 y1_hi;
+        Word16 y1_lo;
+        Word16 x0;
+        Word16 x1;
+    } Post_ProcessState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    Word16 Post_Process_reset(Post_ProcessState *st);
+    /* reset of Post processing state (i.e. set state memory to zero)
+       returns 0 on success
+     */
+    void Post_Process_exit(Post_ProcessState **st);
+    /* de-initialize Post processing state (i.e. free status struct)
+       stores NULL in *st
+     */
+
+    void Post_Process(
+        Post_ProcessState *st,  /* i/o : post process state                   */
+        Word16 signal[],        /* i/o : signal                               */
+        Word16 lg,              /* i   : lenght of signal                     */
+        Flag *pOverflow
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _POST_PRO_H_ */
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/preemph.cpp b/media/libstagefright/codecs/amrnb/dec/src/preemph.cpp
new file mode 100644
index 0000000..9864325
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/preemph.cpp
@@ -0,0 +1,272 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/preemph.c
+ Functions:
+
+     Date: 02/04/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed the functions preemphasis_init and preemphasis_exit.
+ The preemphasis related structure is no longer dynamically allocated.
+ Placed file in the appropriate PV Software Template format.
+
+ Description: Changed to accept the pOverflow flag for EPOC compatibility.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ Purpose          : Preemphasis filtering
+ Description      : Filtering through 1 - g z^-1
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "preemph.h"
+#include "typedef.h"
+#include "basic_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:  preemphasis_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- double pointer to preemphasisState
+
+ Outputs:
+    st -- double ponter to preemphasisState
+
+ Returns:
+    -1 if an error occurs
+     0 if OK
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Initializes state memory to zero
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ preemph.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 preemphasis_reset(preemphasisState *state)
+{
+    if (state == (preemphasisState *) NULL)
+    {
+        /* fprintf(stderr, "preemphasis_reset: invalid parameter\n"); */
+        return -1;
+    }
+
+    state->mem_pre = 0;
+
+    return 0;
+}
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:  preemphasis
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st -- Pointer to preemphasisState -- preemphasis filter state
+    signal -- array of type Word16 -- input signal overwritten by the output
+    g -- Word16 -- preemphasis coefficient
+    L -- Word16 -- size of filtering
+
+ Outputs:
+    st -- Pointer to preemphasisState -- preemphasis filter state
+    signal -- array of type Word16 -- input signal overwritten by the output
+    pOverflow -- pointer to type Flag -- overflow indicator
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Filtering through 1 - g z^-1
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ preemph.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+
+void preemphasis(
+    preemphasisState *st, /* (i/o) : preemphasis filter state               */
+    Word16 *signal,       /* (i/o) : input signal overwritten by the output */
+    Word16 g,             /* (i)   : preemphasis coefficient                */
+    Word16 L,             /* (i)   : size of filtering                      */
+    Flag  *pOverflow      /* (o)   : overflow indicator                     */
+)
+{
+    Word16 *p1;
+    Word16 *p2;
+    Word16 temp;
+    Word16 temp2;
+    Word16 i;
+
+    p1 = signal + L - 1;
+    p2 = p1 - 1;
+    temp = *p1;
+
+    for (i = 0; i <= L - 2; i++)
+    {
+        temp2 = mult(g, *(p2--), pOverflow);
+        *p1 = sub(*p1, temp2, pOverflow);
+
+        p1--;
+    }
+
+    temp2 = mult(g, st->mem_pre, pOverflow);
+
+    *p1 = sub(*p1, temp2, pOverflow);
+
+    st->mem_pre = temp;
+
+    return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/preemph.h b/media/libstagefright/codecs/amrnb/dec/src/preemph.h
new file mode 100644
index 0000000..20bab71
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/preemph.h
@@ -0,0 +1,140 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/include/preemph.h
+
+     Date: 02/05/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed header file in the proper template format.  Added
+ parameter pOverflow for the basic math ops.
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains all the constant definitions and prototype definitions
+ needed by the file, preemph.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef preemph_h
+#define preemph_h "$Id $"
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "typedef.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 mem_pre;          /* filter state */
+    } preemphasisState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    Word16 preemphasis_reset(preemphasisState *st);
+    /* reset of preemphasis filter (i.e. set state memory to zero)
+       returns 0 on success
+     */
+    void preemphasis_exit(preemphasisState **st);
+    /* de-initialize preemphasis filter (i.e. free status struct)
+       stores NULL in *st
+     */
+
+    void preemphasis(
+        preemphasisState *st, /* (i/o): preemphasis filter state                */
+        Word16 *signal,    /* (i/o): input signal overwritten by the output     */
+        Word16 g,          /* (i)  : preemphasis coefficient                    */
+        Word16 L,          /* (i)  : size of filtering                          */
+        Flag   *pOverflow  /* (o)  : overflow indicator                         */
+    );
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* preemph_H_ */
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp
new file mode 100644
index 0000000..0336990
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.cpp
@@ -0,0 +1,578 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/pstfilt.c
+ Functions:
+            Post_Filter_reset
+            Post_Filter
+
+     Date: 04/14/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed template used to PV coding template. First attempt at
+          optimizing C code.
+
+ Description: Updated file per comments gathered from Phase 2/3 review.
+
+ Description: Added setting of Overflow flag in inlined code.
+
+ Description: Synchronized file with UMTS version 3.2.0. Updated coding
+              template. Removed unnecessary include files.
+
+ Description: Replaced basic_op.h with the header file of the math functions
+              used in the file.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Updated copyright year.
+              2. Modified FOR loops to count down.
+              3. Fixed typecasting issue with TI C compiler.
+              4. Added "break" statement after overflow condition occurs.
+
+ Description: Removed the functions pstfilt_init and pstfilt_exit.
+ The pst_filt related structure is no longer dynamically allocated.
+
+ Description: Modified code for EPOC changes where pOverflow is passed in
+              rather than allowing overflow to be a global variable.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the function that performs adaptive post-filtering on the
+ synthesized speech. It also contains the functions that initialize, reset,
+ and exit the post-filtering function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <string.h>
+
+#include "pstfilt.h"
+#include "typedef.h"
+#include "mode.h"
+#include "basicop_malloc.h"
+#include "basic_op.h"
+#include "weight_a.h"
+#include "residu.h"
+#include "copy.h"
+#include "syn_filt.h"
+#include "preemph.h"
+#include "cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define L_H 22  /* size of truncated impulse response of A(z/g1)/A(z/g2) */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* Spectral expansion factors */
+static const Word16 gamma3_MR122[M] =
+{
+    22938, 16057, 11240, 7868, 5508,
+    3856, 2699, 1889, 1322, 925
+};
+
+static const Word16 gamma3[M] =
+{
+    18022, 9912, 5451, 2998, 1649, 907, 499, 274, 151, 83
+};
+
+static const Word16 gamma4_MR122[M] =
+{
+    24576, 18432, 13824, 10368, 7776,
+    5832, 4374, 3281, 2461, 1846
+};
+
+static const Word16 gamma4[M] =
+{
+    22938, 16057, 11240, 7868, 5508, 3856, 2699, 1889, 1322, 925
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Post_Filter_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to structure of type Post_FilterState
+
+ Outputs:
+    fields of the structure pointed to by state is initialized to zero
+
+ Returns:
+    return_value = 0, if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function initializes the state memory used by the Post_Filter function
+ to zero.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ pstfilt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Post_Filter_reset (Post_FilterState *state)
+{
+  if (state == (Post_FilterState *) NULL){
+      fprintf(stderr, "Post_Filter_reset: invalid parameter\n");
+      return -1;
+  }
+
+  Set_zero (state->mem_syn_pst, M);
+  Set_zero (state->res2, L_SUBFR);
+  Set_zero (state->synth_buf, L_FRAME + M);
+  agc_reset(state->agc_state);
+  preemphasis_reset(state->preemph_state);
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 Post_Filter_reset(Post_FilterState *state)
+{
+    if (state == (Post_FilterState *) NULL)
+    {
+        /*fprintf(stderr, "Post_Filter_reset: invalid parameter\n");  */
+        return(-1);
+    }
+
+    memset(state->mem_syn_pst, 0, sizeof(Word16)*M);
+    memset(state->res2, 0, sizeof(Word16)*L_SUBFR);
+    memset(state->synth_buf, 0, sizeof(Word16)*(L_FRAME + M));
+    agc_reset(&(state->agc_state));
+    preemphasis_reset(&(state->preemph_state));
+
+    return(0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Post_Filter
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to a structure of type Post_FilterState
+    mode = AMR mode
+    syn = pointer to a buffer containing synthesized speech; upon
+          exiting this function, it will contain the post-filtered
+          synthesized speech
+    Az_4 = pointer to the interpolated LPC parameters for all subframes
+    pOverflow = pointer to overflow indicator of type Flag
+
+ Outputs:
+    fields of the structure pointed to by st contains the updated field
+      values
+    syn buffer contains the post-filtered synthesized speech
+    pOverflow = 1 if overflow occurrs in the math functions called else
+                it is zero.
+
+ Returns:
+    return_value = 0 (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the post-filtering on the synthesized speech. The
+ post-filtering process is described as follows:
+ (1) inverse filtering of syn[] through A(z/0.7) to get res2[]
+ (2) tilt compensation filtering; 1 - MU*k*z^-1
+ (3) synthesis filtering through 1/A(z/0.75)
+ (4) adaptive gain control
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ pstfilt.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Post_Filter (
+    Post_FilterState *st, // i/o : post filter states
+    enum Mode mode,       // i   : AMR mode
+    Word16 *syn,          // i/o : synthesis speech (postfiltered is output)
+    Word16 *Az_4          // i   : interpolated LPC parameters in all subfr.
+)
+{
+     *-------------------------------------------------------------------*
+     *           Declaration of parameters                               *
+     *-------------------------------------------------------------------*
+
+    Word16 Ap3[MP1], Ap4[MP1];  // bandwidth expanded LP parameters
+    Word16 *Az;                 // pointer to Az_4:
+                                //  LPC parameters in each subframe
+    Word16 i_subfr;             // index for beginning of subframe
+    Word16 h[L_H];
+
+    Word16 i;
+    Word16 temp1, temp2;
+    Word32 L_tmp;
+    Word16 *syn_work = &st->synth_buf[M];
+
+
+     *-----------------------------------------------------*
+     * Post filtering                                      *
+     *-----------------------------------------------------*
+
+    Copy (syn, syn_work , L_FRAME);
+
+    Az = Az_4;
+
+    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+    {
+       // Find weighted filter coefficients Ap3[] and ap[4]
+
+       if (sub(mode, MR122) == 0 || sub(mode, MR102) == 0)
+       {
+          Weight_Ai (Az, gamma3_MR122, Ap3);
+          Weight_Ai (Az, gamma4_MR122, Ap4);
+       }
+       else
+       {
+          Weight_Ai (Az, gamma3, Ap3);
+          Weight_Ai (Az, gamma4, Ap4);
+       }
+
+       // filtering of synthesis speech by A(z/0.7) to find res2[]
+
+       Residu (Ap3, &syn_work[i_subfr], st->res2, L_SUBFR);
+
+       // tilt compensation filter
+
+       // impulse response of A(z/0.7)/A(z/0.75)
+
+       Copy (Ap3, h, M + 1);
+       Set_zero (&h[M + 1], L_H - M - 1);
+       Syn_filt (Ap4, h, h, L_H, &h[M + 1], 0);
+
+       // 1st correlation of h[]
+
+       L_tmp = L_mult (h[0], h[0]);
+       for (i = 1; i < L_H; i++)
+       {
+          L_tmp = L_mac (L_tmp, h[i], h[i]);
+       }
+       temp1 = extract_h (L_tmp);
+
+       L_tmp = L_mult (h[0], h[1]);
+       for (i = 1; i < L_H - 1; i++)
+       {
+          L_tmp = L_mac (L_tmp, h[i], h[i + 1]);
+       }
+       temp2 = extract_h (L_tmp);
+
+       if (temp2 <= 0)
+       {
+          temp2 = 0;
+       }
+       else
+       {
+          temp2 = mult (temp2, MU);
+          temp2 = div_s (temp2, temp1);
+       }
+
+       preemphasis (st->preemph_state, st->res2, temp2, L_SUBFR);
+
+       // filtering through  1/A(z/0.75)
+
+       Syn_filt (Ap4, st->res2, &syn[i_subfr], L_SUBFR, st->mem_syn_pst, 1);
+
+       // scale output to input
+
+       agc (st->agc_state, &syn_work[i_subfr], &syn[i_subfr],
+            AGC_FAC, L_SUBFR);
+
+       Az += MP1;
+    }
+
+    // update syn_work[] buffer
+
+    Copy (&syn_work[L_FRAME - M], &syn_work[-M], M);
+
+    return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void Post_Filter(
+    Post_FilterState *st, /* i/o : post filter states                        */
+    enum Mode mode,       /* i   : AMR mode                                  */
+    Word16 *syn,          /* i/o : synthesis speech (postfiltered is output) */
+    Word16 *Az_4,         /* i   : interpolated LPC parameters in all subfr. */
+    Flag   *pOverflow
+)
+{
+    Word16 Ap3[MP1];
+    Word16 Ap4[MP1];            /* bandwidth expanded LP parameters */
+    Word16 *Az;                 /* pointer to Az_4:                 */
+    /*  LPC parameters in each subframe */
+    register Word16 i_subfr;    /* index for beginning of subframe  */
+    Word16 h[L_H];
+
+    register Word16 i;
+    Word16 temp1;
+    Word16 temp2;
+    Word32 L_tmp;
+    Word32 L_tmp2;
+    Word16 *syn_work = &st->synth_buf[M];
+
+
+    /*-----------------------------------------------------*
+     * Post filtering                                      *
+     *-----------------------------------------------------*/
+
+    Copy(syn, syn_work , L_FRAME);
+
+    Az = Az_4;
+
+    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+    {
+        /* Find weighted filter coefficients Ap3[] and ap[4] */
+
+        if (mode == MR122 || mode == MR102)
+        {
+            Weight_Ai(Az, gamma3_MR122, Ap3);
+            Weight_Ai(Az, gamma4_MR122, Ap4);
+        }
+        else
+        {
+            Weight_Ai(Az, gamma3, Ap3);
+            Weight_Ai(Az, gamma4, Ap4);
+        }
+
+        /* filtering of synthesis speech by A(z/0.7) to find res2[] */
+
+        Residu(Ap3, &syn_work[i_subfr], st->res2, L_SUBFR);
+
+        /* tilt compensation filter */
+
+        /* impulse response of A(z/0.7)/A(z/0.75) */
+
+        Copy(Ap3, h, M + 1);
+        memset(&h[M + 1], 0, sizeof(Word16)*(L_H - M - 1));
+        Syn_filt(Ap4, h, h, L_H, &h[M + 1], 0);
+
+        /* 1st correlation of h[] */
+
+        L_tmp = 0;
+
+        for (i = L_H - 1; i >= 0; i--)
+        {
+            L_tmp2 = ((Word32) h[i]) * h[i];
+
+            if (L_tmp2 != (Word32) 0x40000000L)
+            {
+                L_tmp2 = L_tmp2 << 1;
+            }
+            else
+            {
+                *pOverflow = 1;
+                L_tmp2 = MAX_32;
+                break;
+            }
+
+            L_tmp = L_add(L_tmp, L_tmp2, pOverflow);
+        }
+        temp1 = (Word16)(L_tmp >> 16);
+
+        L_tmp = 0;
+
+        for (i = L_H - 2; i >= 0; i--)
+        {
+            L_tmp2 = ((Word32) h[i]) * h[i + 1];
+
+            if (L_tmp2 != (Word32) 0x40000000L)
+            {
+                L_tmp2 = L_tmp2 << 1;
+            }
+            else
+            {
+                *pOverflow = 1;
+                L_tmp2 = MAX_32;
+                break;
+            }
+
+            L_tmp = L_add(L_tmp, L_tmp2, pOverflow);
+        }
+        temp2 = (Word16)(L_tmp >> 16);
+
+        if (temp2 <= 0)
+        {
+            temp2 = 0;
+        }
+        else
+        {
+            L_tmp = (((Word32) temp2) * MU) >> 15;
+
+            /* Sign-extend product */
+            if (L_tmp & (Word32) 0x00010000L)
+            {
+                L_tmp = L_tmp | (Word32) 0xffff0000L;
+            }
+            temp2 = (Word16) L_tmp;
+
+            temp2 = div_s(temp2, temp1);
+        }
+
+        preemphasis(&(st->preemph_state), st->res2, temp2, L_SUBFR, pOverflow);
+
+        /* filtering through  1/A(z/0.75) */
+
+        Syn_filt(Ap4, st->res2, &syn[i_subfr], L_SUBFR, st->mem_syn_pst, 1);
+
+        /* scale output to input */
+
+        agc(&(st->agc_state), &syn_work[i_subfr], &syn[i_subfr],
+            AGC_FAC, L_SUBFR, pOverflow);
+
+        Az += MP1;
+    }
+
+    /* update syn_work[] buffer */
+
+    Copy(&syn_work[L_FRAME - M], &syn_work[-M], M);
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/dec/src/pstfilt.h b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.h
new file mode 100644
index 0000000..29c0d84
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/pstfilt.h
@@ -0,0 +1,143 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: /audio/gsm_amr/c/src/include/pstfilt.h
+
+     Date: 02/05/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+ Description: Moved _cplusplus #ifdef after Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+      File             : pstfilt.h
+      Purpose          : Performs adaptive postfiltering on the synthesis
+                       : speech
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef _PSTFILT_H_
+#define _PSTFILT_H_
+#define pstfilt_h "$Id $"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "typedef.h"
+#include "mode.h"
+#include "cnst.h"
+#include "preemph.h"
+#include "agc.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; [Declare variables used in this module but defined elsewhere]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    typedef struct
+    {
+        Word16 res2[L_SUBFR];
+        Word16 mem_syn_pst[M];
+        preemphasisState preemph_state;
+        agcState agc_state;
+        Word16 synth_buf[M + L_FRAME];
+    } Post_FilterState;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+    Word16 Post_Filter_reset(Post_FilterState *st);
+    /* reset post filter (i.e. set state memory to zero)
+       returns 0 on success
+     */
+
+    void Post_Filter(
+        Post_FilterState *st, /* i/o : post filter states                        */
+        enum Mode mode,       /* i   : AMR mode                                  */
+        Word16 *syn,          /* i/o : synthesis speech (postfiltered is output) */
+        Word16 *Az_4,         /* i   : interpolated LPC parameters in all subfr. */
+        Flag   *pOverflow
+    );
+    /* filters the signal syn using the parameters in Az_4 to calculate filter
+       coefficients.
+       The filter must be set up using Post_Filter_init prior to the first call
+       to Post_Filter. Post_FilterState is updated to mirror the current state
+       of the filter
+
+       return 0 on success
+     */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* _PSTFILT_H_ */
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/pvgsmamrdecoder.cpp b/media/libstagefright/codecs/amrnb/dec/src/pvgsmamrdecoder.cpp
new file mode 100644
index 0000000..95b0b47
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/pvgsmamrdecoder.cpp
@@ -0,0 +1,77 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+
+#include "PVGSMAMRDecoder.h"
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF CPVGSMAMRDecoder::CPVGSMAMRDecoder()
+{
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF CPVGSMAMRDecoder::~CPVGSMAMRDecoder()
+{
+    delete iDecState;
+    iDecState = NULL;
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF int32 CPVGSMAMRDecoder::InitDecoder(void)
+{
+    return GSMInitDecode(&iDecState, (int8*)"Decoder");
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF int32 CPVGSMAMRDecoder::DecodeFrame(Frame_Type_3GPP aType,
+        uint8* aCompressedBlock,
+        uint8* aAudioBuffer,
+        int32 aFormat)
+{
+    return AMRDecode(iDecState, aType, aCompressedBlock, (Word16*)aAudioBuffer, (Word16) aFormat);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF int32 CPVGSMAMRDecoder::ResetDecoder(void)
+{
+    return Speech_Decode_Frame_reset(iDecState);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+OSCL_EXPORT_REF void CPVGSMAMRDecoder::TerminateDecoder(void)
+{
+    GSMDecodeFrameExit(&iDecState);
+    iDecState = NULL;
+}
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/qgain475_tab.cpp b/media/libstagefright/codecs/amrnb/dec/src/qgain475_tab.cpp
new file mode 100644
index 0000000..fbcd412
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/qgain475_tab.cpp
@@ -0,0 +1,435 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+
+
+ Filename: /audio/gsm_amr/c/src/qgain475_tab.c
+
+     Date: 12/09/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Created this file from the reference, qgain475.tab.
+
+ Description: Added #ifdef __cplusplus and removed "extern" from table
+              definition.
+
+ Description: Put "extern" back.
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "qgain475_tab.h"
+
+/*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; [Define module specific macros here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; [Include all pre-processor statements here. Include conditional
+    ; compile variables also.]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL FUNCTION DEFINITIONS
+    ; [List function prototypes here]
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; LOCAL VARIABLE DEFINITIONS
+    ; [Variable declaration - defined here and used outside this module]
+    ----------------------------------------------------------------------------*/
+
+    /* The table contains the following data:
+     *
+     *    g_pitch(0)        (Q14) // for sub-
+     *    g_fac(0)          (Q12) // frame 0 and 2
+     *    g_pitch(1)        (Q14) // for sub-
+     *    g_fac(2)          (Q12) // frame 1 and 3
+     *
+     */
+    extern const Word16 table_gain_MR475[MR475_VQ_SIZE*4] =
+    {
+        /*g_pit(0), g_fac(0),      g_pit(1), g_fac(1) */
+        812,          128,           542,      140,
+        2873,         1135,          2266,     3402,
+        2067,          563,         12677,      647,
+        4132,         1798,          5601,     5285,
+        7689,          374,          3735,      441,
+        10912,         2638,         11807,     2494,
+        20490,          797,          5218,      675,
+        6724,         8354,          5282,     1696,
+        1488,          428,          5882,      452,
+        5332,         4072,          3583,     1268,
+        2469,          901,         15894,     1005,
+        14982,         3271,         10331,     4858,
+        3635,         2021,          2596,      835,
+        12360,         4892,         12206,     1704,
+        13432,         1604,          9118,     2341,
+        3968,         1538,          5479,     9936,
+        3795,          417,          1359,      414,
+        3640,         1569,          7995,     3541,
+        11405,          645,          8552,      635,
+        4056,         1377,         16608,     6124,
+        11420,          700,          2007,      607,
+        12415,         1578,         11119,     4654,
+        13680,         1708,         11990,     1229,
+        7996,         7297,         13231,     5715,
+        2428,         1159,          2073,     1941,
+        6218,         6121,          3546,     1804,
+        8925,         1802,          8679,     1580,
+        13935,         3576,         13313,     6237,
+        6142,         1130,          5994,     1734,
+        14141,         4662,         11271,     3321,
+        12226,         1551,         13931,     3015,
+        5081,        10464,          9444,     6706,
+        1689,          683,          1436,     1306,
+        7212,         3933,          4082,     2713,
+        7793,          704,         15070,      802,
+        6299,         5212,          4337,     5357,
+        6676,          541,          6062,      626,
+        13651,         3700,         11498,     2408,
+        16156,          716,         12177,      751,
+        8065,        11489,          6314,     2256,
+        4466,          496,          7293,      523,
+        10213,         3833,          8394,     3037,
+        8403,          966,         14228,     1880,
+        8703,         5409,         16395,     4863,
+        7420,         1979,          6089,     1230,
+        9371,         4398,         14558,     3363,
+        13559,         2873,         13163,     1465,
+        5534,         1678,         13138,    14771,
+        7338,          600,          1318,      548,
+        4252,         3539,         10044,     2364,
+        10587,          622,         13088,      669,
+        14126,         3526,          5039,     9784,
+        15338,          619,          3115,      590,
+        16442,         3013,         15542,     4168,
+        15537,         1611,         15405,     1228,
+        16023,         9299,          7534,     4976,
+        1990,         1213,         11447,     1157,
+        12512,         5519,          9475,     2644,
+        7716,         2034,         13280,     2239,
+        16011,         5093,          8066,     6761,
+        10083,         1413,          5002,     2347,
+        12523,         5975,         15126,     2899,
+        18264,         2289,         15827,     2527,
+        16265,        10254,         14651,    11319,
+        1797,          337,          3115,      397,
+        3510,         2928,          4592,     2670,
+        7519,          628,         11415,      656,
+        5946,         2435,          6544,     7367,
+        8238,          829,          4000,      863,
+        10032,         2492,         16057,     3551,
+        18204,         1054,          6103,     1454,
+        5884,         7900,         18752,     3468,
+        1864,          544,          9198,      683,
+        11623,         4160,          4594,     1644,
+        3158,         1157,         15953,     2560,
+        12349,         3733,         17420,     5260,
+        6106,         2004,          2917,     1742,
+        16467,         5257,         16787,     1680,
+        17205,         1759,          4773,     3231,
+        7386,         6035,         14342,    10012,
+        4035,          442,          4194,      458,
+        9214,         2242,          7427,     4217,
+        12860,          801,         11186,      825,
+        12648,         2084,         12956,     6554,
+        9505,          996,          6629,      985,
+        10537,         2502,         15289,     5006,
+        12602,         2055,         15484,     1653,
+        16194,         6921,         14231,     5790,
+        2626,          828,          5615,     1686,
+        13663,         5778,          3668,     1554,
+        11313,         2633,          9770,     1459,
+        14003,         4733,         15897,     6291,
+        6278,         1870,          7910,     2285,
+        16978,         4571,         16576,     3849,
+        15248,         2311,         16023,     3244,
+        14459,        17808,         11847,     2763,
+        1981,         1407,          1400,      876,
+        4335,         3547,          4391,     4210,
+        5405,          680,         17461,      781,
+        6501,         5118,          8091,     7677,
+        7355,          794,          8333,     1182,
+        15041,         3160,         14928,     3039,
+        20421,          880,         14545,      852,
+        12337,        14708,          6904,     1920,
+        4225,          933,          8218,     1087,
+        10659,         4084,         10082,     4533,
+        2735,          840,         20657,     1081,
+        16711,         5966,         15873,     4578,
+        10871,         2574,          3773,     1166,
+        14519,         4044,         20699,     2627,
+        15219,         2734,         15274,     2186,
+        6257,         3226,         13125,    19480,
+        7196,          930,          2462,     1618,
+        4515,         3092,         13852,     4277,
+        10460,          833,         17339,      810,
+        16891,         2289,         15546,     8217,
+        13603,         1684,          3197,     1834,
+        15948,         2820,         15812,     5327,
+        17006,         2438,         16788,     1326,
+        15671,         8156,         11726,     8556,
+        3762,         2053,          9563,     1317,
+        13561,         6790,         12227,     1936,
+        8180,         3550,         13287,     1778,
+        16299,         6599,         16291,     7758,
+        8521,         2551,          7225,     2645,
+        18269,         7489,         16885,     2248,
+        17882,         2884,         17265,     3328,
+        9417,        20162,         11042,     8320,
+        1286,          620,          1431,      583,
+        5993,         2289,          3978,     3626,
+        5144,          752,         13409,      830,
+        5553,         2860,         11764,     5908,
+        10737,          560,          5446,      564,
+        13321,         3008,         11946,     3683,
+        19887,          798,          9825,      728,
+        13663,         8748,          7391,     3053,
+        2515,          778,          6050,      833,
+        6469,         5074,          8305,     2463,
+        6141,         1865,         15308,     1262,
+        14408,         4547,         13663,     4515,
+        3137,         2983,          2479,     1259,
+        15088,         4647,         15382,     2607,
+        14492,         2392,         12462,     2537,
+        7539,         2949,         12909,    12060,
+        5468,          684,          3141,      722,
+        5081,         1274,         12732,     4200,
+        15302,          681,          7819,      592,
+        6534,         2021,         16478,     8737,
+        13364,          882,          5397,      899,
+        14656,         2178,         14741,     4227,
+        14270,         1298,         13929,     2029,
+        15477,         7482,         15815,     4572,
+        2521,         2013,          5062,     1804,
+        5159,         6582,          7130,     3597,
+        10920,         1611,         11729,     1708,
+        16903,         3455,         16268,     6640,
+        9306,         1007,          9369,     2106,
+        19182,         5037,         12441,     4269,
+        15919,         1332,         15357,     3512,
+        11898,        14141,         16101,     6854,
+        2010,          737,          3779,      861,
+        11454,         2880,          3564,     3540,
+        9057,         1241,         12391,      896,
+        8546,         4629,         11561,     5776,
+        8129,          589,          8218,      588,
+        18728,         3755,         12973,     3149,
+        15729,          758,         16634,      754,
+        15222,        11138,         15871,     2208,
+        4673,          610,         10218,      678,
+        15257,         4146,          5729,     3327,
+        8377,         1670,         19862,     2321,
+        15450,         5511,         14054,     5481,
+        5728,         2888,          7580,     1346,
+        14384,         5325,         16236,     3950,
+        15118,         3744,         15306,     1435,
+        14597,         4070,         12301,    15696,
+        7617,         1699,          2170,      884,
+        4459,         4567,         18094,     3306,
+        12742,          815,         14926,      907,
+        15016,         4281,         15518,     8368,
+        17994,         1087,          2358,      865,
+        16281,         3787,         15679,     4596,
+        16356,         1534,         16584,     2210,
+        16833,         9697,         15929,     4513,
+        3277,         1085,          9643,     2187,
+        11973,         6068,          9199,     4462,
+        8955,         1629,         10289,     3062,
+        16481,         5155,         15466,     7066,
+        13678,         2543,          5273,     2277,
+        16746,         6213,         16655,     3408,
+        20304,         3363,         18688,     1985,
+        14172,        12867,         15154,    15703,
+        4473,         1020,          1681,      886,
+        4311,         4301,          8952,     3657,
+        5893,         1147,         11647,     1452,
+        15886,         2227,          4582,     6644,
+        6929,         1205,          6220,      799,
+        12415,         3409,         15968,     3877,
+        19859,         2109,          9689,     2141,
+        14742,         8830,         14480,     2599,
+        1817,         1238,          7771,      813,
+        19079,         4410,          5554,     2064,
+        3687,         2844,         17435,     2256,
+        16697,         4486,         16199,     5388,
+        8028,         2763,          3405,     2119,
+        17426,         5477,         13698,     2786,
+        19879,         2720,          9098,     3880,
+        18172,         4833,         17336,    12207,
+        5116,          996,          4935,      988,
+        9888,         3081,          6014,     5371,
+        15881,         1667,          8405,     1183,
+        15087,         2366,         19777,     7002,
+        11963,         1562,          7279,     1128,
+        16859,         1532,         15762,     5381,
+        14708,         2065,         20105,     2155,
+        17158,         8245,         17911,     6318,
+        5467,         1504,          4100,     2574,
+        17421,         6810,          5673,     2888,
+        16636,         3382,          8975,     1831,
+        20159,         4737,         19550,     7294,
+        6658,         2781,         11472,     3321,
+        19397,         5054,         18878,     4722,
+        16439,         2373,         20430,     4386,
+        11353,        26526,         11593,     3068,
+        2866,         1566,          5108,     1070,
+        9614,         4915,          4939,     3536,
+        7541,          878,         20717,      851,
+        6938,         4395,         16799,     7733,
+        10137,         1019,          9845,      964,
+        15494,         3955,         15459,     3430,
+        18863,          982,         20120,      963,
+        16876,        12887,         14334,     4200,
+        6599,         1220,          9222,      814,
+        16942,         5134,          5661,     4898,
+        5488,         1798,         20258,     3962,
+        17005,         6178,         17929,     5929,
+        9365,         3420,          7474,     1971,
+        19537,         5177,         19003,     3006,
+        16454,         3788,         16070,     2367,
+        8664,         2743,          9445,    26358,
+        10856,         1287,          3555,     1009,
+        5606,         3622,         19453,     5512,
+        12453,          797,         20634,      911,
+        15427,         3066,         17037,    10275,
+        18883,         2633,          3913,     1268,
+        19519,         3371,         18052,     5230,
+        19291,         1678,         19508,     3172,
+        18072,        10754,         16625,     6845,
+        3134,         2298,         10869,     2437,
+        15580,         6913,         12597,     3381,
+        11116,         3297,         16762,     2424,
+        18853,         6715,         17171,     9887,
+        12743,         2605,          8937,     3140,
+        19033,         7764,         18347,     3880,
+        20475,         3682,         19602,     3380,
+        13044,        19373,         10526,    23124
+    };
+
+
+    /*--------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    None
+
+ Outputs:
+    None
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ None
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] qua_gain.tab,  UMTS GSM AMR speech codec,
+                    R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/sp_dec.cpp b/media/libstagefright/codecs/amrnb/dec/src/sp_dec.cpp
new file mode 100644
index 0000000..2989b74
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/sp_dec.cpp
@@ -0,0 +1,699 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/sp_dec.c
+ Functions: GSMInitDecode
+            Speech_Decode_Frame_reset
+            GSMDecodeFrameExit
+            GSMFrameDecode
+
+     Date: 08/03/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Add PV coding template. Filled out template sections and
+              reformatted code to follow C coding standard. Removed code that
+              handles SID in GSMFrameDecode.
+
+ Description: Made the following changes per comments from Phase 2/3 review:
+              1. Updated to more recent PV C coding template.
+              2. Took out all the tabs in the file and replaced with spaces.
+              3. Deleted bit_offset from input list of GSMFrameDecode.
+
+ Description: Changing several variables passed into these functions of type
+              Speech_Decode_FrameState to type void.
+
+ Description: Cleaning up brackets and line spacing for statements with
+              brackets as per a review comments.
+
+ Description: Synchronized file with UMTS version 3.2.0. Removed unnecessary
+              include files.
+
+ Description: Removed all references to malloc/free, except for the top-level
+ malloc in GSMInitDecode, and corresponding free in GSMDecodeFrameExit.
+
+ Also, modified function calls throughout to reflect the fact that the members
+ of the structure Decoder_amrState are no longer pointers to be set via
+ malloc, but full-blown structures.  (Changes of the type D_plsfState *lsfState
+ to D_plsfState lsfState)
+
+ Description: Created overflow and pass the variable into the decoder.
+
+ Description: Changed inititlaization of the pointer to overflow flag. Removed
+              code related to MOPS counter.
+
+ Description:  Replaced OSCL mem type functions and eliminated include
+               files that now are chosen by OSCL definitions
+
+ Description:  Replaced "int" and/or "char" with defined types.
+               Added proper casting (Word32) to some left shifting operations
+
+ Description:
+
+------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+ This file contains the functions that initialize, invoke, reset, and exit
+ the GSM AMR decoder.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include <stdlib.h>
+
+#include "sp_dec.h"
+#include "typedef.h"
+#include "cnst.h"
+#include "dec_amr.h"
+#include "pstfilt.h"
+#include "bits2prm.h"
+#include "mode.h"
+#include "post_pro.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: GSMInitDecode
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to an array of pointers to structures of type
+            Speech_Decode_FrameState
+    no_hp_post_MR122 = flag to turn off high-pass post filter for 12.2 kbps
+                       mode (Flag)
+    id = pointer to an array whose contents are of type char
+
+ Outputs:
+    decoder_amrState field of the structure pointed to by the pointer pointed
+       to by state is set to NULL
+    post_state field of the structure pointed to by the pointer pointed to
+      by state is set to NULL
+    postHP_state field of the structure pointed to by the pointer pointed to
+      by state is set to NULL
+    no_hp_post_MR122 field of the structure pointed to by the pointer pointed
+      to by state is set to the input no_hp_post_MR122
+
+ Returns:
+    return_value = set to zero, if initialization was successful; -1,
+                   otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function allocates memory for filter structure and initializes state
+ memory used by the GSM AMR decoder.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Note: Original function name of Speech_Decode_Frame_init was changed to
+       GSMInitDecode in the Code section.
+
+int Speech_Decode_Frame_init (Speech_Decode_FrameState **state,
+                              char *id)
+{
+  Speech_Decode_FrameState* s;
+
+  if (state == (Speech_Decode_FrameState **) NULL){
+      fprintf(stderr, "Speech_Decode_Frame_init: invalid parameter\n");
+      return -1;
+  }
+  *state = NULL;
+
+  // allocate memory
+  if ((s= (Speech_Decode_FrameState *)
+          malloc(sizeof(Speech_Decode_FrameState))) == NULL) {
+      fprintf(stderr, "Speech_Decode_Frame_init: can not malloc state "
+              "structure\n");
+      return -1;
+  }
+  s->decoder_amrState = NULL;
+  s->post_state = NULL;
+  s->postHP_state = NULL;
+
+  if (Decoder_amr_init(&s->decoder_amrState) ||
+      Post_Filter_init(&s->post_state) ||
+      Post_Process_init(&s->postHP_state) ) {
+      Speech_Decode_Frame_exit(&s);
+      return -1;
+  }
+
+  s->complexityCounter = getCounterId(id);
+
+  Speech_Decode_Frame_reset(s);
+  *state = s;
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+Word16 GSMInitDecode(void **state_data,
+                     Word8 * id)
+{
+    Speech_Decode_FrameState* s;
+    OSCL_UNUSED_ARG(id);
+
+    if (state_data == NULL)
+    {
+        /*  fprintf(stderr, "Speech_Decode_Frame_init:
+                             invalid parameter\n");  */
+        return (-1);
+    }
+    *state_data = NULL;
+
+    /* allocate memory */
+    if ((s = (Speech_Decode_FrameState *)
+             malloc(sizeof(Speech_Decode_FrameState))) == NULL)
+    {
+        /*  fprintf(stderr, "Speech_Decode_Frame_init: can not malloc state "
+            "structure\n");  */
+        return (-1);
+    }
+
+    if (Decoder_amr_init(&s->decoder_amrState)
+            || Post_Process_reset(&s->postHP_state))
+    {
+        Speech_Decode_FrameState *tmp = s;
+        /*
+         *  dereferencing type-punned pointer avoid
+         *  breaking strict-aliasing rules
+         */
+        void** tempVoid = (void**) tmp;
+        GSMDecodeFrameExit(tempVoid);
+        return (-1);
+    }
+
+
+    Speech_Decode_Frame_reset(s);
+    *state_data = (void *)s;
+
+    return (0);
+}
+
+
+/****************************************************************************/
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: Speech_Decode_Frame_reset
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to structures of type Speech_Decode_FrameState
+
+ Outputs:
+    None
+
+ Returns:
+    return_value = set to zero if reset was successful; -1, otherwise (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function resets the state memory used by the GSM AMR decoder.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+int Speech_Decode_Frame_reset (Speech_Decode_FrameState *state)
+{
+  if (state == (Speech_Decode_FrameState *) NULL){
+      fprintf(stderr, "Speech_Decode_Frame_reset: invalid parameter\n");
+      return -1;
+  }
+
+  Decoder_amr_reset(state->decoder_amrState, (enum Mode)0);
+  Post_Filter_reset(state->post_state);
+  Post_Process_reset(state->postHP_state);
+
+  state->prev_mode = (enum Mode)0;
+
+  setCounter(state->complexityCounter);
+  Init_WMOPS_counter();
+  setCounter(0); // set counter to global counter
+
+  return 0;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+Word16 Speech_Decode_Frame_reset(void *state_data)
+{
+
+    Speech_Decode_FrameState *state =
+        (Speech_Decode_FrameState *) state_data;
+
+    if (state_data ==  NULL)
+    {
+        /*  fprintf(stderr, "Speech_Decode_Frame_reset:
+                             invalid parameter\n");  */
+        return (-1);
+    }
+
+    Decoder_amr_reset(&(state->decoder_amrState), MR475);
+    Post_Filter_reset(&(state->post_state));
+    Post_Process_reset(&(state->postHP_state));
+
+    state->prev_mode = MR475;
+
+    return (0);
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: GSMDecodeFrameExit
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    state = pointer to an array of pointers to structures of type
+            Speech_Decode_FrameState
+
+ Outputs:
+    state contents is set to NULL
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function frees up the memory used for the state memory of the GSM AMR
+ decoder.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Note: The original function name of Speech_Decode_Frame_exit was changed to
+       GSMDecodeFrameExit in the Code section.
+
+void Speech_Decode_Frame_exit (Speech_Decode_FrameState **state)
+{
+  if (state == NULL || *state == NULL)
+      return;
+
+  Decoder_amr_exit(&(*state)->decoder_amrState);
+  Post_Filter_exit(&(*state)->post_state);
+  Post_Process_exit(&(*state)->postHP_state);
+
+  setCounter((*state)->complexityCounter);
+  WMOPS_output(0);
+  setCounter(0); // set counter to global counter
+
+  // deallocate memory
+  free(*state);
+  *state = NULL;
+
+  return;
+}
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void GSMDecodeFrameExit(void **state_data)
+{
+
+    Speech_Decode_FrameState **state =
+        (Speech_Decode_FrameState **) state_data;
+
+    if (state == NULL || *state == NULL)
+    {
+        return;
+    }
+
+    /* deallocate memory */
+    free(*state);
+    *state = NULL;
+
+    return;
+}
+
+/****************************************************************************/
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: GSMFrameDecode
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    st = pointer to structures of type Speech_Decode_FrameState
+    mode = GSM AMR codec mode (enum Mode)
+    serial = pointer to the serial bit stream buffer (unsigned char)
+    frame_type = GSM AMR receive frame type (enum RXFrameType)
+    synth = pointer to the output synthesis speech buffer (Word16)
+
+ Outputs:
+    synth contents are truncated to 13 bits if NO13BIT is not defined,
+      otherwise, its contents are left at 16 bits
+
+ Returns:
+    return_value = set to zero (int)
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function is the entry point to the GSM AMR decoder. The following
+ operations are performed on one received frame: First, the codec
+ parameters are parsed from the buffer pointed to by serial according to
+ frame_type. Then the AMR decoder is invoked via a call to Decoder_amr. Post
+ filtering of the decoded data is done via a call to Post_Filter function.
+ Lastly, the decoded data is post-processed via a call to Post_Process
+ function. If NO13BIT is not defined, the contents of the buffer pointed to
+ by synth is truncated to 13 bits. It remains unchanged otherwise.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ sp_dec.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ Note: The original function name of Speech_Decode_Frame_exit was changed to
+       GSMFrameDecode in the Code section.
+
+int Speech_Decode_Frame (
+    Speech_Decode_FrameState *st, // io: post filter states
+    enum Mode mode,               // i : AMR mode
+    Word16 *serial,               // i : serial bit stream
+    enum RXFrameType frame_type,  // i : Frame type
+    Word16 *synth                 // o : synthesis speech (postfiltered
+                                  //     output)
+)
+{
+  Word16 parm[MAX_PRM_SIZE + 1];  // Synthesis parameters
+  Word16 Az_dec[AZ_SIZE];         // Decoded Az for post-filter
+                                  // in 4 subframes
+
+#if !defined(NO13BIT)
+  Word16 i;
+#endif
+
+  setCounter(st->complexityCounter);
+  Reset_WMOPS_counter ();          // reset WMOPS counter for the new frame
+
+  // Serial to parameters
+  if ((frame_type == RX_SID_BAD) ||
+      (frame_type == RX_SID_UPDATE)) {
+    // Override mode to MRDTX
+    Bits2prm (MRDTX, serial, parm);
+  } else {
+    Bits2prm (mode, serial, parm);
+  }
+
+  // Synthesis
+  Decoder_amr(st->decoder_amrState, mode, parm, frame_type,
+              synth, Az_dec);
+
+  Post_Filter(st->post_state, mode, synth, Az_dec);   // Post-filter
+
+  // post HP filter, and 15->16 bits
+  Post_Process(st->postHP_state, synth, L_FRAME);
+
+#if !defined(NO13BIT)
+  // Truncate to 13 bits
+  for (i = 0; i < L_FRAME; i++)
+  {
+     synth[i] = synth[i] & 0xfff8;
+  }
+#endif
+
+  setCounter(0); // set counter to global counter
+
+  return 0;
+}
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void GSMFrameDecode(
+    Speech_Decode_FrameState *st, /* io: post filter states                */
+    enum Mode mode,               /* i : AMR mode                          */
+    Word16 *serial,               /* i : serial bit stream                 */
+    enum RXFrameType frame_type,  /* i : Frame type                        */
+    Word16 *synth)                /* o : synthesis speech (postfiltered    */
+/*     output)                           */
+
+{
+    Word16 parm[MAX_PRM_SIZE + 1];  /* Synthesis parameters                */
+    Word16 Az_dec[AZ_SIZE];         /* Decoded Az for post-filter          */
+    /* in 4 subframes                      */
+    Flag *pOverflow = &(st->decoder_amrState.overflow);  /* Overflow flag  */
+
+#if !defined(NO13BIT)
+    Word16 i;
+#endif
+
+    /* Serial to parameters   */
+    if ((frame_type == RX_SID_BAD) ||
+            (frame_type == RX_SID_UPDATE))
+    {
+        /* Override mode to MRDTX */
+        Bits2prm(MRDTX, serial, parm);
+    }
+    else
+    {
+        Bits2prm(mode, serial, parm);
+    }
+
+    /* Synthesis */
+    Decoder_amr(
+        &(st->decoder_amrState),
+        mode,
+        parm,
+        frame_type,
+        synth,
+        Az_dec);
+
+    /* Post-filter */
+    Post_Filter(
+        &(st->post_state),
+        mode,
+        synth,
+        Az_dec,
+        pOverflow);
+
+    /* post HP filter, and 15->16 bits */
+    Post_Process(
+        &(st->postHP_state),
+        synth,
+        L_FRAME,
+        pOverflow);
+
+#if !defined(NO13BIT)
+    /* Truncate to 13 bits */
+    for (i = 0; i < L_FRAME; i++)
+    {
+        synth[i] = synth[i] & 0xfff8;
+    }
+#endif
+
+    return;
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrnb/dec/src/sp_dec.h b/media/libstagefright/codecs/amrnb/dec/src/sp_dec.h
new file mode 100644
index 0000000..3150feb
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/sp_dec.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+*****************************************************************************
+*
+*      GSM AMR speech codec   Version 2.0.0   February 8, 1999
+*
+*****************************************************************************
+*
+*      File             : sp_dec.h
+*      Purpose          : Decoding and post filtering of one speech frame.
+*
+
+ Description:  Replaced "int" and/or "char" with OSCL defined types.
+
+*****************************************************************************
+*/
+#ifndef sp_dec_h
+#define sp_dec_h "$Id $"
+
+/*
+*****************************************************************************
+*                         INCLUDE FILES
+*****************************************************************************
+*/
+#include "typedef.h"
+#include "cnst.h"
+#include "dec_amr.h"
+#include "pstfilt.h"
+#include "post_pro.h"
+#include "mode.h"
+
+/*
+*****************************************************************************
+*                         DEFINITION OF DATA TYPES
+*****************************************************************************
+*/
+typedef struct
+{
+    Decoder_amrState  decoder_amrState;
+    Post_FilterState  post_state;
+    Post_ProcessState postHP_state;
+    enum Mode prev_mode;
+} Speech_Decode_FrameState;
+
+/*
+*****************************************************************************
+*                         DECLARATION OF PROTOTYPES
+*****************************************************************************
+*/
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+    Word16 GSMInitDecode(void **state_data,
+    Word8 *id);
+    /* initialize one instance of the speech decoder
+       Stores pointer to filter status struct in *st. This pointer has to
+       be passed to Speech_Decode_Frame in each call.
+       returns 0 on success
+     */
+
+    Word16 Speech_Decode_Frame_reset(void *state_data);
+    /* reset speech decoder (i.e. set state memory to zero)
+       returns 0 on success
+     */
+
+    void GSMDecodeFrameExit(void **state_data);
+    /* de-initialize speech decoder (i.e. free status struct)
+       stores NULL in *s
+     */
+
+    void GSMFrameDecode(
+        Speech_Decode_FrameState *st, /* io: post filter states                */
+        enum Mode mode,               /* i : AMR mode                          */
+        Word16 *serial,               /* i : serial bit stream                 */
+        enum RXFrameType frame_type,  /* i : Frame type                        */
+        Word16 *synth                 /* o : synthesis speech (postfiltered    */
+        /*     output)                           */
+    );
+    /*    return 0 on success
+     */
+#if defined(__cplusplus)
+}
+#endif
+#endif
diff --git a/media/libstagefright/codecs/amrnb/dec/src/wmf_to_ets.cpp b/media/libstagefright/codecs/amrnb/dec/src/wmf_to_ets.cpp
new file mode 100644
index 0000000..4dfbb67
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/dec/src/wmf_to_ets.cpp
@@ -0,0 +1,190 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.073
+    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./audio/gsm-amr/c/src/wmf_to_ets.c
+ Funtions: wmf_to_ets
+
+     Date: 01/21/2002
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changing mode to frame_type_3gpp for DTX support. Modifying for
+              loops for optimized code. Updating as per review comments.
+
+ Description: Changed MRDTX to AMR_SID in the code and added bitreorder_tab.h
+              in the Include section.
+
+ Description:
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "frame_type_3gpp.h"
+#include "wmf_to_ets.h"
+#include "typedef.h"
+#include "bitreorder_tab.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+
+/*
+------------------------------------------------------------------------------
+ FUNCTION NAME: wmf_to_ets
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    frame_type_3gpp = decoder speech bit rate (enum Frame_Type_3GPP)
+    wmf_input_ptr   = pointer to input encoded speech bits in WMF (non-IF2) format
+                     (Word8)
+    ets_output_ptr  = pointer to output encoded speech bits in ETS format (Word16)
+
+ Outputs:
+    ets_output_ptr  = pointer to encoded speech bits in the ETS format (Word16)
+
+ Returns:
+    None
+
+ Global Variables Used:
+    None
+
+ Local Variables Needed:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs a transformation on the data buffers. It converts the
+ data format from WMF (non-IF2) (Wireless Multi-media Forum) to ETS (European
+ Telecommunication Standard). WMF format has the encoded speech bits byte
+ aligned with MSB to LSB going left to right. ETS format has the encoded speech
+ bits each separate with only one bit stored in each word.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+AMR Speech Codec Frame Structure", 3GPP TS 26.101 version 4.1.0 Release 4, June 2001
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED [optional]
+
+ When the code is written for a specific target processor the
+ the resources used should be documented below.
+
+ HEAP MEMORY USED: x bytes
+
+ STACK MEMORY USED: x bytes
+
+ CLOCK CYCLES: (cycle count equation for this function) + (variable
+                used to represent cycle count for each subroutine
+                called)
+     where: (cycle count variable) = cycle count for [subroutine
+                                     name]
+
+------------------------------------------------------------------------------
+ CAUTION [optional]
+ [State any special notes, constraints or cautions for users of this function]
+
+------------------------------------------------------------------------------
+*/
+
+void wmf_to_ets(
+    enum Frame_Type_3GPP frame_type_3gpp,
+    UWord8   *wmf_input_ptr,
+    Word16   *ets_output_ptr)
+{
+
+    Word16 i;
+
+    /*
+     * The following section of code accesses bits in the WMF method of
+     * bit ordering. Each bit is given its own location in the buffer pointed
+     * to by ets_output_ptr. If the frame_type_3gpp is less than MRDTX then
+     * the elements are reordered within the buffer pointed to by ets_output_ptr.
+     */
+
+    if (frame_type_3gpp < AMR_SID)
+    {
+        /* The table numOfBits[] can be found in bitreorder.c. */
+        for (i = numOfBits[frame_type_3gpp] - 1; i >= 0; i--)
+        {
+            /* The table reorderBits[][] can be found in bitreorder.c. */
+            ets_output_ptr[reorderBits[frame_type_3gpp][i]] =
+                (wmf_input_ptr[i>>3] >> ((~i) & 0x7)) & 0x01;
+        }
+    }
+    else
+    {
+        /* The table numOfBits[] can be found in bitreorder.c. */
+        for (i = numOfBits[frame_type_3gpp] - 1; i >= 0; i--)
+        {
+            ets_output_ptr[i] = (wmf_input_ptr[i>>3] >> ((~i) & 0x7)) & 0x01;
+        }
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrnb/patent_disclaimer.txt b/media/libstagefright/codecs/amrnb/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/libstagefright/codecs/amrnb/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents.  Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/libstagefright/codecs/amrwb/AMRWBDecoder.cpp b/media/libstagefright/codecs/amrwb/AMRWBDecoder.cpp
new file mode 100644
index 0000000..2f45514
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/AMRWBDecoder.cpp
@@ -0,0 +1,215 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 "AMRWBDecoder.h"
+
+#include "pvamrwbdecoder.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+static const int32_t kNumSamplesPerFrame = 320;
+static const int32_t kSampleRate = 16000;
+
+AMRWBDecoder::AMRWBDecoder(const sp<MediaSource> &source)
+    : mSource(source),
+      mStarted(false),
+      mBufferGroup(NULL),
+      mState(NULL),
+      mDecoderBuf(NULL),
+      mDecoderCookie(NULL),
+      mAnchorTimeUs(0),
+      mNumSamplesOutput(0),
+      mInputBuffer(NULL) {
+}
+
+AMRWBDecoder::~AMRWBDecoder() {
+    if (mStarted) {
+        stop();
+    }
+}
+
+status_t AMRWBDecoder::start(MetaData *params) {
+    CHECK(!mStarted);
+
+    mBufferGroup = new MediaBufferGroup;
+    mBufferGroup->add_buffer(
+            new MediaBuffer(kNumSamplesPerFrame * sizeof(int16_t)));
+
+    int32_t memReq = pvDecoder_AmrWbMemRequirements();
+    mDecoderBuf = malloc(memReq);
+
+    pvDecoder_AmrWb_Init(&mState, mDecoderBuf, &mDecoderCookie);
+
+    mSource->start();
+
+    mAnchorTimeUs = 0;
+    mNumSamplesOutput = 0;
+    mStarted = true;
+
+    return OK;
+}
+
+status_t AMRWBDecoder::stop() {
+    CHECK(mStarted);
+
+    if (mInputBuffer) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    delete mBufferGroup;
+    mBufferGroup = NULL;
+
+    free(mDecoderBuf);
+    mDecoderBuf = NULL;
+
+    mSource->stop();
+
+    mStarted = false;
+
+    return OK;
+}
+
+sp<MetaData> AMRWBDecoder::getFormat() {
+    sp<MetaData> srcFormat = mSource->getFormat();
+
+    int32_t numChannels;
+    int32_t sampleRate;
+    int64_t durationUs;
+
+    CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
+    CHECK_EQ(numChannels, 1);
+
+    CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
+    CHECK_EQ(sampleRate, kSampleRate);
+
+    CHECK(srcFormat->findInt64(kKeyDuration, &durationUs));
+
+    sp<MetaData> meta = new MetaData;
+    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
+    meta->setInt32(kKeyChannelCount, numChannels);
+    meta->setInt32(kKeySampleRate, sampleRate);
+    meta->setInt64(kKeyDuration, durationUs);
+
+    return meta;
+}
+
+static size_t getFrameSize(unsigned FT) {
+    static const size_t kFrameSizeWB[9] = {
+        132, 177, 253, 285, 317, 365, 397, 461, 477
+    };
+
+    size_t frameSize = kFrameSizeWB[FT];
+
+    // Round up bits to bytes and add 1 for the header byte.
+    frameSize = (frameSize + 7) / 8 + 1;
+
+    return frameSize;
+}
+
+status_t AMRWBDecoder::read(
+        MediaBuffer **out, const ReadOptions *options) {
+    status_t err;
+
+    *out = NULL;
+
+    int64_t seekTimeUs;
+    if (options && options->getSeekTo(&seekTimeUs)) {
+        CHECK(seekTimeUs >= 0);
+
+        mNumSamplesOutput = 0;
+
+        if (mInputBuffer) {
+            mInputBuffer->release();
+            mInputBuffer = NULL;
+        }
+    } else {
+        seekTimeUs = -1;
+    }
+
+    if (mInputBuffer == NULL) {
+        err = mSource->read(&mInputBuffer, options);
+
+        if (err != OK) {
+            return err;
+        }
+
+        int64_t timeUs;
+        if (mInputBuffer->meta_data()->findInt64(kKeyTime, &timeUs)) {
+            mAnchorTimeUs = timeUs;
+            mNumSamplesOutput = 0;
+        } else {
+            // We must have a new timestamp after seeking.
+            CHECK(seekTimeUs < 0);
+        }
+    }
+
+    MediaBuffer *buffer;
+    CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+
+    const uint8_t *inputPtr =
+        (const uint8_t *)mInputBuffer->data() + mInputBuffer->range_offset();
+
+    int16 mode = ((inputPtr[0] >> 3) & 0x0f);
+    size_t frameSize = getFrameSize(mode);
+    CHECK_EQ(mInputBuffer->range_length(), frameSize);
+
+    int16 frameType;
+    RX_State rx_state;
+    mime_unsorting(
+            const_cast<uint8_t *>(&inputPtr[1]),
+            mInputSampleBuffer,
+            &frameType, &mode, 1, &rx_state);
+
+    int16_t *outPtr = (int16_t *)buffer->data();
+
+    int16_t numSamplesOutput;
+    pvDecoder_AmrWb(
+            mode, mInputSampleBuffer,
+            outPtr,
+            &numSamplesOutput,
+            mDecoderBuf, frameType, mDecoderCookie);
+
+    CHECK_EQ(numSamplesOutput, kNumSamplesPerFrame);
+
+    for (int i = 0; i < kNumSamplesPerFrame; ++i) {
+        /* Delete the 2 LSBs (14-bit output) */
+        outPtr[i] &= 0xfffC;
+    }
+
+    buffer->set_range(0, numSamplesOutput * sizeof(int16_t));
+
+    mInputBuffer->release();
+    mInputBuffer = NULL;
+
+    buffer->meta_data()->setInt64(
+            kKeyTime,
+            mAnchorTimeUs
+                + (mNumSamplesOutput * 1000000) / kSampleRate);
+
+    mNumSamplesOutput += kNumSamplesPerFrame;
+
+    *out = buffer;
+
+    return OK;
+}
+
+}  // namespace android
diff --git a/media/libstagefright/codecs/amrwb/Android.mk b/media/libstagefright/codecs/amrwb/Android.mk
new file mode 100644
index 0000000..1c80f08
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/Android.mk
@@ -0,0 +1,60 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+        AMRWBDecoder.cpp \
+	src/agc2_amr_wb.cpp \
+ 	src/band_pass_6k_7k.cpp \
+ 	src/dec_acelp_2p_in_64.cpp \
+ 	src/dec_acelp_4p_in_64.cpp \
+ 	src/dec_alg_codebook.cpp \
+ 	src/dec_gain2_amr_wb.cpp \
+ 	src/deemphasis_32.cpp \
+ 	src/dtx_decoder_amr_wb.cpp \
+ 	src/get_amr_wb_bits.cpp \
+ 	src/highpass_400hz_at_12k8.cpp \
+ 	src/highpass_50hz_at_12k8.cpp \
+ 	src/homing_amr_wb_dec.cpp \
+ 	src/interpolate_isp.cpp \
+ 	src/isf_extrapolation.cpp \
+ 	src/isp_az.cpp \
+ 	src/isp_isf.cpp \
+ 	src/lagconceal.cpp \
+ 	src/low_pass_filt_7k.cpp \
+ 	src/median5.cpp \
+ 	src/mime_io.cpp \
+ 	src/noise_gen_amrwb.cpp \
+ 	src/normalize_amr_wb.cpp \
+ 	src/oversamp_12k8_to_16k.cpp \
+ 	src/phase_dispersion.cpp \
+ 	src/pit_shrp.cpp \
+ 	src/pred_lt4.cpp \
+ 	src/preemph_amrwb_dec.cpp \
+ 	src/pvamrwb_math_op.cpp \
+ 	src/pvamrwbdecoder.cpp \
+ 	src/q_gain2_tab.cpp \
+ 	src/qisf_ns.cpp \
+ 	src/qisf_ns_tab.cpp \
+ 	src/qpisf_2s.cpp \
+ 	src/qpisf_2s_tab.cpp \
+ 	src/scale_signal.cpp \
+ 	src/synthesis_amr_wb.cpp \
+ 	src/voice_factor.cpp \
+ 	src/wb_syn_filt.cpp \
+ 	src/weight_amrwb_lpc.cpp
+
+LOCAL_C_INCLUDES := \
+        frameworks/base/media/libstagefright/include \
+        $(LOCAL_PATH)/src \
+        $(LOCAL_PATH)/include
+
+LOCAL_CFLAGS := \
+        -DOSCL_UNUSED_ARG= -DOSCL_IMPORT_REF=
+
+LOCAL_SHARED_LIBRARIES := \
+        libstagefright \
+        libutils
+
+LOCAL_MODULE := libstagefright_amrwbdec
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/amrwb/include/pvamrwbdecoder_api.h b/media/libstagefright/codecs/amrwb/include/pvamrwbdecoder_api.h
new file mode 100644
index 0000000..457c21f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/include/pvamrwbdecoder_api.h
@@ -0,0 +1,154 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Name: pvamrwbdecoder_api.h
+
+     Date: 05/02/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Main header file for the Packet Video AMR Wide  Band  decoder library. The
+ constants, structures, and functions defined within this file, along with
+ a basic data types header file, is all that is needed to use and communicate
+ with the library. The internal data structures within the library are
+ purposely hidden.
+
+ ---* Need description of the input buffering. *-------
+
+ ---* Need an example of calling the library here *----
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+  (Normally header files do not have a reference section)
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef _PVAMRWBDECODER_API_H
+#define _PVAMRWBDECODER_API_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+#define AMR_WB_PCM_FRAME   320             /* Frame size at 16kHz     */
+
+
+#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 KAMRWB_NB_BITS_MAX   NBBITS_24k
+#define KAMRWB_NB_BYTES_MAX  ((KAMRWB_NB_BITS_MAX>>3)+1)
+
+#define NUM_OF_MODES  10
+
+
+    const int16 AMR_WB_COMPRESSED[NUM_OF_MODES] =
+    {
+        NBBITS_7k,
+        NBBITS_9k,
+        NBBITS_12k,
+        NBBITS_14k,
+        NBBITS_16k,
+        NBBITS_18k,
+        NBBITS_20k,
+        NBBITS_23k,
+        NBBITS_24k,
+        NBBITS_SID
+    };
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* PVMP4AUDIODECODER_API_H */
+
+
diff --git a/media/libstagefright/codecs/amrwb/patent_disclaimer.txt b/media/libstagefright/codecs/amrwb/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/patent_disclaimer.txt
@@ -0,0 +1,9 @@
+
+THIS IS NOT A GRANT OF PATENT RIGHTS.
+
+Google makes no representation or warranty that the codecs for which
+source code is made available hereunder are unencumbered by
+third-party patents.  Those intending to use this source code in
+hardware or software products are advised that implementations of
+these codecs, including in open source software or shareware, may
+require patent licenses from the relevant patent holders.
diff --git a/media/libstagefright/codecs/amrwb/src/agc2_amr_wb.cpp b/media/libstagefright/codecs/amrwb/src/agc2_amr_wb.cpp
new file mode 100644
index 0000000..2e53d13
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/agc2_amr_wb.cpp
@@ -0,0 +1,190 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: agc2_amr_wb.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 * sig_in,            (i)     : postfilter input signal
+     int16 * sig_out,           (i/o)   : postfilter output signal
+     int16 l_trm                (i)     : subframe size
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Performs adaptive gain control
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void agc2_amr_wb(
+    int16 * sig_in,          /* (i)     : postfilter input signal  */
+    int16 * sig_out,         /* (i/o)   : postfilter output signal */
+    int16 l_trm              /* (i)     : subframe size            */
+)
+{
+
+    int16 i, exp;
+    int16 gain_in, gain_out, g0;
+    int32 s;
+
+    int16 temp;
+
+    /* calculate gain_out with exponent */
+
+    temp = sig_out[0] >> 2;
+    s = fxp_mul_16by16(temp, temp) << 1;
+    for (i = 1; i < l_trm; i++)
+    {
+        temp = sig_out[i] >> 2;
+        s = mac_16by16_to_int32(s, temp, temp);
+    }
+
+
+    if (s == 0)
+    {
+        return;
+    }
+    exp = normalize_amr_wb(s) - 1;
+    gain_out = amr_wb_round(s << exp);
+
+    /* calculate gain_in with exponent */
+
+    temp = sig_in[0] >> 2;
+    s = mul_16by16_to_int32(temp, temp);
+    for (i = 1; i < l_trm; i++)
+    {
+        temp = sig_in[i] >> 2;
+        s = mac_16by16_to_int32(s, temp, temp);
+    }
+
+
+    if (s == 0)
+    {
+        g0 = 0;
+    }
+    else
+    {
+        i = normalize_amr_wb(s);
+        gain_in = amr_wb_round(s << i);
+        exp -= i;
+
+        /*
+         *  g0 = sqrt(gain_in/gain_out)
+         */
+
+        s = div_16by16(gain_out, gain_in);
+        s = shl_int32(s, 7);                   /* s = gain_out / gain_in */
+        s = shr_int32(s, exp);                 /* add exponent */
+
+        s = one_ov_sqrt(s);
+        g0 = amr_wb_round(shl_int32(s, 9));
+    }
+    /* sig_out(n) = gain(n) sig_out(n) */
+
+    for (i = 0; i < l_trm; i++)
+    {
+        sig_out[i] = extract_h(shl_int32(fxp_mul_16by16(sig_out[i], g0), 3));
+
+    }
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/band_pass_6k_7k.cpp b/media/libstagefright/codecs/amrwb/src/band_pass_6k_7k.cpp
new file mode 100644
index 0000000..97c7402
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/band_pass_6k_7k.cpp
@@ -0,0 +1,240 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: band_pass_6k_7k.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 in/out: memory (size=30)
+     int16 x[]                   scratch mem ( size= 60)
+
+------------------------------------------------------------------------------
+ FUNCTION 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
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwbdecoder_cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define L_FIR 30
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* filter coefficients (gain=4.0) */
+
+const int16 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
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void band_pass_6k_7k_init(int16 mem[])         /* mem[30] */
+{
+    pv_memset((void *)mem, 0, L_FIR*sizeof(*mem));
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void band_pass_6k_7k(
+    int16 signal[],                      /* input:  signal                  */
+    int16 lg,                            /* input:  length of input         */
+    int16 mem[],                         /* in/out: memory (size=30)        */
+    int16 x[]
+)
+{
+    int16 i, j;
+    int32 L_tmp1;
+    int32 L_tmp2;
+    int32 L_tmp3;
+    int32 L_tmp4;
+
+    int16 *pt_sign = signal;
+
+    pv_memcpy((void *)x, (void *)mem, L_FIR*sizeof(*x));
+
+
+    for (i = 0; i < lg >> 2; i++)
+    {
+
+        x[(i<<2) + L_FIR    ] = *(pt_sign) >> 2;        /* gain of filter = 4 */
+        x[(i<<2) + L_FIR + 1] = *(pt_sign + 1) >> 2;    /* gain of filter = 4 */
+        x[(i<<2) + L_FIR + 2] = *(pt_sign + 2) >> 2;    /* gain of filter = 4 */
+        x[(i<<2) + L_FIR + 3] = *(pt_sign + 3) >> 2;    /* gain of filter = 4 */
+
+        L_tmp1 = 0x00004000;
+        L_tmp2 = 0x00004000;
+        L_tmp3 = 0x00004000;
+        L_tmp4 = 0x00004000;
+
+        L_tmp1 -= ((int32)x[(i<<2)+L_FIR  ] << 5);
+        L_tmp2 -= ((int32)x[(i<<2)+L_FIR+1] << 5);
+        L_tmp3 -= ((int32)x[(i<<2)+L_FIR+2] << 5);
+        L_tmp4 -= ((int32)x[(i<<2)+L_FIR+3] << 5);
+
+        L_tmp1 -= ((int32)x[(i<<2)] << 5);
+        L_tmp2 -= ((int32)x[(i<<2)+1] << 5);
+        L_tmp3 -= ((int32)x[(i<<2)+2] << 5);
+        L_tmp4 -= ((int32)x[(i<<2)+3] << 5);
+
+
+        for (j = 1; j < L_FIR - 1; j += 4)
+        {
+            int16 tmp1 = x[(i<<2)+j  ];
+            int16 tmp2 = x[(i<<2)+j+1];
+            int16 tmp3 = x[(i<<2)+j+2];
+
+            L_tmp1 = fxp_mac_16by16(tmp1, fir_6k_7k[j  ], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp2, fir_6k_7k[j  ], L_tmp2);
+            L_tmp1 = fxp_mac_16by16(tmp2, fir_6k_7k[j+1], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp3, fir_6k_7k[j+1], L_tmp2);
+            L_tmp3 = fxp_mac_16by16(tmp3, fir_6k_7k[j  ], L_tmp3);
+            L_tmp1 = fxp_mac_16by16(tmp3, fir_6k_7k[j+2], L_tmp1);
+
+            tmp1 = x[(i<<2)+j+3];
+            tmp2 = x[(i<<2)+j+4];
+
+            L_tmp2 = fxp_mac_16by16(tmp1, fir_6k_7k[j+2], L_tmp2);
+            L_tmp4 = fxp_mac_16by16(tmp1, fir_6k_7k[j  ], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp1, fir_6k_7k[j+1], L_tmp3);
+            L_tmp1 = fxp_mac_16by16(tmp1, fir_6k_7k[j+3], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp2, fir_6k_7k[j+3], L_tmp2);
+            L_tmp4 = fxp_mac_16by16(tmp2, fir_6k_7k[j+1], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp2, fir_6k_7k[j+2], L_tmp3);
+
+            tmp1 = x[(i<<2)+j+5];
+            tmp2 = x[(i<<2)+j+6];
+
+            L_tmp4 = fxp_mac_16by16(tmp1, fir_6k_7k[j+2], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp1, fir_6k_7k[j+3], L_tmp3);
+            L_tmp4 = fxp_mac_16by16(tmp2, fir_6k_7k[j+3], L_tmp4);
+
+        }
+
+        L_tmp1 = fxp_mac_16by16(x[(i<<2)+j  ], fir_6k_7k[L_FIR-1  ], L_tmp1);
+        L_tmp2 = fxp_mac_16by16(x[(i<<2)+j+1], fir_6k_7k[L_FIR-1  ], L_tmp2);
+        L_tmp3 = fxp_mac_16by16(x[(i<<2)+j+2], fir_6k_7k[L_FIR-1  ], L_tmp3);
+        L_tmp4 = fxp_mac_16by16(x[(i<<2)+j+3], fir_6k_7k[L_FIR-1  ], L_tmp4);
+
+
+        *(pt_sign++) = (int16)(L_tmp1 >> 15);
+        *(pt_sign++) = (int16)(L_tmp2 >> 15);
+        *(pt_sign++) = (int16)(L_tmp3 >> 15);
+        *(pt_sign++) = (int16)(L_tmp4 >> 15);
+
+    }
+
+    pv_memcpy((void *)mem, (void *)(x + lg), L_FIR*sizeof(*mem));
+
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/dec_acelp_2p_in_64.cpp b/media/libstagefright/codecs/amrwb/src/dec_acelp_2p_in_64.cpp
new file mode 100644
index 0000000..740bc16
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dec_acelp_2p_in_64.cpp
@@ -0,0 +1,157 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dec_acelp_2p_in_64.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 index,          (i):   12 bits index
+     int16 code[]          (o): Q9 algebraic (fixed) codebook excitation
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   12 bits algebraic codebook decoder.
+   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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define L_CODE    64                       /* codevector length  */
+#define NB_TRACK  2                        /* number of track    */
+#define NB_POS    32                       /* number of position */
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_acelp_2p_in_64(
+    int16 index,        /* (i):   12 bits index                          */
+    int16 code[]        /* (o): Q9 algebraic (fixed) codebook excitation */
+)
+{
+    int16 i;
+
+    pv_memset(code, 0, L_CODE*sizeof(*code));
+
+    /* decode the positions and signs of pulses and build the codeword */
+
+    i = (index >> 5) & 0x003E;
+
+    if (((index >> 6) & NB_POS) == 0)
+    {
+        code[i] = 512;
+    }
+    else
+    {
+        code[i] = -512;
+    }
+
+    i = ((index & 0x001F) << 1) + 1;
+
+    if ((index & NB_POS) == 0)
+    {
+        code[i] = 512;
+    }
+    else
+    {
+        code[i] = -512;
+    }
+
+}
diff --git a/media/libstagefright/codecs/amrwb/src/dec_acelp_4p_in_64.cpp b/media/libstagefright/codecs/amrwb/src/dec_acelp_4p_in_64.cpp
new file mode 100644
index 0000000..4868822
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dec_acelp_4p_in_64.cpp
@@ -0,0 +1,265 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dec_acelp_4p_in_64.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 index[],    (i) : index (20): 5+5+5+5 = 20 bits.
+                       (i) : index (36): 9+9+9+9 = 36 bits.
+                       (i) : index (44): 13+9+13+9 = 44 bits.
+                       (i) : index (52): 13+13+13+13 = 52 bits.
+                       (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.
+                       (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.
+                       (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.
+     int16 nbbits,     (i) : 20, 36, 44, 52, 64, 72 or 88 bits
+     int16 code[]      (o) Q9: algebraic (fixed) codebook excitation
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   20, 36, 44, 52, 64, 72, 88 bits algebraic codebook decoder.
+   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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+#include "q_pulse.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define L_CODE    64                       /* codevector length  */
+#define NB_TRACK  4                        /* number of track    */
+#define NB_POS    16                       /* number of position */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_acelp_4p_in_64(
+    int16 index[],  /* (i) : index (20): 5+5+5+5 = 20 bits.                 */
+    /* (i) : index (36): 9+9+9+9 = 36 bits.                 */
+    /* (i) : index (44): 13+9+13+9 = 44 bits.               */
+    /* (i) : index (52): 13+13+13+13 = 52 bits.             */
+    /* (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.     */
+    /* (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.   */
+    /* (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+    int16 nbbits,   /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits              */
+    int16 code[]    /* (o) Q9: algebraic (fixed) codebook excitation        */
+)
+{
+    int16 k, pos[6];
+    int32 L_index;
+    pv_memset(code, 0, L_CODE*sizeof(*code));
+
+    /* decode the positions and signs of pulses and build the codeword */
+
+
+    switch (nbbits)
+    {
+        case 20:
+            for (k = 0; k < NB_TRACK; k++)
+            {
+                L_index = index[k];
+                dec_1p_N1(L_index, 4, 0, pos);
+                add_pulses(pos, 1, k, code);
+            }
+            break;
+
+        case  36:
+            for (k = 0; k < NB_TRACK; k++)
+            {
+                L_index = index[k];
+                dec_2p_2N1(L_index, 4, 0, pos);
+                add_pulses(pos, 2, k, code);
+            }
+            break;
+        case 44:
+            for (k = 0; k < NB_TRACK - 2; k++)
+            {
+                L_index = index[k];
+                dec_3p_3N1(L_index, 4, 0, pos);
+                add_pulses(pos, 3, k, code);
+            }
+            for (k = 2; k < NB_TRACK; k++)
+            {
+                L_index = index[k];
+                dec_2p_2N1(L_index, 4, 0, pos);
+                add_pulses(pos, 2, k, code);
+            }
+            break;
+        case 52:
+            for (k = 0; k < NB_TRACK; k++)
+            {
+                L_index = index[k];
+                dec_3p_3N1(L_index, 4, 0, pos);
+                add_pulses(pos, 3, k, code);
+            }
+            break;
+        case 64:
+            for (k = 0; k < NB_TRACK; k++)
+            {
+                L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
+                dec_4p_4N(L_index, 4, 0, pos);
+                add_pulses(pos, 4, k, code);
+            }
+            break;
+        case 72:
+            for (k = 0; k < NB_TRACK - 2; k++)
+            {
+                L_index = ((int32)index[k] << 10) + index[k + NB_TRACK];
+                dec_5p_5N(L_index, 4, 0, pos);
+                add_pulses(pos, 5, k, code);
+            }
+            for (k = 2; k < NB_TRACK; k++)
+            {
+                L_index = ((int32)index[k] << 14) + index[k + NB_TRACK];
+                dec_4p_4N(L_index, 4, 0, pos);
+                add_pulses(pos, 4, k, code);
+            }
+            break;
+        case 88:
+            for (k = 0; k < NB_TRACK; k++)
+            {
+                L_index = ((int32)index[k] << 11) + index[k + NB_TRACK];
+                dec_6p_6N_2(L_index, 4, 0, pos);
+                add_pulses(pos, 6, k, code);
+            }
+        default:
+            break;
+    }
+
+
+}
+
+
+
+void add_pulses(int16 pos[], int16 nb_pulse, int16 track, int16 code[])
+{
+    int16 i, k;
+
+    for (k = 0; k < nb_pulse; k++)
+    {
+        /* i = ((pos[k] & (NB_POS-1))*NB_TRACK) + track; */
+        i = ((pos[k] & (NB_POS - 1)) << 2) + track;
+
+        if ((pos[k] & NB_POS) == 0)
+        {
+            code[i] +=  512;
+        }
+        else
+        {
+            code[i] -=  512;
+        }
+    }
+
+}
diff --git a/media/libstagefright/codecs/amrwb/src/dec_alg_codebook.cpp b/media/libstagefright/codecs/amrwb/src/dec_alg_codebook.cpp
new file mode 100644
index 0000000..44fdc09
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dec_alg_codebook.cpp
@@ -0,0 +1,392 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dec_alg_codebook.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        decoding of algebraic codebook
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "q_pulse.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define NB_POS 16                          /* pos in track, mask for sign bit */
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void dec_1p_N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 pos1;
+    int32 mask, i;
+
+    mask = ((1 << N) - 1);
+    /*-------------------------------------------------------*
+     * Decode 1 pulse with N+1 bits:                         *
+     *-------------------------------------------------------*/
+    pos1 = ((index & mask) + offset);
+
+    i = ((index >> N) & 1L);            /* i = ((index >> N) & 1); */
+
+    if (i == 1)
+    {
+        pos1 += NB_POS;
+    }
+    pos[0] = pos1;
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_2p_2N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 pos1, pos2, tmp;
+    int32 mask, i;
+
+    mask = (int32)(sub_int16(shl_int16(1, N), 1)); /* mask = ((1<<N)-1); */
+    /*-------------------------------------------------------*
+     * Decode 2 pulses with 2*N+1 bits:                      *
+     *-------------------------------------------------------*/
+    /* pos1 = (((index >> N) & mask) + offset); */
+    pos1 = (int16)(add_int32((shr_int32(index, N) & mask), (int32)(offset)));
+    tmp = shl_int16(N, 1);
+    i = (index >> tmp) & 1L;         /* i = (index >> (2*N)) & 1; */
+    pos2 = add_int16((int16)(index & mask), offset); /* pos2 = ((index & mask) + offset); */
+
+    if (pos2 < pos1)              /* ((pos2 - pos1) < 0) */
+    {
+        if (i == 1)
+        {                                  /* (i == 1) */
+            pos1 += NB_POS;      /* pos1 += NB_POS; */
+        }
+        else
+        {
+            pos2 += NB_POS;      /* pos2 += NB_POS;  */
+        }
+    }
+    else
+    {
+        if (i == 1)
+        {                                  /* (i == 1) */
+            pos1 += NB_POS;      /* pos1 += NB_POS; */
+            pos2 += NB_POS;      /* pos2 += NB_POS; */
+        }
+    }
+
+    pos[0] = pos1;
+    pos[1] = pos2;
+
+    return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_3p_3N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 j, tmp;
+    int32 mask, idx;
+
+    /*-------------------------------------------------------*
+     * Decode 3 pulses with 3*N+1 bits:                      *
+     *-------------------------------------------------------*/
+    tmp = sub_int16(shl_int16(N, 1), 1);               /* mask = ((1<<((2*N)-1))-1); */
+
+    mask = ((1 << ((2 * N) - 1)) - 1);
+
+    idx = index & mask;
+    j = offset;
+    tmp = (N << 1) - 1;
+
+
+    if (((index >> tmp) & 1L) != 0L)
+    {                                      /* if (((index >> ((2*N)-1)) & 1) == 1){ */
+        j += (1 << (N - 1)); /* j += (1<<(N-1)); */
+    }
+    dec_2p_2N1(idx, (int16)(N - 1), j, pos);
+
+    mask = ((1 << (N + 1)) - 1);
+    tmp = N << 1;                     /* idx = (index >> (2*N)) & mask; */
+    idx = (index >> tmp) & mask;
+
+    dec_1p_N1(idx, N, offset, pos + 2);
+
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_4p_4N1(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 j, tmp;
+    int32 mask, idx;
+
+    /*-------------------------------------------------------*
+     * Decode 4 pulses with 4*N+1 bits:                      *
+     *-------------------------------------------------------*/
+    tmp = (N << 1) - 1;
+    mask = (1L << tmp) - 1L;
+    idx = index & mask;
+    j = offset;
+    tmp = (N << 1) - 1;
+
+
+    if (((index >> tmp) & 1L) != 0L)
+    {                                      /* (((index >> ((2*N)-1)) & 1) == 1) */
+        j += (1 << (N - 1)); /* j += (1<<(N-1)); */
+    }
+    dec_2p_2N1(idx, (int16)(N - 1), j, pos);
+
+
+    tmp = (N << 1) + 1;             /* mask = ((1<<((2*N)+1))-1); */
+    mask = (1L << tmp) - 1L;
+    idx = (index >> (N << 1)) & mask;   /* idx = (index >> (2*N)) & mask; */
+    dec_2p_2N1(idx, N, offset, pos + 2);      /* dec_2p_2N1(idx, N, offset, pos+2); */
+
+    return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_4p_4N(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 j, n_1, tmp;
+
+    /*-------------------------------------------------------*
+     * Decode 4 pulses with 4*N bits:                        *
+     *-------------------------------------------------------*/
+
+    n_1 = N - 1;
+    j = offset + (1 << n_1);          /* j = offset + (1 << n_1); */
+
+    tmp = (N << 2) - 2;
+
+    switch ((index >> tmp) & 3)
+    {                                      /* ((index >> ((4*N)-2)) & 3) */
+        case 0:
+            tmp = (n_1 << 2) + 1;
+
+            if ((index >> tmp) & 1)
+            {                                  /* (((index >> ((4*n_1)+1)) & 1) == 0) */
+                dec_4p_4N1(index, n_1, j, pos);
+            }
+            else
+            {
+                dec_4p_4N1(index, n_1, offset, pos);
+            }
+            break;
+        case 1:
+            tmp = (3 * n_1) + 1; /* dec_1p_N1((index>>((3*n_1)+1)), n_1, offset, pos) */
+            dec_1p_N1(index >> tmp, n_1, offset, pos);
+            dec_3p_3N1(index, n_1, j, pos + 1);
+            break;
+        case 2:
+            tmp = (n_1 << 1) + 1;       /* dec_2p_2N1((index>>((2*n_1)+1)), n_1, offset, pos); */
+            dec_2p_2N1(index >> tmp, n_1, offset, pos);
+            dec_2p_2N1(index, n_1, j, pos + 2);
+            break;
+        case 3:
+            tmp = n_1 + 1;                 /* dec_3p_3N1((index>>(n_1+1)), n_1, offset, pos); */
+            dec_3p_3N1(index >> tmp, n_1, offset, pos);
+            dec_1p_N1(index, n_1, j, pos + 3);
+            break;
+    }
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_5p_5N(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 j, n_1, tmp;
+    int32 idx;
+
+    /*-------------------------------------------------------*
+     * Decode 5 pulses with 5*N bits:                        *
+     *-------------------------------------------------------*/
+
+    n_1 = (int16)(N - 1);
+    j = add_int16(offset, shl_int16(1, n_1));          /* j = offset + (1 << n_1); */
+    tmp = (N << 1) + 1;             /* idx = (index >> ((2*N)+1)); */
+    idx = index >> tmp;
+    tmp = (5 * N) - 1;    /* ((5*N)-1)) */
+
+
+    if ((index >> tmp) & 1)    /* ((index >> ((5*N)-1)) & 1)  */
+    {
+        dec_3p_3N1(idx, n_1, j, pos);
+        dec_2p_2N1(index, N, offset, pos + 3);
+    }
+    else
+    {
+        dec_3p_3N1(idx, n_1, offset, pos);
+        dec_2p_2N1(index, N, offset, pos + 3);
+    }
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_6p_6N_2(int32 index, int16 N, int16 offset, int16 pos[])
+{
+    int16 j, n_1, offsetA, offsetB;
+
+    n_1 = N - 1;
+    j = offset + (1 << n_1);       /* j = offset + (1 << n_1); */
+
+
+    /* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
+
+    offsetA = offsetB = j;
+
+    if (((index >> (6*N - 5)) & 1L) == 0)
+    {                                      /* if (((index >> ((6*N)-5)) & 1) == 0) */
+        offsetA = offset;
+    }
+    else
+    {
+        offsetB = offset;
+    }
+
+
+    switch ((index >> (6*N - 4)) & 3)
+    {                                      /* (index >> ((6*N)-4)) & 3 */
+        case 0:
+            dec_5p_5N(index >> N, n_1, offsetA, pos);  /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
+            dec_1p_N1(index, n_1, offsetA, pos + 5);
+            break;
+        case 1:
+            dec_5p_5N(index >> N, n_1, offsetA, pos);  /* dec_5p_5N(index>>N, n_1, offsetA, pos); */
+            dec_1p_N1(index, n_1, offsetB, pos + 5);
+            break;
+        case 2:
+            dec_4p_4N(index >> (2*n_1 + 1), n_1, offsetA, pos); /* dec_4p_4N(index>>((2*n_1)+1 ), n_1, offsetA, pos); */
+            dec_2p_2N1(index, n_1, offsetB, pos + 4);
+            break;
+        case 3:
+            dec_3p_3N1(index >> (3*n_1 + 1), n_1, offset, pos); /* dec_3p_3N1(index>>((3*n_1)+ 1), n_1, offset, pos); */
+            dec_3p_3N1(index, n_1, j, pos + 3);
+            break;
+    }
+    return;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/dec_gain2_amr_wb.cpp b/media/libstagefright/codecs/amrwb/src/dec_gain2_amr_wb.cpp
new file mode 100644
index 0000000..8cae559
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dec_gain2_amr_wb.cpp
@@ -0,0 +1,404 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dec_gain2_amr_wb.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 index,                 (i)     : index of quantization.
+     int16 nbits,                 (i)     : number of bits (6 or 7)
+     int16 code[],                (i) Q9  : Innovative vector.
+     int16 L_subfr,               (i)     : Subframe lenght.
+     int16 * gain_pit,            (o) Q14 : Pitch gain.
+     int32 * gain_cod,            (o) Q16 : Code gain.
+     int16 bfi,                   (i)     : bad frame indicator
+     int16 prev_bfi,              (i)     : Previous BF indicator
+     int16 state,                 (i)     : State of BFH
+     int16 unusable_frame,        (i)     : UF indicator
+     int16 vad_hist,              (i)     : number of non-speech frames
+     int16 * mem                  (i/o)   : static memory (4 words)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Decode the pitch and codebook gains
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+#include "qisf_ns.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define MEAN_ENER    30
+#define PRED_ORDER   4
+
+#define L_LTPHIST 5
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+const int16 pdown_unusable[7] = {32767, 31130, 29491, 24576, 7537, 1638, 328};
+const int16 cdown_unusable[7] = {32767, 16384, 8192, 8192, 8192, 4915, 3277};
+
+const int16 pdown_usable[7] = {32767, 32113, 31457, 24576, 7537, 1638, 328};
+const int16 cdown_usable[7] = {32767, 32113, 32113, 32113, 32113, 32113, 22938};
+
+
+/* MA prediction coeff ={0.5, 0.4, 0.3, 0.2} in Q13 */
+const int16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+/* output  :static memory (4 words)      */
+void dec_gain2_amr_wb_init(int16 * mem)
+{
+
+    /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */
+    mem[0] = -14336;                          /* past_qua_en[0] */
+    mem[1] = -14336;                          /* past_qua_en[1] */
+    mem[2] = -14336;                          /* past_qua_en[2] */
+    mem[3] = -14336;                          /* past_qua_en[3] */
+    /* 4  *past_gain_pit  */
+    /* 5  *past_gain_code  */
+    /* 6  *prev_gc  */
+    /* next 5  pbuf[]  */
+    /* next 5  gbuf[]  */
+    /* next 5  pbuf2[]  */
+    pv_memset((void *)&mem[4], 0, 18*sizeof(*mem));
+
+    mem[22] = 21845;
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dec_gain2_amr_wb(
+    int16 index,               /* (i)     : index of quantization.      */
+    int16 nbits,               /* (i)     : number of bits (6 or 7)     */
+    int16 code[],              /* (i) Q9  : Innovative vector.          */
+    int16 L_subfr,             /* (i)     : Subframe lenght.            */
+    int16 * gain_pit,          /* (o) Q14 : Pitch gain.                 */
+    int32 * gain_cod,          /* (o) Q16 : Code gain.                  */
+    int16 bfi,                 /* (i)     : bad frame indicator         */
+    int16 prev_bfi,            /* (i)     : Previous BF indicator       */
+    int16 state,               /* (i)     : State of BFH                */
+    int16 unusable_frame,      /* (i)     : UF indicator                */
+    int16 vad_hist,            /* (i)     : number of non-speech frames */
+    int16 * mem                /* (i/o)   : static memory (4 words)     */
+)
+{
+    const int16 *p;
+    int16 *past_gain_pit, *past_gain_code, *past_qua_en, *gbuf, *pbuf, *prev_gc;
+    int16 *pbuf2;
+    int16 i, tmp, exp, frac, gcode0, exp_gcode0, qua_ener, gcode_inov;
+    int16 tmp1, g_code;
+    int16 tmp2;
+    int32 L_tmp;
+
+    past_qua_en = mem;
+    past_gain_pit = mem + 4;
+    past_gain_code = mem + 5;
+    prev_gc = mem + 6;
+    pbuf = mem + 7;
+    gbuf = mem + 12;
+    pbuf2 = mem + 17;
+
+    /*
+     *  Find energy of code and compute:
+     *
+     *    L_tmp = 1.0 / sqrt(energy of code/ L_subfr)
+     */
+
+    L_tmp = Dot_product12(code, code, L_subfr, &exp);
+    exp -= 24;                /* exp: -18 (code in Q9), -6 (/L_subfr) */
+
+    one_ov_sqrt_norm(&L_tmp, &exp);
+
+    gcode_inov = extract_h(shl_int32(L_tmp, exp - 3));  /* g_code_inov in Q12 */
+
+    /*
+     * Case of erasure.
+     */
+
+    if (bfi != 0)
+    {
+        tmp = median5(&pbuf[2]);
+        *past_gain_pit = tmp;
+
+        if (*past_gain_pit > 15565)
+        {
+            *past_gain_pit = 15565;        /* 0.95 in Q14 */
+
+        }
+
+        if (unusable_frame != 0)
+        {
+            *gain_pit = mult_int16(pdown_unusable[state], *past_gain_pit);
+        }
+        else
+        {
+            *gain_pit = mult_int16(pdown_usable[state], *past_gain_pit);
+        }
+        tmp = median5(&gbuf[2]);
+
+        if (vad_hist > 2)
+        {
+            *past_gain_code = tmp;
+        }
+        else
+        {
+
+            if (unusable_frame != 0)
+            {
+                *past_gain_code = mult_int16(cdown_unusable[state], tmp);
+            }
+            else
+            {
+                *past_gain_code = mult_int16(cdown_usable[state], tmp);
+            }
+        }
+
+        /* update table of past quantized energies */
+
+        tmp  = past_qua_en[3];
+        tmp1 = past_qua_en[2];
+        L_tmp  = tmp;
+        L_tmp += tmp1;
+        past_qua_en[3] = tmp;
+        tmp  = past_qua_en[1];
+        tmp1 = past_qua_en[0];
+        L_tmp += tmp;
+        L_tmp += tmp1;
+        past_qua_en[2] = tmp;
+        qua_ener = (int16)(L_tmp >> 3);
+        past_qua_en[1] = tmp1;
+
+
+        qua_ener -= 3072;    /* -3 in Q10 */
+
+        if (qua_ener < -14336)
+        {
+            qua_ener = -14336;                /* -14 in Q10 */
+        }
+
+        past_qua_en[0] = qua_ener;
+
+
+        for (i = 1; i < 5; i++)
+        {
+            gbuf[i - 1] = gbuf[i];
+            pbuf[i - 1] = pbuf[i];
+        }
+        gbuf[4] = *past_gain_code;
+        pbuf[4] = *past_gain_pit;
+
+
+        /* adjust gain according to energy of code */
+        /* past_gain_code(Q3) * gcode_inov(Q12) => Q16 */
+        *gain_cod = mul_16by16_to_int32(*past_gain_code, gcode_inov);
+
+        return;
+    }
+    /*
+     * Compute gcode0
+     *  = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code
+     */
+
+    L_tmp = L_deposit_h(MEAN_ENER);        /* MEAN_ENER in Q16 */
+    L_tmp = shl_int32(L_tmp, 8);               /* From Q16 to Q24 */
+    L_tmp = mac_16by16_to_int32(L_tmp, pred[0], past_qua_en[0]);      /* Q13*Q10 -> Q24 */
+    L_tmp = mac_16by16_to_int32(L_tmp, pred[1], past_qua_en[1]);      /* Q13*Q10 -> Q24 */
+    L_tmp = mac_16by16_to_int32(L_tmp, pred[2], past_qua_en[2]);      /* Q13*Q10 -> Q24 */
+    L_tmp = mac_16by16_to_int32(L_tmp, pred[3], past_qua_en[3]);      /* 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 = ((int32)gcode0 * 5443) >> 7;      /* *0.166096 in Q15 -> Q24     */
+
+    int32_to_dpf(L_tmp, &exp_gcode0, &frac);  /* Extract exponant of gcode0  */
+
+    gcode0 = (int16)(power_of_2(14, frac));    /* Put 14 as exponant so that  */
+    /* output of Pow2() will be:   */
+    /* 16384 < Pow2() <= 32767     */
+    exp_gcode0 -= 14;
+
+    /* Read the quantized gains */
+
+    if (nbits == 6)
+    {
+        p = &t_qua_gain6b[index<<1];
+    }
+    else
+    {
+        p = &t_qua_gain7b[index<<1];
+    }
+    *gain_pit = *p++;                         /* selected pitch gain in Q14 */
+    g_code = *p++;                            /* selected code gain in Q11  */
+
+    L_tmp = mul_16by16_to_int32(g_code, gcode0);        /* Q11*Q0 -> Q12 */
+    L_tmp = shl_int32(L_tmp, exp_gcode0 + 4);   /* Q12 -> Q16 */
+
+    *gain_cod = L_tmp;                        /* gain of code in Q16 */
+
+    if (prev_bfi == 1)
+    {
+        L_tmp = mul_16by16_to_int32(*prev_gc, 5120);    /* prev_gc(Q3) * 1.25(Q12) = Q16 */
+        /* if((*gain_cod > ((*prev_gc) * 1.25)) && (*gain_cod > 100.0)) */
+
+        if ((*gain_cod > L_tmp) && (*gain_cod > 6553600))
+        {
+            *gain_cod = L_tmp;
+        }
+    }
+    /* keep past gain code in Q3 for frame erasure (can saturate) */
+    *past_gain_code = amr_wb_round(shl_int32(*gain_cod, 3));
+    *past_gain_pit = *gain_pit;
+
+
+    *prev_gc = *past_gain_code;
+    tmp  = gbuf[1];
+    tmp1 = pbuf[1];
+    tmp2 = pbuf2[1];
+    for (i = 1; i < 5; i++)
+    {
+        gbuf[i - 1]  = tmp;
+        pbuf[i - 1]  = tmp1;
+        pbuf2[i - 1] = tmp2;
+        tmp  = gbuf[i];
+        tmp1 = pbuf[i];
+        tmp2 = pbuf2[i];
+    }
+    gbuf[4] = *past_gain_code;
+    pbuf[4] = *past_gain_pit;
+    pbuf2[4] = *past_gain_pit;
+
+
+    /* adjust gain according to energy of code */
+    int32_to_dpf(*gain_cod, &exp, &frac);
+    L_tmp = mul_32by16(exp, frac, gcode_inov);
+
+    *gain_cod = shl_int32(L_tmp, 3);              /* gcode_inov in Q12 */
+
+
+    past_qua_en[3] = past_qua_en[2];
+    past_qua_en[2] = past_qua_en[1];
+    past_qua_en[1] = past_qua_en[0];
+
+    /*
+     * qua_ener = 20*log10(g_code)
+     *          = 6.0206*log2(g_code)
+     *          = 6.0206*(log2(g_codeQ11) - 11)
+     */
+    L_tmp = (int32)g_code;
+    amrwb_log_2(L_tmp, &exp, &frac);
+    exp -= 11;
+    L_tmp = mul_32by16(exp, frac, 24660);   /* x 6.0206 in Q12 */
+
+    /* update table of past quantized energies */
+
+    past_qua_en[0] = (int16)(L_tmp >> 3); /* result in Q10 */
+
+    return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/deemphasis_32.cpp b/media/libstagefright/codecs/amrwb/src/deemphasis_32.cpp
new file mode 100644
index 0000000..b80555b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/deemphasis_32.cpp
@@ -0,0 +1,166 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: deemphasis_32.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 x_hi[],               (i)     : input signal (bit31..16)
+     int16 x_lo[],               (i)     : input signal (bit15..4)
+     int16 y[],                  (o)     : output signal (x16)
+     int16 mu,                   (i) Q15 : deemphasis factor
+     int16 L,                    (i)     : vector size
+     int16 * mem                 (i/o)   : memory (y[-1])
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    32-bits filtering through 1/(1-mu z^-1)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    Deemphasis H(z) = 1/(1 - 0.68z^(-1))   where mu = 0.67999 in Q15
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void deemphasis_32(
+    int16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+    int16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+    int16 y[],                           /* (o)     : output signal (x16)      */
+    int16 mu,                            /* (i) Q15 : deemphasis factor        */
+    int16 L,                             /* (i)     : vector size              */
+    int16 * mem                          /* (i/o)   : memory (y[-1])           */
+)
+{
+    int16 i;
+    int32 L_tmp;
+    int16 lo, hi;
+
+    L_tmp  = ((int32)x_hi[0]) << 16;
+    L_tmp += ((int32)x_lo[0]) << 4;
+    L_tmp  = shl_int32(L_tmp, 3);
+
+    L_tmp = fxp_mac_16by16(*mem, mu, L_tmp),
+
+            L_tmp = shl_int32(L_tmp, 1);               /* saturation can occur here */
+    y[0] = amr_wb_round(L_tmp);
+
+    lo = x_lo[1];
+    hi = x_hi[1];
+    for (i = 1; i < L - 1; i++)
+    {
+        L_tmp  = ((int32)hi) << 16;
+        L_tmp += ((int32)lo) << 4;
+        L_tmp  = shl_int32(L_tmp, 3);
+        L_tmp  = fxp_mac_16by16(y[i - 1], mu, L_tmp),
+                 L_tmp  = shl_int32(L_tmp, 1);           /* saturation can occur here */
+        y[i]   = amr_wb_round(L_tmp);
+        lo     = x_lo[i+1];
+        hi     = x_hi[i+1];
+    }
+    L_tmp  = ((int32)hi) << 16;
+    L_tmp += ((int32)lo) << 4;
+    L_tmp  = shl_int32(L_tmp, 3);
+    L_tmp  = fxp_mac_16by16(y[i - 1], mu, L_tmp),
+             L_tmp  = shl_int32(L_tmp, 1);           /* saturation can occur here */
+    y[i]   = amr_wb_round(L_tmp);
+
+    *mem = y[L - 1];
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/dtx.h b/media/libstagefright/codecs/amrwb/src/dtx.h
new file mode 100644
index 0000000..a81f089
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dtx.h
@@ -0,0 +1,242 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/dtx.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+    Static memory, constants and frametypes for the DTX
+------------------------------------------------------------------------------
+*/
+#ifndef DTX_H
+#define DTX_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+#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
+    {
+        int16 isf_hist[M * DTX_HIST_SIZE];
+        int16 log_en_hist[DTX_HIST_SIZE];
+        int16 hist_ptr;
+        int16 log_en_index;
+        int16 cng_seed;
+
+        /* DTX handler stuff */
+        int16 dtxHangoverCount;
+        int16 decAnaElapsedCount;
+        int32 D[28];
+        int32 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
+     *****************************************************************************/
+
+    typedef struct
+    {
+        int16 since_last_sid;
+        int16 true_sid_period_inv;
+        int16 log_en;
+        int16 old_log_en;
+        int16 level;
+        int16 isf[M];
+        int16 isf_old[M];
+        int16 cng_seed;
+
+        int16 isf_hist[M * DTX_HIST_SIZE];
+        int16 log_en_hist[DTX_HIST_SIZE];
+        int16 hist_ptr;
+
+        int16 dtxHangoverCount;
+        int16 decAnaElapsedCount;
+
+        int16 sid_frame;
+        int16 valid_data;
+        int16 dtxHangoverAdded;
+
+        int16 dtxGlobalState;                 /* contains previous state */
+        /* updated in main decoder */
+
+        int16 data_updated;                   /* marker to know if CNI data is ever renewed */
+
+        int16 dither_seed;
+        int16 CN_dith;
+
+    } dtx_decState;
+
+    int16 dtx_enc_init(dtx_encState ** st, int16 isf_init[]);
+    int16 dtx_enc_reset(dtx_encState * st, int16 isf_init[]);
+    void dtx_enc_exit(dtx_encState ** st);
+
+    int16 dtx_enc(
+        dtx_encState * st,                    /* i/o : State struct                                         */
+        int16 isf[M],                        /* o   : CN ISF vector                                        */
+        int16 * exc2,                        /* o   : CN excitation                                        */
+        int16 ** prms
+    );
+
+    int16 dtx_buffer(
+        dtx_encState * st,                    /* i/o : State struct                    */
+        int16 isf_new[],                     /* i   : isf vector                      */
+        int32 enr,                           /* i   : residual energy (in L_FRAME)    */
+        int16 codec_mode
+    );
+
+    void tx_dtx_handler(dtx_encState * st,     /* i/o : State struct           */
+                        int16 vad_flag,                      /* i   : vad decision           */
+                        int16 * usedMode                     /* i/o : mode changed or not    */
+                       );
+
+    void Qisf_ns(
+        int16 * isf1,                        /* input : ISF in the frequency domain (0..0.5) */
+        int16 * isf_q,                       /* output: quantized ISF                        */
+        int16 * indice                       /* output: quantization indices                 */
+    );
+
+
+    int16 dtx_dec_amr_wb_reset(dtx_decState * st, const int16 isf_init[]);
+
+    int16 dtx_dec_amr_wb(
+        dtx_decState * st,                    /* i/o : State struct                                          */
+        int16 * exc2,                        /* o   : CN excitation                                          */
+        int16 new_state,                     /* i   : New DTX state                                          */
+        int16 isf[],                         /* o   : CN ISF vector                                          */
+        int16 ** prms
+    );
+
+    void dtx_dec_amr_wb_activity_update(
+        dtx_decState * st,
+        int16 isf[],
+        int16 exc[]);
+
+
+    int16 rx_amr_wb_dtx_handler(
+        dtx_decState * st,                    /* i/o : State struct     */
+        int16 frame_type                     /* i   : Frame type       */
+    );
+
+    void Disf_ns(
+        int16 * indice,                      /* input:  quantization indices                  */
+        int16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
+    );
+
+    void aver_isf_history(
+        int16 isf_old[],
+        int16 indices[],
+        int32 isf_aver[]
+    );
+    void find_frame_indices(
+        int16 isf_old_tx[],
+        int16 indices[],
+        dtx_encState * st
+    );
+
+    int16 dithering_control(
+        dtx_encState * st
+    );
+    void CN_dithering(
+        int16 isf[M],
+        int32 * L_log_en_int,
+        int16 * dither_seed
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /*  DTX_H  */
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/dtx_decoder_amr_wb.cpp b/media/libstagefright/codecs/amrwb/src/dtx_decoder_amr_wb.cpp
new file mode 100644
index 0000000..7c798cc
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/dtx_decoder_amr_wb.cpp
@@ -0,0 +1,984 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: dtx_decoder_amr_wb.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    DTX functions
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"  /* prototype of functions    */
+#include "get_amr_wb_bits.h"
+#include "dtx.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+/*
+ * Function    : dtx_dec_amr_wb_reset
+ */
+int16 dtx_dec_amr_wb_reset(dtx_decState * st, const int16 isf_init[])
+{
+    int16 i;
+
+
+    if (st == (dtx_decState *) NULL)
+    {
+        /* dtx_dec_amr_wb_reset invalid parameter */
+        return (-1);
+    }
+    st->since_last_sid = 0;
+    st->true_sid_period_inv = (1 << 13);      /* 0.25 in Q15 */
+
+    st->log_en = 3500;
+    st->old_log_en = 3500;
+    /* low level noise for better performance in  DTX handover cases */
+
+    st->cng_seed = RANDOM_INITSEED;
+
+    st->hist_ptr = 0;
+
+    /* Init isf_hist[] and decoder log frame energy */
+    pv_memcpy((void *)st->isf, (void *)isf_init, M*sizeof(*isf_init));
+
+    pv_memcpy((void *)st->isf_old, (void *)isf_init, M*sizeof(*isf_init));
+
+    for (i = 0; i < DTX_HIST_SIZE; i++)
+    {
+        pv_memcpy((void *)&st->isf_hist[i * M], (void *)isf_init, M*sizeof(*isf_init));
+        st->log_en_hist[i] = st->log_en;
+    }
+
+    st->dtxHangoverCount = DTX_HANG_CONST;
+    st->decAnaElapsedCount = 32767;
+
+    st->sid_frame = 0;
+    st->valid_data = 0;
+    st->dtxHangoverAdded = 0;
+
+    st->dtxGlobalState = SPEECH;
+    st->data_updated = 0;
+
+    st->dither_seed = RANDOM_INITSEED;
+    st->CN_dith = 0;
+
+    return 0;
+}
+
+
+/*
+     Table of new SPD synthesis states
+
+                           |     previous SPD_synthesis_state
+     Incoming              |
+     frame_type            | SPEECH       | DTX           | DTX_MUTE
+     ---------------------------------------------------------------
+     RX_SPEECH_GOOD ,      |              |               |
+     RX_SPEECH_PR_DEGRADED | SPEECH       | SPEECH        | SPEECH
+     ----------------------------------------------------------------
+     RX_SPEECH_BAD,        | SPEECH       | DTX           | DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_FIRST,         | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_UPDATE,        | DTX          | DTX           | DTX
+     ----------------------------------------------------------------
+     RX_SID_BAD,           | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_NO_DATA,           | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
+     RX_SPARE              |(class2 garb.)|               |
+     ----------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*
+ * Function    : dtx_dec_amr_wb
+ */
+int16 dtx_dec_amr_wb(
+    dtx_decState * st,                    /* i/o : State struct         */
+    int16 * exc2,                        /* o   : CN excitation        */
+    int16 new_state,                     /* i   : New DTX state        */
+    int16 isf[],                         /* o   : CN ISF vector        */
+    int16 ** prms
+)
+{
+    int16 log_en_index;
+    int16 ind[7];
+    int16 i, j;
+    int16 int_fac;
+    int16 gain;
+
+    int32 L_isf[M], L_log_en_int, level32, ener32;
+    int16 ptr;
+    int16 tmp_int_length;
+    int16 tmp, exp, exp0, log_en_int_e, log_en_int_m, level;
+
+    /* This function is called if synthesis state is not SPEECH the globally passed  inputs to this function
+     * are st->sid_frame st->valid_data st->dtxHangoverAdded new_state  (SPEECH, DTX, DTX_MUTE) */
+
+    if ((st->dtxHangoverAdded != 0) &&
+            (st->sid_frame != 0))
+    {
+        /* sid_first after dtx hangover period */
+        /* or sid_upd after dtxhangover        */
+
+        /* consider  twice the last frame */
+        ptr = st->hist_ptr + 1;
+
+        if (ptr == DTX_HIST_SIZE)
+            ptr = 0;
+
+        pv_memcpy((void *)&st->isf_hist[ptr * M], (void *)&st->isf_hist[st->hist_ptr * M], M*sizeof(*st->isf_hist));
+
+        st->log_en_hist[ptr] = st->log_en_hist[st->hist_ptr];
+
+        /* compute mean log energy and isf from decoded signal (SID_FIRST) */
+        st->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 */
+            st->log_en = add_int16(st->log_en, st->log_en_hist[i]);
+
+            for (j = 0; j < M; j++)
+            {
+                L_isf[j] = add_int32(L_isf[j], (int32)(st->isf_hist[i * M + j]));
+            }
+        }
+
+        /* st->log_en in Q9 */
+        st->log_en >>=  1;
+
+        /* Add 2 in Q9, in order to have only positive values for Pow2 */
+        /* this value is subtracted back after Pow2 function */
+        st->log_en += 1024;
+
+        if (st->log_en < 0)
+            st->log_en = 0;
+
+        for (j = 0; j < M; j++)
+        {
+            st->isf[j] = (int16)(L_isf[j] >> 3);  /* divide by 8 */
+        }
+
+    }
+
+    if (st->sid_frame != 0)
+    {
+        /* Set old SID parameters, always shift */
+        /* even if there is no new valid_data   */
+
+        pv_memcpy((void *)st->isf_old, (void *)st->isf, M*sizeof(*st->isf));
+
+        st->old_log_en = st->log_en;
+
+        if (st->valid_data != 0)           /* new data available (no CRC) */
+        {
+            /* st->true_sid_period_inv = 1.0f/st->since_last_sid; */
+            /* Compute interpolation factor, since the division only works * for values of since_last_sid <
+             * 32 we have to limit the      * interpolation to 32 frames                                  */
+            tmp_int_length = st->since_last_sid;
+
+
+            if (tmp_int_length > 32)
+            {
+                tmp_int_length = 32;
+            }
+
+            if (tmp_int_length >= 2)
+            {
+                st->true_sid_period_inv = div_16by16(1 << 10, shl_int16(tmp_int_length, 10));
+            }
+            else
+            {
+                st->true_sid_period_inv = 1 << 14;      /* 0.5 it Q15 */
+            }
+
+            ind[0] = Serial_parm(6, prms);
+            ind[1] = Serial_parm(6, prms);
+            ind[2] = Serial_parm(6, prms);
+            ind[3] = Serial_parm(5, prms);
+            ind[4] = Serial_parm(5, prms);
+
+            Disf_ns(ind, st->isf);
+
+            log_en_index = Serial_parm(6, prms);
+
+            /* read background noise stationarity information */
+            st->CN_dith = Serial_parm_1bit(prms);
+
+            /* st->log_en = (float)log_en_index / 2.625 - 2.0;  */
+            /* log2(E) in Q9 (log2(E) lies in between -2:22) */
+            st->log_en = shl_int16(log_en_index, 15 - 6);
+
+            /* Divide by 2.625  */
+            st->log_en = mult_int16(st->log_en, 12483);
+            /* Subtract 2 in Q9 is done later, after Pow2 function  */
+
+            /* no interpolation at startup after coder reset        */
+            /* or when SID_UPD has been received right after SPEECH */
+
+            if ((st->data_updated == 0) || (st->dtxGlobalState == SPEECH))
+            {
+                pv_memcpy((void *)st->isf_old, (void *)st->isf, M*sizeof(*st->isf));
+
+                st->old_log_en = st->log_en;
+            }
+        }                                  /* endif valid_data */
+    }                                      /* endif sid_frame */
+
+
+    if ((st->sid_frame != 0) && (st->valid_data != 0))
+    {
+        st->since_last_sid = 0;
+    }
+    /* Interpolate SID info */
+    int_fac = shl_int16(st->since_last_sid, 10); /* Q10 */
+    int_fac = mult_int16(int_fac, st->true_sid_period_inv);   /* Q10 * Q15 -> Q10 */
+
+    /* Maximize to 1.0 in Q10 */
+
+    if (int_fac > 1024)
+    {
+        int_fac = 1024;
+    }
+    int_fac = shl_int16(int_fac, 4);             /* Q10 -> Q14 */
+
+    L_log_en_int = mul_16by16_to_int32(int_fac, st->log_en); /* Q14 * Q9 -> Q24 */
+
+    for (i = 0; i < M; i++)
+    {
+        isf[i] = mult_int16(int_fac, st->isf[i]);/* Q14 * Q15 -> Q14 */
+    }
+
+    int_fac = 16384 - int_fac;         /* 1-k in Q14 */
+
+    /* ( Q14 * Q9 -> Q24 ) + Q24 -> Q24 */
+    L_log_en_int = mac_16by16_to_int32(L_log_en_int, int_fac, st->old_log_en);
+
+    for (i = 0; i < M; i++)
+    {
+        /* Q14 + (Q14 * Q15 -> Q14) -> Q14 */
+        isf[i] = add_int16(isf[i], mult_int16(int_fac, st->isf_old[i]));
+        isf[i] = shl_int16(isf[i], 1);           /* Q14 -> Q15 */
+    }
+
+    /* If background noise is non-stationary, insert comfort noise dithering */
+    if (st->CN_dith != 0)
+    {
+        CN_dithering(isf, &L_log_en_int, &st->dither_seed);
+    }
+    /* L_log_en_int corresponds to log2(E)+2 in Q24, i.e log2(gain)+1 in Q25 */
+    /* Q25 -> Q16 */
+    L_log_en_int >>= 9;
+
+    /* Find integer part  */
+    log_en_int_e = extract_h(L_log_en_int);
+
+    /* Find fractional part */
+    log_en_int_m = (int16)(sub_int32(L_log_en_int, L_deposit_h(log_en_int_e)) >> 1);
+
+    /* Subtract 2 from L_log_en_int 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 += 15;
+
+    /* level = (float)( pow( 2.0f, log_en ) );  */
+    level32 = power_of_2(log_en_int_e, log_en_int_m); /* Q16 */
+
+    exp0 = normalize_amr_wb(level32);
+    level32 <<= exp0;        /* level in Q31 */
+    exp0 = 15 - exp0;
+    level = (int16)(level32 >> 16);          /* level in Q15 */
+
+    /* generate white noise vector */
+    for (i = 0; i < L_FRAME; i++)
+    {
+        exc2[i] = noise_gen_amrwb(&(st->cng_seed)) >> 4;
+    }
+
+    /* gain = level / sqrt(ener) * sqrt(L_FRAME) */
+
+    /* energy of generated excitation */
+    ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);
+
+    one_ov_sqrt_norm(&ener32, &exp);
+
+    gain = extract_h(ener32);
+
+    gain = mult_int16(level, gain);              /* gain in Q15 */
+
+    exp += exp0;
+
+    /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */
+    exp += 4;
+
+    for (i = 0; i < L_FRAME; i++)
+    {
+        tmp = mult_int16(exc2[i], gain);         /* Q0 * Q15 */
+        exc2[i] = shl_int16(tmp, exp);
+    }
+
+
+    if (new_state == DTX_MUTE)
+    {
+        /* mute comfort noise as it has been quite a long time since last SID update  was performed                            */
+
+        tmp_int_length = st->since_last_sid;
+
+        if (tmp_int_length > 32)
+        {
+            tmp_int_length = 32;
+        }
+
+        st->true_sid_period_inv = div_16by16(1 << 10, shl_int16(tmp_int_length, 10));
+
+        st->since_last_sid = 0;
+        st->old_log_en = st->log_en;
+        /* subtract 1/8 in Q9 (energy), i.e -3/8 dB */
+        st->log_en -= 64;
+    }
+    /* reset interpolation length timer if data has been updated.        */
+
+    if ((st->sid_frame != 0) &&
+            ((st->valid_data != 0) ||
+             ((st->valid_data == 0) && (st->dtxHangoverAdded) != 0)))
+    {
+        st->since_last_sid = 0;
+        st->data_updated = 1;
+    }
+    return 0;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void dtx_dec_amr_wb_activity_update(
+    dtx_decState * st,
+    int16 isf[],
+    int16 exc[])
+{
+    int16 i;
+
+    int32 L_frame_en;
+    int16 log_en_e, log_en_m, log_en;
+
+
+    st->hist_ptr++;
+
+    if (st->hist_ptr == DTX_HIST_SIZE)
+    {
+        st->hist_ptr = 0;
+    }
+    pv_memcpy((void *)&st->isf_hist[st->hist_ptr * M], (void *)isf, M*sizeof(*isf));
+
+
+    /* compute log energy based on excitation frame energy in Q0 */
+    L_frame_en = 0;
+    for (i = 0; i < L_FRAME; i++)
+    {
+        L_frame_en = mac_16by16_to_int32(L_frame_en, exc[i], exc[i]);
+    }
+    L_frame_en >>= 1;
+
+    /* log_en = (float)log10(L_frame_en/(float)L_FRAME)/(float)log10(2.0f); */
+    amrwb_log_2(L_frame_en, &log_en_e, &log_en_m);
+
+    /* convert exponent and mantissa to int16 Q7. Q7 is used to simplify averaging in dtx_enc */
+    log_en = shl_int16(log_en_e, 7);             /* Q7 */
+    log_en += log_en_m >> 8;
+
+    /* Divide by L_FRAME = 256, i.e subtract 8 in Q7 = 1024 */
+    log_en -= 1024;
+
+    /* insert into log energy buffer */
+    st->log_en_hist[st->hist_ptr] = log_en;
+
+    return;
+}
+
+
+/*
+     Table of new SPD synthesis states
+
+                           |     previous SPD_synthesis_state
+     Incoming              |
+     frame_type            | SPEECH       | DTX           | DTX_MUTE
+     ---------------------------------------------------------------
+     RX_SPEECH_GOOD ,      |              |               |
+     RX_SPEECH_PR_DEGRADED | SPEECH       | SPEECH        | SPEECH
+     ----------------------------------------------------------------
+     RX_SPEECH_BAD,        | SPEECH       | DTX           | DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_FIRST,         | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_SID_UPDATE,        | DTX          | DTX           | DTX
+     ----------------------------------------------------------------
+     RX_SID_BAD,           | DTX          | DTX/(DTX_MUTE)| DTX_MUTE
+     ----------------------------------------------------------------
+     RX_NO_DATA,           | SPEECH       | DTX/(DTX_MUTE)| DTX_MUTE
+     RX_SPARE              |(class2 garb.)|               |
+     ----------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 rx_amr_wb_dtx_handler(
+    dtx_decState * st,                    /* i/o : State struct     */
+    int16 frame_type                     /* i   : Frame type       */
+)
+{
+    int16 newState;
+    int16 encState;
+
+    /* DTX if SID frame or previously in DTX{_MUTE} and (NO_RX OR BAD_SPEECH) */
+
+
+
+    if ((frame_type == RX_SID_FIRST)  ||
+            (frame_type == RX_SID_UPDATE) ||
+            (frame_type == RX_SID_BAD)    ||
+            (((st->dtxGlobalState == DTX) ||
+              (st->dtxGlobalState == DTX_MUTE)) &&
+             ((frame_type == RX_NO_DATA)    ||
+              (frame_type == RX_SPEECH_BAD) ||
+              (frame_type == RX_SPEECH_LOST))))
+    {
+        newState = DTX;
+
+        /* stay in mute for these input types */
+
+        if ((st->dtxGlobalState == DTX_MUTE) &&
+                ((frame_type == RX_SID_BAD) ||
+                 (frame_type == RX_SID_FIRST) ||
+                 (frame_type == RX_SPEECH_LOST) ||
+                 (frame_type == RX_NO_DATA)))
+        {
+            newState = DTX_MUTE;
+        }
+        /* evaluate if noise parameters are too old                     */
+        /* since_last_sid is reset when CN parameters have been updated */
+        st->since_last_sid = add_int16(st->since_last_sid, 1);
+
+        /* no update of sid parameters in DTX for a long while */
+
+        if (st->since_last_sid > DTX_MAX_EMPTY_THRESH)
+        {
+            newState = DTX_MUTE;
+        }
+    }
+    else
+    {
+        newState = SPEECH;
+        st->since_last_sid = 0;
+    }
+
+    /* reset the decAnaElapsed Counter when receiving CNI data the first time, to robustify counter missmatch
+     * after handover this might delay the bwd CNI analysis in the new decoder slightly. */
+
+    if ((st->data_updated == 0) &&
+            (frame_type == RX_SID_UPDATE))
+    {
+        st->decAnaElapsedCount = 0;
+    }
+    /* update the SPE-SPD DTX hangover synchronization */
+    /* to know when SPE has added dtx hangover         */
+    st->decAnaElapsedCount = add_int16(st->decAnaElapsedCount, 1);
+    st->dtxHangoverAdded = 0;
+
+
+    if ((frame_type == RX_SID_FIRST) ||
+            (frame_type == RX_SID_UPDATE) ||
+            (frame_type == RX_SID_BAD) ||
+            (frame_type == RX_NO_DATA))
+    {
+        encState = DTX;
+    }
+    else
+    {
+        encState = SPEECH;
+    }
+
+
+    if (encState == SPEECH)
+    {
+        st->dtxHangoverCount = DTX_HANG_CONST;
+    }
+    else
+    {
+
+        if (st->decAnaElapsedCount > DTX_ELAPSED_FRAMES_THRESH)
+        {
+            st->dtxHangoverAdded = 1;
+            st->decAnaElapsedCount = 0;
+            st->dtxHangoverCount = 0;
+        }
+        else if (st->dtxHangoverCount == 0)
+        {
+            st->decAnaElapsedCount = 0;
+        }
+        else
+        {
+            st->dtxHangoverCount--;
+        }
+    }
+
+    if (newState != SPEECH)
+    {
+        /* DTX or DTX_MUTE CN data is not in a first SID, first SIDs are marked as SID_BAD but will do
+         * backwards analysis if a hangover period has been added according to the state machine above */
+
+        st->sid_frame = 0;
+        st->valid_data = 0;
+
+
+        if (frame_type == RX_SID_FIRST)
+        {
+            st->sid_frame = 1;
+        }
+        else if (frame_type == RX_SID_UPDATE)
+        {
+            st->sid_frame = 1;
+            st->valid_data = 1;
+        }
+        else if (frame_type == RX_SID_BAD)
+        {
+            st->sid_frame = 1;
+            st->dtxHangoverAdded = 0;      /* use old data */
+        }
+    }
+    return newState;
+    /* newState is used by both SPEECH AND DTX synthesis routines */
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void aver_isf_history(
+    int16 isf_old[],
+    int16 indices[],
+    int32 isf_aver[]
+)
+{
+    int16 i, j, k;
+    int16 isf_tmp[2 * M];
+    int32 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 = add_int32(L_tmp, (int32)(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;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void find_frame_indices(
+    int16 isf_old_tx[],
+    int16 indices[],
+    dtx_encState * st
+)
+{
+    int32 L_tmp, summin, summax, summax2nd;
+    int16 i, j, tmp;
+    int16 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 += tmp;
+        st->sumD[i] = sub_int32(st->sumD[i], st->D[j]);
+        tmp--;
+    }
+
+    /* 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 -= tmp)
+    {
+        tmp++;
+        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--;
+
+        if (ptr < 0)
+        {
+            ptr = DTX_HIST_SIZE_MIN_ONE;
+        }
+        L_tmp = 0;
+        for (j = 0; j < M; j++)
+        {
+            tmp = sub_int16(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);
+            L_tmp = mac_16by16_to_int32(L_tmp, tmp, tmp);
+        }
+        st->D[i - 1] = L_tmp;
+
+        /* Update also the column sums. */
+        st->sumD[0] = add_int32(st->sumD[0], st->D[i - 1]);
+        st->sumD[i] = add_int32(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 (st->sumD[i] > summax)
+        {
+            indices[0] = i;
+            summax = st->sumD[i];
+        }
+
+        if (st->sumD[i] < summin)
+        {
+            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 ((st->sumD[i] > summax2nd) && (i != indices[0]))
+        {
+            indices[1] = i;
+            summax2nd = st->sumD[i];
+        }
+    }
+
+    for (i = 0; i < 3; i++)
+    {
+        indices[i] = sub_int16(st->hist_ptr, indices[i]);
+
+        if (indices[i] < 0)
+        {
+            indices[i] = add_int16(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 = normalize_amr_wb(summax);
+    summax <<= tmp;
+    summin <<= tmp;
+    L_tmp = mul_16by16_to_int32(amr_wb_round(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 = shl_int32(summax2nd, tmp);
+    L_tmp = mul_16by16_to_int32(amr_wb_round(summax2nd), INV_MED_THRESH);
+
+    if (L_tmp <= summin)
+    {
+        indices[1] = -1;
+    }
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 dithering_control(dtx_encState * st)
+{
+    int16 i, tmp, mean, CN_dith, gain_diff;
+    int32 ISF_diff;
+
+    /* determine how stationary the spectrum of background noise is */
+    ISF_diff = 0;
+    for (i = 0; i < 8; i++)
+    {
+        ISF_diff = add_int32(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_int16(mean, st->log_en_hist[i]);
+    }
+    mean >>= 3;
+    gain_diff = 0;
+    for (i = 0; i < DTX_HIST_SIZE; i++)
+    {
+        tmp = sub_int16(st->log_en_hist[i], mean);
+        tmp = tmp - (tmp < 0);
+
+        gain_diff += tmp ^(tmp >> 15);    /*  tmp ^sign(tmp)  */;
+    }
+    if (gain_diff > GAIN_THR)
+    {
+        CN_dith = 1;
+    }
+    return CN_dith;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void CN_dithering(
+    int16 isf[M],
+    int32 * L_log_en_int,
+    int16 * dither_seed
+)
+{
+    int16 temp, temp1, i, dither_fac, rand_dith;
+    int16 rand_dith2;
+
+    /* Insert comfort noise dithering for energy parameter */
+    rand_dith = noise_gen_amrwb(dither_seed) >> 1;
+    rand_dith2 = noise_gen_amrwb(dither_seed) >> 1;
+    rand_dith += rand_dith2;
+    *L_log_en_int = add_int32(*L_log_en_int, mul_16by16_to_int32(rand_dith, GAIN_FACTOR));
+
+    if (*L_log_en_int < 0)
+    {
+        *L_log_en_int = 0;
+    }
+    /* Insert comfort noise dithering for spectral parameters (ISF-vector) */
+    dither_fac = ISF_FACTOR_LOW;
+
+    rand_dith = noise_gen_amrwb(dither_seed) >> 1;
+    rand_dith2 = noise_gen_amrwb(dither_seed) >> 1;
+    rand_dith +=  rand_dith2;
+    temp = add_int16(isf[0], mult_int16_r(rand_dith, dither_fac));
+
+    /* Make sure that isf[0] will not get negative values */
+    if (temp < ISF_GAP)
+    {
+        isf[0] = ISF_GAP;
+    }
+    else
+    {
+        isf[0] = temp;
+    }
+
+    for (i = 1; i < M - 1; i++)
+    {
+        dither_fac = add_int16(dither_fac, ISF_FACTOR_STEP);
+
+        rand_dith = noise_gen_amrwb(dither_seed) >> 1;
+        rand_dith2 = noise_gen_amrwb(dither_seed) >> 1;
+        rand_dith +=  rand_dith2;
+        temp = add_int16(isf[i], mult_int16_r(rand_dith, dither_fac));
+        temp1 = sub_int16(temp, isf[i - 1]);
+
+        /* Make sure that isf spacing remains at least ISF_DITH_GAP Hz */
+        if (temp1 < ISF_DITH_GAP)
+        {
+            isf[i] = isf[i - 1] + ISF_DITH_GAP;
+        }
+        else
+        {
+            isf[i] = temp;
+        }
+    }
+
+    /* Make sure that isf[M-2] will not get values above 16384 */
+    if (isf[M - 2] > 16384)
+    {
+        isf[M - 2] = 16384;
+    }
+    return;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/e_pv_amrwbdec.h b/media/libstagefright/codecs/amrwb/src/e_pv_amrwbdec.h
new file mode 100644
index 0000000..251a3ce
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/e_pv_amrwbdec.h
@@ -0,0 +1,136 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+
+ Filename: e_pv_amrwbdec.h
+ Funtions:
+
+
+     Date: 05/03/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_PV_AMRWBDEC_H
+#define E_PV_AMRWBDEC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvamrwbdecoder_cnst.h"             /* coder constant parameters */
+#include "dtx.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+typedef struct
+{
+    int16 old_exc[PIT_MAX + L_INTERPOL];  /* old excitation vector */
+    int16 ispold[M];                      /* old isp (immittance spectral pairs)*/
+    int16 isfold[M];                      /* old isf (frequency domain) */
+    int16 isf_buf[L_MEANBUF * M];         /* isf buffer(frequency domain) */
+    int16 past_isfq[M];                   /* past isf quantizer */
+    int16 tilt_code;                      /* tilt of code */
+    int16 Q_old;                          /* old scaling factor */
+    int16 Qsubfr[4];                      /* old maximum scaling factor */
+    int32 L_gc_thres;                     /* threshold for noise enhancer */
+    int16 mem_syn_hi[M];                  /* modified synthesis memory (MSB) */
+    int16 mem_syn_lo[M];                  /* modified synthesis memory (LSB) */
+    int16 mem_deemph;                     /* speech deemph filter memory */
+    int16 mem_sig_out[6];                 /* hp50 filter memory for synthesis */
+    int16 mem_oversamp[2 * L_FILT];       /* synthesis oversampled filter memory */
+    int16 mem_syn_hf[M16k];               /* HF synthesis memory */
+    int16 mem_hf[2 * L_FILT16k];          /* HF band-pass filter memory */
+    int16 mem_hf2[2 * L_FILT16k];         /* HF band-pass filter memory */
+    int16 mem_hf3[2 * L_FILT16k];         /* HF band-pass filter memory */
+    int16 seed;                           /* random memory for frame erasure */
+    int16 seed2;                          /* random memory for HF generation */
+    int16 old_T0;                         /* old pitch lag */
+    int16 old_T0_frac;                    /* old pitch fraction lag */
+    int16 lag_hist[5];
+    int16 dec_gain[23];                   /* gain decoder memory */
+    int16 seed3;                          /* random memory for lag concealment */
+    int16 disp_mem[8];                    /* phase dispersion memory */
+    int16 mem_hp400[6];                   /* hp400 filter memory for synthesis */
+
+    int16 prev_bfi;
+    int16 state;
+    int16 first_frame;
+    dtx_decState dtx_decSt;
+    int16 vad_hist;
+
+} Decoder_State;
+
+typedef struct
+{
+    Decoder_State state;
+    int16 ScratchMem[L_SUBFR + L_SUBFR16k + ((L_SUBFR + M + M16k +1)<<1) + \
+                     (2*L_FRAME + 1) + PIT_MAX + L_INTERPOL + NB_SUBFR*(M+1) \
+                     + 3*(M+L_SUBFR) + M16k];
+} PV_AmrWbDec;
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.cpp b/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.cpp
new file mode 100644
index 0000000..d7287f3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.cpp
@@ -0,0 +1,163 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: get_amr_wb_bits.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 no_of_bits,        input : number of bits
+     int16 ** prms            bitstream pointer
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns no_of_bits from serial bit stream
+    Serial_parm -> convert serial stream to parameters
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "get_amr_wb_bits.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+int16 Serial_parm(                        /* Return the parameter    */
+    int16 no_of_bits,                    /* input : number of bits  */
+    int16 ** prms
+)
+{
+    int16 value = 0;
+
+    for (int16 i = no_of_bits >> 1; i != 0; i--)
+    {
+        value <<= 2;
+
+        if (*((*prms)++) == BIT_1)
+        {
+            value |= 2;
+        }
+
+        if (*((*prms)++) == BIT_1)
+        {
+            value |= 1;
+        }
+
+    }
+
+    if (no_of_bits&1)
+    {
+        value <<= 1;
+
+        if (*((*prms)++) == BIT_1)
+        {
+            value |= 1;
+        }
+
+    }
+
+    return (value);
+}
+
+
+int16 Serial_parm_1bit(int16 ** prms)                 /* Return the parameter    */
+{
+    int16 value = 0;
+
+    if (*((*prms)++) == BIT_1)
+    {
+        value = 1;
+    }
+    return (value);
+}
diff --git a/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.h b/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.h
new file mode 100644
index 0000000..48e43db
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/get_amr_wb_bits.h
@@ -0,0 +1,60 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*--------------------------------------------------------------------------*
+ *                       get_amr_wb_bits.h                                  *
+ *--------------------------------------------------------------------------*
+ *       Number of bits for different modes                                 *
+ *--------------------------------------------------------------------------*/
+
+#ifndef GET_AMR_WB_BITS_H
+#define GET_AMR_WB_BITS_H
+
+
+#include "pv_amr_wb_type_defs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    int16 Serial_parm(                        /* Return the parameter    */
+        int16 no_of_bits,                    /* input : number of bits  */
+        int16 ** prms
+    );
+
+    int16 Serial_parm_1bit(                        /* Return the parameter    */
+        int16 ** prms
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/amrwb/src/highpass_400hz_at_12k8.cpp b/media/libstagefright/codecs/amrwb/src/highpass_400hz_at_12k8.cpp
new file mode 100644
index 0000000..6503454
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/highpass_400hz_at_12k8.cpp
@@ -0,0 +1,201 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: highpass_400Hz_at_12k8.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 filter memory [6]
+
+
+------------------------------------------------------------------------------
+ FUNCTION 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];
+
+    int16 b[3] = {3660, -7320,  3660};       in Q12
+    int16 a[3] = {4096,  7320, -3540};       in Q12
+
+    float -->   b[3] = {0.893554687, -1.787109375,  0.893554687};
+                a[3] = {1.000000000,  1.787109375, -0.864257812};
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+/* Initialization of static values */
+
+void highpass_400Hz_at_12k8_init(int16 mem[])
+{
+    pv_memset((void *)mem, 0, 6*sizeof(*mem));
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void highpass_400Hz_at_12k8(
+    int16 signal[],                      /* input signal / output is divided by 16 */
+    int16 lg,                            /* lenght of signal    */
+    int16 mem[]                          /* filter memory [6]   */
+)
+{
+    int16 i, x2;
+    int16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+    int32 L_tmp1;
+    int32 L_tmp2;
+
+    y2_hi = mem[0];
+    y2_lo = mem[1];
+    y1_hi = mem[2];
+    y1_lo = mem[3];
+    x0    = mem[4];
+    x1    = mem[5];
+
+    for (i = 0; i < lg; i++)
+    {
+
+        /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[0]*x[i-2]  */
+        /* + a[0]*y[i-1] + a[1] * y[i-2];  */
+
+        L_tmp1 = fxp_mac_16by16(y1_lo, 29280, 8192L);
+        L_tmp2 = fxp_mul_16by16(y1_hi, 29280);
+        L_tmp1 = fxp_mac_16by16(y2_lo, -14160, L_tmp1);
+        L_tmp2 = fxp_mac_16by16(y2_hi, -14160, L_tmp2);
+        x2 = x1;
+        x1 = x0;
+        x0 = signal[i];
+        L_tmp2 = fxp_mac_16by16(x2, 915, L_tmp2);
+        L_tmp2 = fxp_mac_16by16(x1, -1830, L_tmp2);
+        L_tmp2 = fxp_mac_16by16(x0, 915, L_tmp2);
+
+        L_tmp1 = (L_tmp1 >> 13) + (L_tmp2 << 2);  /* coeff Q12 --> Q13 */
+
+        y2_hi = y1_hi;
+        y2_lo = y1_lo;
+        /* signal is divided by 16 to avoid overflow in energy computation */
+        signal[i] = (int16)((L_tmp1 + 0x00008000) >> 16);
+
+        y1_hi = (int16)(L_tmp1 >> 16);
+        y1_lo = (int16)((L_tmp1 - (y1_hi << 16)) >> 1);
+
+
+    }
+
+
+    mem[0] = y2_hi;
+    mem[1] = y2_lo;
+    mem[2] = y1_hi;
+    mem[3] = y1_lo;
+    mem[4] = x0;
+    mem[5] = x1;
+
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/highpass_50hz_at_12k8.cpp b/media/libstagefright/codecs/amrwb/src/highpass_50hz_at_12k8.cpp
new file mode 100644
index 0000000..c70c163
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/highpass_50hz_at_12k8.cpp
@@ -0,0 +1,205 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: highpass_50Hz_at_12k8.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 filter memory [6]
+
+
+------------------------------------------------------------------------------
+ FUNCTION 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];
+
+    int16 b[3] = {4053, -8106, 4053};         in Q12
+    int16 a[3] = {8192, 16211, -8021};        in Q12
+
+    float -->   b[3] = {0.989501953, -1.979003906,  0.989501953};
+                a[3] = {1.000000000,  1.978881836, -0.979125977};
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void highpass_50Hz_at_12k8_init(int16 mem[])
+{
+    pv_memset((void *)mem, 0, 6*sizeof(*mem));
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void highpass_50Hz_at_12k8(
+    int16 signal[],                      /* input/output signal */
+    int16 lg,                            /* lenght of signal    */
+    int16 mem[]                          /* filter memory [6]   */
+)
+{
+    int16 i, x2;
+    int16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+    int32 L_tmp1;
+    int32 L_tmp2;
+    int16 *pt_sign = signal;
+
+    y2_hi = mem[0];
+    y2_lo = mem[1];
+    y1_hi = mem[2];
+    y1_lo = mem[3];
+    x0    = mem[4];
+    x1    = mem[5];
+
+
+    for (i = lg; i != 0; i--)
+    {
+
+        /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b[0]*x[i-2]  */
+        /* + a[0]*y[i-1] + a[1] * y[i-2];  */
+
+        L_tmp1 = fxp_mac_16by16(y1_lo, 16211, 8192L);
+        L_tmp1 = fxp_mac_16by16(y2_lo, -8021, L_tmp1);
+        L_tmp2 = fxp_mul_16by16(y1_hi, 32422);
+        L_tmp2 = fxp_mac_16by16(y2_hi, -16042, L_tmp2);
+
+        x2 = x1;
+        x1 = x0;
+        x0 = *pt_sign;
+        L_tmp2 = fxp_mac_16by16(x2,  8106, L_tmp2);
+        L_tmp2 = fxp_mac_16by16(x1, -16212, L_tmp2);
+        L_tmp2 = fxp_mac_16by16(x0,  8106, L_tmp2);
+
+
+        L_tmp1 = ((L_tmp1 >> 14) + L_tmp2) << 2;
+
+        y2_hi = y1_hi;
+        y2_lo = y1_lo;
+        y1_hi = (int16)(L_tmp1 >> 16);
+        y1_lo = (int16)((L_tmp1 - (y1_hi << 16)) >> 1);
+
+        /* coeff Q14 --> Q15 with saturation */
+        *(pt_sign++) = amr_wb_shl1_round(L_tmp1);
+
+    }
+
+
+    mem[0] = y2_hi;
+    mem[1] = y2_lo;
+    mem[2] = y1_hi;
+    mem[3] = y1_lo;
+    mem[4] = x0;
+    mem[5] = x1;
+
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/homing_amr_wb_dec.cpp b/media/libstagefright/codecs/amrwb/src/homing_amr_wb_dec.cpp
new file mode 100644
index 0000000..59c6c0a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/homing_amr_wb_dec.cpp
@@ -0,0 +1,370 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: homing_amr_wb_dec.cpp
+
+     Date: 4/25/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+
+
+
+INPUT AND OUTPUT DEFINITIONS
+
+Input
+    int16 input_frame[],            16-bit input frame
+    int16 mode                      16-bit mode
+    int16 nparms                    16-bit number of parameters
+Returns
+    Int16 i             number of leading zeros on x
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Performs the homing routines
+
+    int16 dhf_test(int16 input_frame[], int16 mode, int16 nparms)
+    int16 decoder_homing_frame_test(int16 input_frame[], int16 mode)
+    int16 decoder_homing_frame_test_first(int16 input_frame[], int16 mode)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "get_amr_wb_bits.h"
+#include "pvamrwbdecoder_api.h"
+#include "pvamrwbdecoder.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#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
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int16 prmnofsf[NUM_OF_SPMODES] =
+{
+    63,  81, 100,
+    108, 116, 128,
+    136, 152, 156
+};
+
+
+const int16 dfh_M7k[PRMN_7k] =
+{
+    3168, 29954, 29213, 16121,
+    64, 13440, 30624, 16430,
+    19008
+};
+
+const int16 dfh_M9k[PRMN_9k] =
+{
+    3168, 31665,  9943, 9123,
+    15599,  4358, 20248, 2048,
+    17040, 27787, 16816, 13888
+};
+
+const int16 dfh_M12k[PRMN_12k] =
+{
+    3168, 31665,  9943,  9128,
+    3647,  8129, 30930, 27926,
+    18880, 12319,   496,  1042,
+    4061, 20446, 25629, 28069,
+    13948
+};
+
+const int16 dfh_M14k[PRMN_14k] =
+{
+    3168, 31665,  9943,  9131,
+    24815,   655, 26616, 26764,
+    7238, 19136,  6144,    88,
+    4158, 25733, 30567, 30494,
+    221, 20321, 17823
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 dhf_test(int16 input_frame[], int32 mode, int16 nparms)
+{
+    int16 i, j, tmp, shift;
+    int16 param[DHF_PARMS_MAX];
+    int16 *prms;
+
+    /* overall table with the parameters of the
+    decoder homing frames for all modes */
+
+    const int16 *dhf[] =
+    {
+        dfh_M7k,
+        dfh_M9k,
+        dfh_M12k,
+        dfh_M14k,
+        dfh_M16k,
+        dfh_M18k,
+        dfh_M20k,
+        dfh_M23k,
+        dfh_M24k,
+        dfh_M24k
+    };
+
+    prms = input_frame;
+    j = 0;
+    i = 0;
+
+    if (mode != MRDTX)
+    {
+        if (mode != MODE_24k)
+        {
+            /* convert the received serial bits */
+            tmp = nparms - 15;
+            while (tmp > j)
+            {
+                param[i] = Serial_parm(15, &prms);
+                j += 15;
+                i++;
+            }
+            tmp = nparms - j;
+            param[i] = Serial_parm(tmp, &prms);
+            shift = 15 - tmp;
+            param[i] = shl_int16(param[i], shift);
+        }
+        else
+        {
+            /*If mode is 23.85Kbit/s, remove high band energy bits */
+            for (i = 0; i < 10; i++)
+            {
+                param[i] = Serial_parm(15, &prms);
+            }
+            param[10] = Serial_parm(15, &prms) & 0x61FF;
+
+            for (i = 11; i < 17; i++)
+            {
+                param[i] = Serial_parm(15, &prms);
+            }
+            param[17] = Serial_parm(15, &prms) & 0xE0FF;
+
+            for (i = 18; i < 24; i++)
+            {
+                param[i] = Serial_parm(15, &prms);
+            }
+            param[24] = Serial_parm(15, &prms) & 0x7F0F;
+
+            for (i = 25; i < 31; i++)
+            {
+                param[i] = Serial_parm(15, &prms);
+            }
+
+            tmp = Serial_parm(8, &prms);
+            param[31] = shl_int16(tmp, 7);
+            shift = 0;
+        }
+
+        /* check if the parameters matches the parameters of the corresponding decoder homing frame */
+        tmp = i;
+        j = 0;
+        for (i = 0; i < tmp; i++)
+        {
+            j = (param[i] ^ dhf[mode][i]);
+            if (j)
+            {
+                break;
+            }
+        }
+        tmp = 0x7fff;
+        tmp >>= shift;
+        tmp = shl_int16(tmp, shift);
+        tmp = (dhf[mode][i] & tmp);
+        tmp = (param[i] ^ tmp);
+        j = (int16)(j | tmp);
+
+    }
+    else
+    {
+        j = 1;
+    }
+
+    return (!j);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+int16 pvDecoder_AmrWb_homing_frame_test(int16 input_frame[], int16 mode)
+{
+    /* perform test for COMPLETE parameter frame */
+    return dhf_test(input_frame, mode, AMR_WB_COMPRESSED[mode]);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+int16 pvDecoder_AmrWb_homing_frame_test_first(int16 input_frame[], int16 mode)
+{
+    /* perform test for FIRST SUBFRAME of parameter frame ONLY */
+    return dhf_test(input_frame, mode, prmnofsf[mode]);
+}
diff --git a/media/libstagefright/codecs/amrwb/src/interpolate_isp.cpp b/media/libstagefright/codecs/amrwb/src/interpolate_isp.cpp
new file mode 100644
index 0000000..3ccebdb
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/interpolate_isp.cpp
@@ -0,0 +1,146 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: interpolate_isp.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 isp_old[],         input : isps from past frame
+     int16 isp_new[],         input : isps from present frame
+     const int16 frac[],      input : fraction for 3 first subfr (Q15)
+     int16 Az[]               output: LP coefficients in 4 subframes
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Interpolation of the LP parameters in 4 subframes
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define MP1 (M+1)
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void interpolate_isp(
+    int16 isp_old[],       /* input : isps from past frame              */
+    int16 isp_new[],       /* input : isps from present frame           */
+    const int16 frac[],    /* input : fraction for 3 first subfr (Q15)  */
+    int16 Az[]             /* output: LP coefficients in 4 subframes    */
+)
+{
+    int16 i, k, fac_old, fac_new;
+    int16 isp[M];
+    int32 L_tmp;
+
+    for (k = 0; k < 3; k++)
+    {
+        fac_new = frac[k];
+        fac_old = add_int16(sub_int16(32767, fac_new), 1);  /* 1.0 - fac_new */
+
+        for (i = 0; i < M; i++)
+        {
+            L_tmp = mul_16by16_to_int32(isp_old[i], fac_old);
+            L_tmp = mac_16by16_to_int32(L_tmp, isp_new[i], fac_new);
+            isp[i] = amr_wb_round(L_tmp);
+        }
+        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/amrwb/src/isf_extrapolation.cpp b/media/libstagefright/codecs/amrwb/src/isf_extrapolation.cpp
new file mode 100644
index 0000000..72d353a
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/isf_extrapolation.cpp
@@ -0,0 +1,274 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: isf_extrapolation.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    int16 HfIsf[]    (i/o)  isf vector
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Conversion of 16th-order 12.8kHz ISF vector
+    into 20th-order 16kHz ISF vector
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwb_math_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define INV_LENGTH 2731                    /* 1/12 */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void isf_extrapolation(int16 HfIsf[])
+{
+    int16 IsfDiff[M - 2];
+    int32 IsfCorr[3];
+    int32 L_tmp;
+    int16 coeff, mean, tmp, tmp2, tmp3;
+    int16 exp, exp2, hi, lo;
+    int16 i, MaxCorr;
+
+    HfIsf[M16k - 1] = HfIsf[M - 1];
+
+    /* Difference vector */
+    for (i = 1; i < (M - 1); i++)
+    {
+        IsfDiff[i - 1] = sub_int16(HfIsf[i], HfIsf[i - 1]);
+    }
+    L_tmp = 0;
+
+    /* Mean of difference vector */
+    for (i = 3; i < (M - 1); i++)
+    {
+        L_tmp = mac_16by16_to_int32(L_tmp, IsfDiff[i - 1], INV_LENGTH);
+
+    }
+    mean = amr_wb_round(L_tmp);
+
+    IsfCorr[0] = 0;
+
+    tmp = 0;
+    for (i = 0; i < (M - 2); i++)
+    {
+        if (IsfDiff[i] > tmp)
+        {
+            tmp = IsfDiff[i];
+        }
+    }
+    exp = norm_s(tmp);
+    for (i = 0; i < (M - 2); i++)
+    {
+        IsfDiff[i] = shl_int16(IsfDiff[i], exp);
+    }
+    mean = shl_int16(mean, exp);
+    for (i = 7; i < (M - 2); i++)
+    {
+        tmp2 = sub_int16(IsfDiff[i], mean);
+        tmp3 = sub_int16(IsfDiff[i - 2], mean);
+        L_tmp = mul_16by16_to_int32(tmp2, tmp3);
+        int32_to_dpf(L_tmp, &hi, &lo);
+        L_tmp = mpy_dpf_32(hi, lo, hi, lo);
+        IsfCorr[0] = add_int32(IsfCorr[0], L_tmp);
+    }
+    IsfCorr[1] = 0;
+    for (i = 7; i < (M - 2); i++)
+    {
+        tmp2 = sub_int16(IsfDiff[i], mean);
+        tmp3 = sub_int16(IsfDiff[i - 3], mean);
+        L_tmp = mul_16by16_to_int32(tmp2, tmp3);
+        int32_to_dpf(L_tmp, &hi, &lo);
+        L_tmp = mpy_dpf_32(hi, lo, hi, lo);
+        IsfCorr[1] = add_int32(IsfCorr[1], L_tmp);
+    }
+    IsfCorr[2] = 0;
+    for (i = 7; i < (M - 2); i++)
+    {
+        tmp2 = sub_int16(IsfDiff[i], mean);
+        tmp3 = sub_int16(IsfDiff[i - 4], mean);
+        L_tmp = mul_16by16_to_int32(tmp2, tmp3);
+        int32_to_dpf(L_tmp, &hi, &lo);
+        L_tmp = mpy_dpf_32(hi, lo, hi, lo);
+        IsfCorr[2] = add_int32(IsfCorr[2], L_tmp);
+    }
+
+    if (IsfCorr[0] > IsfCorr[1])
+    {
+        MaxCorr = 0;
+    }
+    else
+    {
+        MaxCorr = 1;
+    }
+
+
+    if (IsfCorr[2] > IsfCorr[MaxCorr])
+    {
+        MaxCorr = 2;
+    }
+
+    MaxCorr++;             /* Maximum correlation of difference vector */
+
+    for (i = M - 1; i < (M16k - 1); i++)
+    {
+        tmp = sub_int16(HfIsf[i - 1 - MaxCorr], HfIsf[i - 2 - MaxCorr]);
+        HfIsf[i] = add_int16(HfIsf[i - 1], tmp);
+    }
+
+    /* tmp=7965+(HfIsf[2]-HfIsf[3]-HfIsf[4])/6; */
+    tmp = add_int16(HfIsf[4], HfIsf[3]);
+    tmp = sub_int16(HfIsf[2], tmp);
+    tmp = mult_int16(tmp, 5461);
+    tmp += 20390;
+
+
+    if (tmp > 19456)
+    {                                      /* Maximum value of ISF should be at most 7600 Hz */
+        tmp = 19456;
+    }
+    tmp = sub_int16(tmp, HfIsf[M - 2]);
+    tmp2 = sub_int16(HfIsf[M16k - 2], HfIsf[M - 2]);
+
+    exp2 = norm_s(tmp2);
+    exp = norm_s(tmp);
+    exp--;
+    tmp <<= exp;
+    tmp2 <<= exp2;
+    coeff = div_16by16(tmp, tmp2);              /* Coefficient for stretching the ISF vector */
+    exp = exp2 - exp;
+
+    for (i = M - 1; i < (M16k - 1); i++)
+    {
+        tmp = mult_int16(sub_int16(HfIsf[i], HfIsf[i - 1]), coeff);
+        IsfDiff[i - (M - 1)] = shl_int16(tmp, exp);
+    }
+
+    for (i = M; i < (M16k - 1); i++)
+    {
+        /* The difference between ISF(n) and ISF(n-2) should be at least 500 Hz */
+        tmp = IsfDiff[i - (M - 1)] + IsfDiff[i - M] - 1280;
+
+        if (tmp < 0)
+        {
+
+            if (IsfDiff[i - (M - 1)] > IsfDiff[i - M])
+            {
+                IsfDiff[i - M] = 1280 - IsfDiff[i - (M - 1)];
+            }
+            else
+            {
+                IsfDiff[i - (M - 1)] = 1280 - IsfDiff[i - M];
+            }
+        }
+    }
+
+    for (i = M - 1; i < (M16k - 1); i++)
+    {
+        HfIsf[i] = add_int16(HfIsf[i - 1], IsfDiff[i - (M - 1)]);
+    }
+
+    for (i = 0; i < (M16k - 1); i++)
+    {
+        HfIsf[i] = mult_int16(HfIsf[i], 26214);  /* Scale the ISF vector correctly for 16000 kHz */
+    }
+
+    Isf_isp(HfIsf, HfIsf, M16k);
+
+    return;
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/isp_az.cpp b/media/libstagefright/codecs/amrwb/src/isp_az.cpp
new file mode 100644
index 0000000..40093f5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/isp_az.cpp
@@ -0,0 +1,403 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: isp_az.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 isp[],              (i) Q15 : Immittance spectral pairs
+     int16 a[],                (o) Q12 : predictor coefficients (order=M)
+     int16 m,                  (i)     : order
+     int16 adaptive_scaling    (i) 0   : adaptive scaling disabled
+                                   1   : adaptive scaling enabled
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Compute the LPC coefficients from isp (order=M)
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwb_math_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NC (M/2)
+#define NC16k (M16k/2)
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void Get_isp_pol(int16 * isp, int32 * f, int16 n);
+    void Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Isp_Az(
+    int16 isp[],            /* (i) Q15 : Immittance spectral pairs         */
+    int16 a[],              /* (o) Q12 : predictor coefficients (order=M)  */
+    int16 m,                /* (i)     : order                     */
+    int16 adaptive_scaling  /* (i) 0   : adaptive scaling disabled */
+    /*     1   : adaptive scaling enabled  */
+)
+{
+    int16 i, j;
+    int32 f1[NC16k + 1], f2[NC16k];
+    int16 nc;
+    int32 t0;
+    int32 t1;
+    int16 q, q_sug;
+    int32 tmax;
+
+    nc = m >> 1;
+
+
+    if (nc > 8)
+    {
+        Get_isp_pol_16kHz(&isp[0], f1, nc);
+        for (i = 0; i <= nc; i++)
+        {
+            f1[i] = shl_int32(f1[i], 2);
+        }
+        Get_isp_pol_16kHz(&isp[1], f2, nc - 1);
+        for (i = 0; i <= nc - 1; i++)
+        {
+            f2[i] = shl_int32(f2[i], 2);
+        }
+    }
+    else
+    {
+        Get_isp_pol(&isp[0], f1, nc);
+        Get_isp_pol(&isp[1], f2, nc - 1);
+    }
+
+    /*
+     *  Multiply F2(z) by (1 - z^-2)
+     */
+
+    for (i = nc - 1; i > 1; i--)
+    {
+        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]); */
+
+        /* f2[i] *= (1.0 - isp[M-1]); */
+        t0 = f1[i];
+        t1 = f2[i];
+        t0 = fxp_mul32_by_16b(t0, isp[m - 1]) << 1;
+        t1 = fxp_mul32_by_16b(t1, isp[m - 1]) << 1;
+        f1[i] += t0;
+        f2[i] -= t1;
+
+    }
+
+    /*
+     *  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;
+    j = m - 1;
+    for (i = 1;  i < nc; i++)
+    {
+        /* a[i] = 0.5*(f1[i] + f2[i]); */
+
+        t0 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
+        /* compute t1 = abs(t0) */
+        t1 = t0 - (t0 < 0);
+        t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
+
+        tmax |= t1;
+        /* from Q23 to Q12 and * 0.5 */
+        a[i] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
+
+
+        /* a[j] = 0.5*(f1[i] - f2[i]); */
+
+        t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
+        /* compute t1 = abs(t0) */
+        t1 = t0 - (t0 < 0);
+        t1 = t1 ^(t1 >> 31);  /* t1 = t1 ^sign(t1) */
+
+        tmax |= t1;
+
+        /* from Q23 to Q12 and * 0.5 */
+        a[j--] = (int16)((t0 >> 12) + ((t0 >> 11) & 1));
+
+    }
+
+    /* rescale data if overflow has occured and reprocess the loop */
+
+
+    if (adaptive_scaling == 1)
+    {
+        q = 4 - normalize_amr_wb(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 = add_int32(f1[i], f2[i]);          /* f1[i] + f2[i]             */
+            /* from Q23 to Q12 and * 0.5 */
+            a[i] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
+
+
+            /* a[j] = 0.5*(f1[i] - f2[i]); */
+
+            t0 = sub_int32(f1[i], f2[i]);          /* f1[i] - f2[i]             */
+            /* from Q23 to Q12 and * 0.5 */
+            a[j] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
+
+        }
+        a[0] >>=  q;
+    }
+    else
+    {
+        q_sug = 12;
+        q     = 0;
+    }
+
+    /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
+
+
+    t0 = (int32)(((int64)f1[nc] * isp[m - 1]) >> 16) << 1;
+
+
+    t0 = add_int32(f1[nc], t0);
+
+    /* from Q23 to Q12 and * 0.5 */
+    a[nc] = (int16)((t0 >> q_sug) + ((t0 >> (q_sug - 1)) & 1));
+    a[m] = shr_rnd(isp[m - 1], (3 + q));           /* from Q15 to Q12          */
+
+    /* a[m] = isp[m-1]; */
+
+
+    return;
+}
+
+
+
+/*
+Get_isp_pol
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+   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)
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    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.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void Get_isp_pol(int16 * isp, int32 * f, int16 n)
+{
+    int16 i, j;
+    int32 t0;
+
+
+    /* All computation in Q23 */
+
+    f[0] = 0x00800000;                        /* f[0] = 1.0;        in Q23  */
+    f[1] = -isp[0] << 9;                      /* 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++)
+        {
+
+            t0 = fxp_mul32_by_16b(f[-1], *isp);
+            t0 = shl_int32(t0, 2);
+
+            *f -= t0;                      /* *f -= t0            */
+            *(f) += f[-2];                 /* *f += f[-2]         */
+            f--;
+
+
+        }
+        *f -= *isp << 9;
+
+        f += i;                            /* Advance f pointer   */
+        isp += 2;                          /* Advance isp pointer */
+    }
+}
+
+void Get_isp_pol_16kHz(int16 * isp, int32 * f, int16 n)
+{
+    int16 i, j;
+    int32 t0;
+
+    /* All computation in Q23 */
+
+    f[0] = 0x00200000;                        /* f[0] = 0.25;        in Q23  */
+
+    f[1] = -isp[0] << 7;                      /* f[1] = -0.5*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--)
+        {
+            t0 = fxp_mul32_by_16b(f[-1], *isp);
+            t0 = shl_int32(t0, 2);
+
+            *f -= t0;                      /* *f -= t0            */
+            *f += f[-2];                   /* *f += f[-2]         */
+        }
+        *f -= *isp << 7;
+        f += i;                            /* Advance f pointer   */
+        isp += 2;                          /* Advance isp pointer */
+    }
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/isp_isf.cpp b/media/libstagefright/codecs/amrwb/src/isp_isf.cpp
new file mode 100644
index 0000000..41db7e3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/isp_isf.cpp
@@ -0,0 +1,175 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: isp_isf.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 isf[],       (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5)
+     int16 isp[],       (o) Q15 : isp[m] (range: -1<=val<1)
+     int16 m            (i)     : LPC order
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+     Isf_isp   Transformation isf to isp
+
+   The transformation from isf[i] to isp[i] is
+   approximated by a look-up table and interpolation.
+
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* Look-up table for transformations */
+
+/* table of cos(x) in Q15 */
+
+const int16 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
+};
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void Isf_isp(
+    int16 isf[],     /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+    int16 isp[],     /* (o) Q15 : isp[m] (range: -1<=val<1)                */
+    int16 m          /* (i)     : LPC order                                */
+)
+{
+    int16 i, ind, offset;
+    int32 L_tmp;
+
+    for (i = 0; i < m - 1; i++)
+    {
+        isp[i] = isf[i];
+    }
+    isp[m - 1] = shl_int16(isf[m - 1], 1);
+
+    for (i = 0; i < m; i++)
+    {
+        ind = isp[i] >> 7;            /* ind    = b7-b15 of isf[i] */
+        offset = (isp[i] & 0x007f);       /* offset = b0-b6  of isf[i] */
+
+        /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
+
+        L_tmp = mul_16by16_to_int32(table[ind + 1] - table[ind], offset);
+        isp[i] = add_int16(table[ind], (int16)(L_tmp >> 8));
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/lagconceal.cpp b/media/libstagefright/codecs/amrwb/src/lagconceal.cpp
new file mode 100644
index 0000000..c699808
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/lagconceal.cpp
@@ -0,0 +1,364 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: lagconceal.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 gain_hist[],                     (i)  : Gain history
+     int16 lag_hist[],                      (i)  : Subframe size
+     int16 * T0,                            (i/o): current lag
+     int16 * old_T0,                        (i/o): previous lag
+     int16 * seed,
+     int16 unusable_frame
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Concealment of LTP lags during bad frames
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define L_LTPHIST 5
+#define ONE_PER_3 10923
+#define ONE_PER_LTPHIST 6554
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+void insertion_sort(int16 array[], int16 n);
+void insert(int16 array[], int16 num, int16 x);
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void Init_Lagconc(int16 lag_hist[])
+{
+    int16 i;
+
+    for (i = 0; i < L_LTPHIST; i++)
+    {
+        lag_hist[i] = 64;
+    }
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void lagconceal(
+    int16 gain_hist[],                   /* (i) : Gain history     */
+    int16 lag_hist[],                    /* (i) : Subframe size    */
+    int16 * T0,
+    int16 * old_T0,
+    int16 * seed,
+    int16 unusable_frame
+)
+{
+    int16 maxLag, minLag, lastLag, lagDif, meanLag = 0;
+    int16 lag_hist2[L_LTPHIST] = {0};
+    int16 i, tmp, tmp2;
+    int16 minGain, lastGain, secLastGain;
+    int16 D, D2;
+
+    /* Is lag index such that it can be aplied directly or does it has to be subtituted */
+
+    lastGain = gain_hist[4];
+    secLastGain = gain_hist[3];
+
+    lastLag = lag_hist[0];
+
+    /******* SMALLEST history lag *******/
+    minLag = lag_hist[0];
+    /*******  BIGGEST history lag *******/
+    maxLag = lag_hist[0];
+    for (i = 1; i < L_LTPHIST; i++)
+    {
+        if (lag_hist[i] < minLag)
+        {
+            minLag = lag_hist[i];
+        }
+        if (lag_hist[i] > maxLag)
+        {
+            maxLag = lag_hist[i];
+        }
+    }
+    /***********SMALLEST history gain***********/
+    minGain = gain_hist[0];
+    for (i = 1; i < L_LTPHIST; i++)
+    {
+
+        if (gain_hist[i] < minGain)
+        {
+            minGain = gain_hist[i];
+        }
+    }
+    /***Difference between MAX and MIN lag**/
+    lagDif = sub_int16(maxLag, minLag);
+
+
+    if (unusable_frame != 0)
+    {
+        /* LTP-lag for RX_SPEECH_LOST */
+        /**********Recognition of the LTP-history*********/
+
+        if ((minGain > 8192) && (lagDif < 10))
+        {
+            *T0 = *old_T0;
+        }
+        else if (lastGain > 8192 && secLastGain > 8192)
+        {
+            *T0 = lag_hist[0];
+        }
+        else
+        {
+            /********SORT************/
+            /* The sorting of the lag history */
+            for (i = 0; i < L_LTPHIST; i++)
+            {
+                lag_hist2[i] = lag_hist[i];
+            }
+            insertion_sort(lag_hist2, 5);
+
+            /* Lag is weighted towards bigger lags */
+            /* and random variation is added */
+            lagDif = sub_int16(lag_hist2[4], lag_hist2[2]);
+
+
+            if (lagDif > 40)
+            {
+                lagDif = 40;
+            }
+
+            D = noise_gen_amrwb(seed);              /* D={-1, ...,1} */
+            /* D2={-lagDif/2..lagDif/2} */
+            tmp = lagDif >> 1;
+            D2 = mult_int16(tmp, D);
+            tmp = add_int16(add_int16(lag_hist2[2], lag_hist2[3]), lag_hist2[4]);
+            *T0 = add_int16(mult_int16(tmp, ONE_PER_3), D2);
+        }
+        /* New lag is not allowed to be bigger or smaller than last lag values */
+
+        if (*T0 > maxLag)
+        {
+            *T0 = maxLag;
+        }
+
+        if (*T0 < minLag)
+        {
+            *T0 = minLag;
+        }
+    }
+    else
+    {
+        /* LTP-lag for RX_BAD_FRAME */
+
+        /***********MEAN lag**************/
+        meanLag = 0;
+        for (i = 0; i < L_LTPHIST; i++)
+        {
+            meanLag = add_int16(meanLag, lag_hist[i]);
+        }
+        meanLag = mult_int16(meanLag, ONE_PER_LTPHIST);
+
+        tmp  = *T0 - maxLag;
+        tmp2 = *T0 - lastLag;
+
+        if ((lagDif < 10) && (*T0 > (minLag - 5)) && (tmp < 5))
+        {
+            *T0 = *T0;
+        }
+        else if ((lastGain > 8192) && (secLastGain > 8192) && ((tmp2 + 10) > 0 && tmp2 < 10))
+        {
+            *T0 = *T0;
+        }
+        else if ((minGain < 6554) && (lastGain == minGain) && (*T0 > minLag && *T0 < maxLag))
+        {
+            *T0 = *T0;
+        }
+        else if ((lagDif < 70) && (*T0 > minLag) && (*T0 < maxLag))
+        {
+            *T0 = *T0;
+        }
+        else if ((*T0 > meanLag) && (*T0 < maxLag))
+        {
+            *T0 = *T0;
+        }
+        else
+        {
+
+
+            if ((minGain > 8192) & (lagDif < 10))
+            {
+                *T0 = lag_hist[0];
+            }
+            else if ((lastGain > 8192) && (secLastGain > 8192))
+            {
+                *T0 = lag_hist[0];
+            }
+            else
+            {
+                /********SORT************/
+                /* The sorting of the lag history */
+                for (i = 0; i < L_LTPHIST; i++)
+                {
+                    lag_hist2[i] = lag_hist[i];
+                }
+                insertion_sort(lag_hist2, 5);
+
+                /* Lag is weighted towards bigger lags */
+                /* and random variation is added */
+                lagDif = sub_int16(lag_hist2[4], lag_hist2[2]);
+
+                if (lagDif > 40)
+                {
+                    lagDif = 40;
+                }
+
+                D = noise_gen_amrwb(seed);          /* D={-1,.., 1} */
+                /* D2={-lagDif/2..lagDif/2} */
+                tmp = lagDif >> 1;
+                D2 = mult_int16(tmp, D);
+                tmp = add_int16(add_int16(lag_hist2[2], lag_hist2[3]), lag_hist2[4]);
+                *T0 = add_int16(mult_int16(tmp, ONE_PER_3), D2);
+            }
+            /* New lag is not allowed to be bigger or smaller than last lag values */
+
+            if (*T0 > maxLag)
+            {
+                *T0 = maxLag;
+            }
+
+            if (*T0 < minLag)
+            {
+                *T0 = minLag;
+            }
+        }
+    }
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void insertion_sort(int16 array[], int16 n)
+{
+    int16 i;
+
+    for (i = 0; i < n; i++)
+    {
+        insert(array, i, array[i]);
+    }
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void insert(int16 array[], int16 n, int16 x)
+{
+    int16 i;
+
+    for (i = (n - 1); i >= 0; i--)
+    {
+
+        if (x < array[i])
+        {
+            array[i + 1] = array[i];
+        }
+        else
+        {
+            break;
+        }
+    }
+    array[i + 1] = x;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/low_pass_filt_7k.cpp b/media/libstagefright/codecs/amrwb/src/low_pass_filt_7k.cpp
new file mode 100644
index 0000000..ec1d6e0
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/low_pass_filt_7k.cpp
@@ -0,0 +1,220 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: low_pass_filt_7k.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 in/out: memory (size=30)
+     int16 x[]                   scratch mem ( size= 60)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        15th order high pass 7kHz FIR filter
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define L_FIR 30
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int16 fir_7k[L_FIR+1] =
+{
+    -21, 47, -89, 146, -203,
+    229, -177, 0, 335, -839,
+    1485, -2211, 2931, -3542, 3953,
+    28682, 3953, -3542, 2931, -2211,
+    1485, -839, 335, 0, -177,
+    229, -203, 146, -89, 47,
+    -21
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void low_pass_filt_7k_init(int16 mem[])            /* mem[30] */
+{
+    pv_memset((void *)mem, 0, (L_FIR)*sizeof(*mem));
+
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void low_pass_filt_7k(
+    int16 signal[],                      /* input:  signal                  */
+    int16 lg,                            /* input:  length of input         */
+    int16 mem[],                         /* in/out: memory (size=30)        */
+    int16 x[]
+)
+{
+    int16 i, j;
+    int32 L_tmp1;
+    int32 L_tmp2;
+    int32 L_tmp3;
+    int32 L_tmp4;
+
+    pv_memcpy((void *)x, (void *)mem, (L_FIR)*sizeof(*x));
+
+    for (i = 0; i < lg >> 2; i++)
+    {
+        x[(i<<2) + L_FIR    ] = signal[(i<<2)];
+        x[(i<<2) + L_FIR + 1] = signal[(i<<2)+1];
+        x[(i<<2) + L_FIR + 2] = signal[(i<<2)+2];
+        x[(i<<2) + L_FIR + 3] = signal[(i<<2)+3];
+
+        L_tmp1 = fxp_mac_16by16(x[(i<<2)] + signal[(i<<2)], fir_7k[0], 0x00004000);
+        L_tmp2 = fxp_mac_16by16(x[(i<<2)+1] + signal[(i<<2)+1], fir_7k[0], 0x00004000);
+        L_tmp3 = fxp_mac_16by16(x[(i<<2)+2] + signal[(i<<2)+2], fir_7k[0], 0x00004000);
+        L_tmp4 = fxp_mac_16by16(x[(i<<2)+3] + signal[(i<<2)+3], fir_7k[0], 0x00004000);
+
+        for (j = 1; j < L_FIR - 1; j += 4)
+        {
+
+
+            int16 tmp1 = x[(i<<2)+j  ];
+            int16 tmp2 = x[(i<<2)+j+1];
+            int16 tmp3 = x[(i<<2)+j+2];
+
+            L_tmp1 = fxp_mac_16by16(tmp1, fir_7k[j  ], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp2, fir_7k[j  ], L_tmp2);
+            L_tmp1 = fxp_mac_16by16(tmp2, fir_7k[j+1], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp3, fir_7k[j+1], L_tmp2);
+            L_tmp3 = fxp_mac_16by16(tmp3, fir_7k[j  ], L_tmp3);
+            L_tmp1 = fxp_mac_16by16(tmp3, fir_7k[j+2], L_tmp1);
+
+            tmp1 = x[(i<<2)+j+3];
+            tmp2 = x[(i<<2)+j+4];
+
+            L_tmp2 = fxp_mac_16by16(tmp1, fir_7k[j+2], L_tmp2);
+            L_tmp4 = fxp_mac_16by16(tmp1, fir_7k[j  ], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp1, fir_7k[j+1], L_tmp3);
+            L_tmp1 = fxp_mac_16by16(tmp1, fir_7k[j+3], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(tmp2, fir_7k[j+3], L_tmp2);
+            L_tmp4 = fxp_mac_16by16(tmp2, fir_7k[j+1], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp2, fir_7k[j+2], L_tmp3);
+
+            tmp1 = x[(i<<2)+j+5];
+            tmp2 = x[(i<<2)+j+6];
+
+            L_tmp4 = fxp_mac_16by16(tmp1, fir_7k[j+2], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(tmp1, fir_7k[j+3], L_tmp3);
+            L_tmp4 = fxp_mac_16by16(tmp2, fir_7k[j+3], L_tmp4);
+
+        }
+
+        L_tmp1 = fxp_mac_16by16(x[(i<<2)+j  ], fir_7k[j  ], L_tmp1);
+        L_tmp2 = fxp_mac_16by16(x[(i<<2)+j+1], fir_7k[j  ], L_tmp2);
+        L_tmp3 = fxp_mac_16by16(x[(i<<2)+j+2], fir_7k[j  ], L_tmp3);
+        L_tmp4 = fxp_mac_16by16(x[(i<<2)+j+3], fir_7k[j  ], L_tmp4);
+
+        signal[(i<<2)] = (int16)(L_tmp1 >> 15);
+        signal[(i<<2)+1] = (int16)(L_tmp2 >> 15);
+        signal[(i<<2)+2] = (int16)(L_tmp3 >> 15);
+        signal[(i<<2)+3] = (int16)(L_tmp4 >> 15);
+
+    }
+
+    pv_memcpy((void *)mem, (void *)(x + lg), (L_FIR)*sizeof(*mem));
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/median5.cpp b/media/libstagefright/codecs/amrwb/src/median5.cpp
new file mode 100644
index 0000000..b922de5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/median5.cpp
@@ -0,0 +1,180 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: median5.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+   INPUT
+       X[-2:2]   16-bit integers.
+
+   RETURN VALUE
+       The median of {X[-2], X[-1],..., X[2]}.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+      Returns the median of the set {X[-2], X[-1],..., X[2]},
+      whose elements are 16-bit integers.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwb_math_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 median5(int16 x[])
+{
+    int16 x1, x2, x3, x4, x5;
+    int16 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);
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/mime_io.cpp b/media/libstagefright/codecs/amrwb/src/mime_io.cpp
new file mode 100644
index 0000000..9ff8816
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/mime_io.cpp
@@ -0,0 +1,729 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+ Pathname: ./src/mime_io.cpp
+
+     Date: 05/07/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    [input_variable_name] = [description of the input to module, its type
+                 definition, and length (when applicable)]
+
+ Local Stores/Buffers/Pointers Needed:
+    [local_store_name] = [description of the local store, its type
+                  definition, and length (when applicable)]
+    [local_buffer_name] = [description of the local buffer, its type
+                   definition, and length (when applicable)]
+    [local_ptr_name] = [description of the local pointer, its type
+                definition, and length (when applicable)]
+
+ Global Stores/Buffers/Pointers Needed:
+    [global_store_name] = [description of the global store, its type
+                   definition, and length (when applicable)]
+    [global_buffer_name] = [description of the global buffer, its type
+                definition, and length (when applicable)]
+    [global_ptr_name] = [description of the global pointer, its type
+                 definition, and length (when applicable)]
+
+ Outputs:
+    [return_variable_name] = [description of data/pointer returned
+                  by module, its type definition, and length
+                  (when applicable)]
+
+ Pointers and Buffers Modified:
+    [variable_bfr_ptr] points to the [describe where the
+      variable_bfr_ptr points to, its type definition, and length
+      (when applicable)]
+    [variable_bfr] contents are [describe the new contents of
+      variable_bfr]
+
+ Local Stores Modified:
+    [local_store_name] = [describe new contents, its type
+                  definition, and length (when applicable)]
+
+ Global Stores Modified:
+    [global_store_name] = [describe new contents, its type
+                   definition, and length (when applicable)]
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ [Describe what the module does by using the variable names
+ listed in the Input and Output Definitions Section above.]
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ [List requirements to be satisfied by this module.]
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [List all references used in designing this module.]
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ ------------------------------------------------------------------------------
+ RESOURCES USED
+
+ STACK USAGE:
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_api.h"
+#include "pvamrwbdecoder.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "dtx.h"
+#include "mime_io.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define MRSID 9
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+const uint8 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 */
+const int16 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 */
+const int16 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 */
+const int16 unused_size[16] = {4, 7, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0};
+
+/* sorting tables for all modes */
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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
+};
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void mime_unsorting(uint8 unsorted_bits[],
+                    int16 sorted_bits_into_int16[],
+                    int16 * frame_type,
+                    int16 * mode,
+                    uint8 quality,
+                    RX_State *st)
+{
+
+    int16 i;
+    int16 j;
+    uint8 temp = 0;
+    uint8 *unsorted_bits_ptr = (uint8*)unsorted_bits;
+
+    /* pointer table for bit sorting tables */
+    const int16 *AmrWbSortingTables[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
+    };
+
+    const int16 * pt_AmrWbSortingTables  = AmrWbSortingTables[*mode];
+
+    /* clear compressed speech bit buffer */
+    pv_memset(sorted_bits_into_int16,
+              0,
+              unpacked_size[*mode]*sizeof(*sorted_bits_into_int16));
+
+    /* unpack and unsort speech or SID bits */
+
+
+    for (i = unpacked_size[*mode] >> 3; i != 0; i--)
+    {
+        temp = *(unsorted_bits_ptr++);
+
+        for (j = 2; j != 0; j--)
+        {
+            switch (temp & 0xf0)
+            {
+                case 0xf0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0xe0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    break;
+                case 0xd0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0xc0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables += 2;
+                    break;
+                case 0xb0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0xa0:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    break;
+                case 0x90:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables += 2;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0x80:
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables += 3;
+                    break;
+                case 0x70:
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0x60:
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    break;
+                case 0x50:
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0x40:
+                    pt_AmrWbSortingTables++;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables += 2;
+                    break;
+                case 0x30:
+                    pt_AmrWbSortingTables += 2;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                case 0x20:
+                    pt_AmrWbSortingTables += 2;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    pt_AmrWbSortingTables++;
+                    break;
+                case 0x10:
+                    pt_AmrWbSortingTables += 3;
+                    sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+                    break;
+                default:
+                    pt_AmrWbSortingTables += 4;
+                    break;
+            }
+            temp <<= 4;
+        }
+    }
+
+    if (unpacked_size[*mode] % 4)
+    {
+        temp <<= 1;
+
+        if (temp & 0x80)
+        {
+            sorted_bits_into_int16[*(pt_AmrWbSortingTables++)] = BIT_1;
+        }
+    }
+
+    /* set frame type */
+    switch (*mode)
+    {
+        case MODE_7k:
+        case MODE_9k:
+        case MODE_12k:
+        case MODE_14k:
+        case MODE_16k:
+        case MODE_18k:
+        case MODE_20k:
+        case MODE_23k:
+        case MODE_24k:
+            if (quality)
+            {
+                *frame_type = RX_SPEECH_GOOD;
+            }
+            else
+            {
+                *frame_type = RX_SPEECH_BAD;
+            }
+            break;
+
+        case MRSID:
+            if (quality)
+            {
+                if (temp & 0x80)
+                {
+                    *frame_type = RX_SID_UPDATE;
+                }
+                else
+                {
+                    *frame_type = RX_SID_FIRST;
+                }
+            }
+            else
+            {
+                *frame_type = RX_SID_BAD;
+            }
+
+            /* set mode index */
+            *mode = st->prev_mode;
+            break;
+        case 14:        /* SPEECH_LOST */
+            *frame_type = RX_SPEECH_LOST;
+            *mode = st->prev_mode;
+            break;
+        case 15:        /* NO_DATA */
+            *frame_type = RX_NO_DATA;
+            *mode = st->prev_mode;
+            break;
+        default:        /* replace frame with unused mode index by NO_DATA frame */
+            *frame_type = RX_NO_DATA;
+            *mode = st->prev_mode;
+            break;
+    }
+
+    st->prev_mode = *mode;
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/mime_io.h b/media/libstagefright/codecs/amrwb/src/mime_io.h
new file mode 100644
index 0000000..3be1d9c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/mime_io.h
@@ -0,0 +1,124 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/mime_io.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef MIME_IO_H
+#define MIME_IO_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+----------------------------------------------------------------------------*/
+
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+extern const uint8 toc_byte[16];
+
+/* number of speech bits for all modes */
+extern const int16 unpacked_size[16];
+
+/* size of packed frame for each mode, excluding TOC byte */
+extern const int16 packed_size[16];
+
+/* number of unused speech bits in packed format for each mode */
+extern const int16 unused_size[16];
+
+/* sorting tables for all modes */
+
+extern const int16 sort_660[132];
+
+extern const int16 sort_885[177];
+
+extern const int16 sort_1265[253];
+
+extern const int16 sort_1425[285];
+
+extern const int16 sort_1585[317];
+
+extern const int16 sort_1825[365];
+
+extern const int16 sort_1985[397];
+
+extern const int16 sort_2305[461];
+
+extern const int16 sort_2385[477];
+
+extern const int16 sort_SID[35];
+
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif  /* MIME_IO_H */
diff --git a/media/libstagefright/codecs/amrwb/src/noise_gen_amrwb.cpp b/media/libstagefright/codecs/amrwb/src/noise_gen_amrwb.cpp
new file mode 100644
index 0000000..2c1059f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/noise_gen_amrwb.cpp
@@ -0,0 +1,118 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: noise_gen_amrwb.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    int16 * seed          seed for the random ng
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Signed 16 bits random generator
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 noise_gen_amrwb(int16 * seed)
+{
+    /*  int16 seed = 21845; */
+    *seed = (int16)fxp_mac_16by16(*seed, 31821, 13849L);
+
+    return (*seed);
+}
diff --git a/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.cpp b/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.cpp
new file mode 100644
index 0000000..0325311
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.cpp
@@ -0,0 +1,183 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: normalize_amr_wb.cpp
+
+     Date: 12/10/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    Int32 x             32-bit integer non-zero input
+Returns
+    Int16 i             number of leading zeros on x
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns number of leading zeros on the non-zero input
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "normalize_amr_wb.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+#if defined(PV_ARM_V5)
+#elif defined(PV_ARM_GCC_V5)
+
+/* function is inlined in header file */
+
+
+#else
+
+int16 normalize_amr_wb(int32 x)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    int16 i;
+
+
+    if (x > 0x0FFFFFFF)
+    {
+        i = 0;  /* most likely case */
+    }
+    else if (x > 0x00FFFFFF)
+    {
+        i = 3;  /* second most likely case */
+    }
+    else if (x > 0x0000FFFF)
+    {
+        i  = x > 0x000FFFFF ?  7 :  11;
+    }
+    else
+    {
+        if (x > 0x000000FF)
+        {
+            i  = x > 0x00000FFF ?  15 :  19;
+        }
+        else
+        {
+            i  = x > 0x0000000F ?  23 :  27;
+        }
+    }
+
+
+    x <<= i;
+
+    switch (x & 0x78000000)
+    {
+        case 0x08000000:
+            i += 3;
+            break;
+
+        case 0x18000000:
+        case 0x10000000:
+            i += 2;
+            break;
+        case 0x28000000:
+        case 0x20000000:
+        case 0x38000000:
+        case 0x30000000:
+            i++;
+
+        default:
+            ;
+    }
+
+    return i;
+
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.h b/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.h
new file mode 100644
index 0000000..e4c80ef
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/normalize_amr_wb.h
@@ -0,0 +1,120 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./c/include/normalize_amr_wb.h
+
+     Date: 12/10/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef NORMALIZE_AMR_WB_H
+#define NORMALIZE_AMR_WB_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+#if defined(PV_ARM_V5)
+
+__inline int16 normalize_amr_wb(int32 x)
+{
+    int32 y;
+    __asm
+    {
+        clz y, x;
+        sub y, y, #1
+    }
+    return (y);
+}
+
+
+#elif defined(PV_ARM_GCC_V5)
+
+
+__inline int16 normalize_amr_wb(int32 x)
+{
+    register int32 y;
+    register int32 ra = x;
+
+
+    asm volatile(
+        "clz %0, %1\n\t"
+        "sub %0, %0, #1"
+    : "=&r*i"(y)
+                : "r"(ra));
+    return (y);
+
+}
+
+#else
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    int16 normalize_amr_wb(int32 x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
+
+#endif  /* PV_NORMALIZE_H */
diff --git a/media/libstagefright/codecs/amrwb/src/oversamp_12k8_to_16k.cpp b/media/libstagefright/codecs/amrwb/src/oversamp_12k8_to_16k.cpp
new file mode 100644
index 0000000..143c26e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/oversamp_12k8_to_16k.cpp
@@ -0,0 +1,342 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: oversamp_12k8_to_16k.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 in/out: memory (size=30)
+     int16 x[]                   scratch mem ( size= 60)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Oversamp_16k : oversampling from 12.8kHz to 16kHz.
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwbdecoder_cnst.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define FAC4   4
+#define FAC5   5
+#define INV_FAC5   6554                    /* 1/5 in Q15 */
+#define DOWN_FAC  26215                    /* 4/5 in Q15 */
+#define UP_FAC    20480                    /* 5/4 in Q14 */
+#define NB_COEF_DOWN  15
+#define NB_COEF_UP    12
+#define N_LOOP_COEF_UP    4
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /* Local functions */
+
+    void AmrWbUp_samp(
+        int16 * sig_d,                       /* input:  signal to oversampling  */
+        int16 * sig_u,                       /* output: oversampled signal      */
+        int16 L_frame                        /* input:  length of output        */
+    );
+
+
+    int16 AmrWbInterpol(                      /* return result of interpolation */
+        int16 * x,                           /* input vector                   */
+        const int16 * fir,                   /* filter coefficient             */
+        int16 nb_coef                        /* number of coefficients         */
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+/* 1/5 resolution interpolation filter  (in Q14)  */
+/* -1.5dB @ 6kHz,    -6dB @ 6.4kHz, -10dB @ 6.6kHz,
+    -20dB @ 6.9kHz, -25dB @ 7kHz,   -55dB @ 8kHz  */
+
+
+const int16 fir_up[4][24] =
+{
+
+    {
+        -1,        12,       -33,       68,       -119,       191,
+        -291,       430,      -634,       963,     -1616,      3792,
+        15317,     -2496,      1288,      -809,       542,      -369,
+        247,      -160,        96,       -52,        23,        -6,
+    },
+    {
+        -4,        24,       -62,       124,      -213,       338,
+        -510,       752,     -1111,      1708,     -2974,      8219,
+        12368,     -3432,      1881,     -1204,       812,      -552,
+        368,      -235,       139,       -73,        30,        -7,
+    },
+    {
+        -7,        30,       -73,       139,      -235,       368,
+        -552,       812,     -1204,      1881,     -3432,     12368,
+        8219,     -2974,      1708,     -1111,       752,      -510,
+        338,      -213,       124,       -62,        24,        -4,
+    },
+    {
+        -6,        23,       -52,        96,      -160,       247,
+        -369,       542,      -809,      1288,     -2496,     15317,
+        3792,     -1616,       963,      -634,       430,      -291,
+        191,      -119,        68,       -33,        12,        -1,
+    }
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+/* output: memory (2*NB_COEF_UP) set to zeros  */
+void oversamp_12k8_to_16k_init(int16 mem[])
+{
+    pv_memset((void *)mem, 0, (2*NB_COEF_UP)*sizeof(*mem));
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void oversamp_12k8_to_16k(
+    int16 sig12k8[],                     /* input:  signal to oversampling  */
+    int16 lg,                            /* input:  length of input         */
+    int16 sig16k[],                      /* output: oversampled signal      */
+    int16 mem[],                         /* in/out: memory (2*NB_COEF_UP)   */
+    int16 signal[]
+)
+{
+    int16 lg_up;
+
+    pv_memcpy((void *)signal,
+              (void *)mem,
+              (2*NB_COEF_UP)*sizeof(*mem));
+
+    pv_memcpy((void *)(signal + (2*NB_COEF_UP)),
+              (void *)sig12k8,
+              lg*sizeof(*sig12k8));
+
+    lg_up = lg + (lg >> 2); /* 5/4 of lg */
+
+    AmrWbUp_samp(signal + NB_COEF_UP, sig16k, lg_up);
+
+    pv_memcpy((void *)mem,
+              (void *)(signal + lg),
+              (2*NB_COEF_UP)*sizeof(*signal));
+
+    return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void AmrWbUp_samp(
+    int16 * sig_d,                       /* input:  signal to oversampling  */
+    int16 * sig_u,                       /* output: oversampled signal      */
+    int16 L_frame                        /* input:  length of output        */
+)
+{
+
+    int32 i;
+    int16 frac;
+    int16 * pt_sig_u = sig_u;
+
+    frac = 1;
+    for (int16 j = 0; j < L_frame; j++)
+    {
+        i = ((int32)j * INV_FAC5) >> 13;       /* integer part = pos * 1/5 */
+
+        frac--;
+        if (frac)
+        {
+            *(pt_sig_u++) = AmrWbInterpol(&sig_d[i],
+                                          fir_up[(FAC5-1) - frac],
+                                          N_LOOP_COEF_UP);
+        }
+        else
+        {
+            *(pt_sig_u++) = sig_d[i+12 - NB_COEF_UP ];
+            frac = FAC5;
+        }
+    }
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+/* Fractional interpolation of signal at position (frac/resol) */
+
+
+int16 AmrWbInterpol(                      /* return result of interpolation */
+    int16 * x,                           /* input vector                   */
+    const int16 *fir,                    /* filter coefficient             */
+    int16 nb_coef                        /* number of coefficients         */
+)
+{
+    int32 L_sum;
+    const int16 *pt_fir = fir;
+
+    int16 tmp1, tmp2, tmp3, tmp4;
+    int16 *pt_x = x - nb_coef - (nb_coef << 1) + 1;
+
+
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), 0x00002000L);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+    tmp1 = *(pt_x++);
+    tmp2 = *(pt_x++);
+    tmp3 = *(pt_x++);
+    tmp4 = *(pt_x++);
+    L_sum = fxp_mac_16by16(tmp1, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp2, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp3, *(pt_fir++), L_sum);
+    L_sum = fxp_mac_16by16(tmp4, *(pt_fir++), L_sum);
+
+
+    L_sum = shl_int32(L_sum, 2);               /* saturation can occur here */
+
+    return ((int16(L_sum >> 16)));
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/phase_dispersion.cpp b/media/libstagefright/codecs/amrwb/src/phase_dispersion.cpp
new file mode 100644
index 0000000..f90a534
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/phase_dispersion.cpp
@@ -0,0 +1,261 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: phase_dispersion.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 gain_code,               (i) Q0  : gain of code
+     int16 gain_pit,                (i) Q14 : gain of pitch
+     int16 code[],                  (i/o)   : code vector
+     int16 mode,                    (i)     : level, 0=hi, 1=lo, 2=off
+     int16 disp_mem[],              (i/o)   : static memory (size = 8)
+     int16 ScratchMem[]
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    post-processing to enhance noise in low bit rate.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "pvamrwb_math_op.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define pitch_0_9  14746                   /* 0.9 in Q14 */
+#define pitch_0_6  9830                    /* 0.6 in Q14 */
+#define L_SUBFR 64
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/* impulse response with phase dispersion */
+
+/* 2.0 - 6.4 kHz phase dispersion */
+const int16 ph_imp_low[L_SUBFR] =
+{
+    20182,  9693,  3270, -3437, 2864, -5240,  1589, -1357,
+    600,  3893, -1497,  -698, 1203, -5249,  1199,  5371,
+    -1488,  -705, -2887,  1976,  898,   721, -3876,  4227,
+    -5112,  6400, -1032, -4725, 4093, -4352,  3205,  2130,
+    -1996, -1835,  2648, -1786, -406,   573,  2484, -3608,
+    3139, -1363, -2566,  3808, -639, -2051,  -541,  2376,
+    3932, -6262,  1432, -3601, 4889,   370,   567, -1163,
+    -2854,  1914,    39, -2418, 3454,  2975, -4021,  3431
+};
+
+/* 3.2 - 6.4 kHz phase dispersion */
+const int16 ph_imp_mid[L_SUBFR] =
+{
+    24098, 10460, -5263,  -763,  2048,  -927,  1753, -3323,
+    2212,   652, -2146,  2487, -3539,  4109, -2107,  -374,
+    -626,  4270, -5485,  2235,  1858, -2769,   744,  1140,
+    -763, -1615,  4060, -4574,  2982, -1163,   731, -1098,
+    803,   167,  -714,   606,  -560,   639,    43, -1766,
+    3228, -2782,   665,   763,   233, -2002,  1291,  1871,
+    -3470,  1032,  2710, -4040,  3624, -4214,  5292, -4270,
+    1563,   108,  -580,  1642, -2458,   957,  544,   2540
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void phase_dispersion(
+    int16 gain_code,             /* (i) Q0  : gain of code             */
+    int16 gain_pit,              /* (i) Q14 : gain of pitch            */
+    int16 code[],                /* (i/o)   : code vector              */
+    int16 mode,                  /* (i)     : level, 0=hi, 1=lo, 2=off */
+    int16 disp_mem[],            /* (i/o)   : static memory (size = 8) */
+    int16 ScratchMem[]
+)
+{
+    int16 i, j, state;
+    int16 *prev_gain_pit, *prev_gain_code, *prev_state;
+    int16 *code2 = ScratchMem;
+
+    prev_state = disp_mem;
+    prev_gain_code = disp_mem + 1;
+    prev_gain_pit = disp_mem + 2;
+
+    pv_memset((void *)code2, 0, (2*L_SUBFR)*sizeof(*code2));
+
+
+    if (gain_pit < pitch_0_6)
+    {
+        state = 0;
+    }
+    else if (gain_pit < pitch_0_9)
+    {
+        state = 1;
+    }
+    else
+    {
+        state = 2;
+    }
+
+    for (i = 5; i > 0; i--)
+    {
+        prev_gain_pit[i] = prev_gain_pit[i - 1];
+    }
+    prev_gain_pit[0] = gain_pit;
+
+    if (sub_int16(gain_code, *prev_gain_code) > shl_int16(*prev_gain_code, 1))
+    {
+        /* onset */
+        if (state < 2)
+        {
+            state++;
+        }
+    }
+    else
+    {
+        j = 0;
+        for (i = 0; i < 6; i++)
+        {
+            if (prev_gain_pit[i] < pitch_0_6)
+            {
+                j++;
+            }
+        }
+
+        if (j > 2)
+        {
+            state = 0;
+        }
+        if (state > *prev_state + 1)
+        {
+            state--;
+        }
+    }
+
+    *prev_gain_code = gain_code;
+    *prev_state = state;
+
+    /* circular convolution */
+
+    state += mode;              /* level of dispersion */
+
+    if (state == 0)
+    {
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            if (code[i] != 0)
+            {
+                for (j = 0; j < L_SUBFR; j++)
+                {
+                    code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_low[j]));
+                }
+            }
+        }
+    }
+    else if (state == 1)
+    {
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            if (code[i] != 0)
+            {
+                for (j = 0; j < L_SUBFR; j++)
+                {
+                    code2[i + j] = add_int16(code2[i + j], mult_int16_r(code[i], ph_imp_mid[j]));
+                }
+            }
+        }
+    }
+    if (state < 2)
+    {
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            code[i] = add_int16(code2[i], code2[i + L_SUBFR]);
+        }
+    }
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/pit_shrp.cpp b/media/libstagefright/codecs/amrwb/src/pit_shrp.cpp
new file mode 100644
index 0000000..4bfcf9c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pit_shrp.cpp
@@ -0,0 +1,132 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: pit_shrp.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 * x,           in/out: impulse response (or algebraic code)
+     int16 pit_lag,       input : pitch lag
+     int16 sharp,         input : pitch sharpening factor (Q15)
+     int16 L_subfr        input : subframe size
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Performs Pitch sharpening routine
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Pit_shrp(
+    int16 * x,         /* in/out: impulse response (or algebraic code) */
+    int16 pit_lag,     /* input : pitch lag                            */
+    int16 sharp,       /* input : pitch sharpening factor (Q15)        */
+    int16 L_subfr      /* input : subframe size                        */
+)
+{
+    int16 i;
+    int32 L_tmp;
+
+    for (i = pit_lag; i < L_subfr; i++)
+    {
+        L_tmp = mac_16by16_to_int32((int32)x[i] << 16, x[i - pit_lag], sharp);
+        x[i] = amr_wb_round(L_tmp);
+
+    }
+
+    return;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/pred_lt4.cpp b/media/libstagefright/codecs/amrwb/src/pred_lt4.cpp
new file mode 100644
index 0000000..d5a7984
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pred_lt4.cpp
@@ -0,0 +1,267 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: pred_lt4.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             input signal / output is divided by 16
+     int16 lg,                   lenght of signal
+     int16 mem[]                 in/out: memory (size=30)
+     int16 x[]                   scratch mem ( size= 60)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Compute the result of long term prediction with fractionnal
+   interpolation of resolution 1/4.
+
+   On return exc[0..L_subfr-1] contains the interpolated signal
+     (adaptive codebook excitation)
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define UP_SAMP      4
+#define L_INTERPOL2  16
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* 1/4 resolution interpolation filter (-3 dB at 0.856*fs/2) in Q14 */
+
+
+const int16 inter4_2[UP_SAMP][ 2*L_INTERPOL2] =
+{
+    {
+        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
+    }
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Pred_lt4(
+    int16 exc[],                         /* in/out: excitation buffer */
+    int16 T0,                            /* input : integer pitch lag */
+    int16 frac,                          /* input : fraction of lag   */
+    int16 L_subfr                        /* input : subframe size     */
+)
+{
+    int16 i, j, *pt_exc;
+    int32 L_sum1;
+    int32 L_sum2;
+    int32 L_sum3;
+    int32 L_sum4;
+    pt_exc = &exc[-T0];
+
+    const int16 *pt_inter4_2;
+
+    frac = -frac;
+
+    if (frac < 0)
+    {
+        frac += UP_SAMP;
+        pt_exc--;
+
+    }
+    pt_exc -= (L_INTERPOL2 - 1);
+
+    pt_inter4_2 = inter4_2[UP_SAMP-1 - frac];
+
+    for (j = 0; j < (L_subfr >> 2); j++)
+    {
+
+        L_sum1 = 0x00002000;  /* pre-roundig */
+        L_sum2 = 0x00002000;
+        L_sum3 = 0x00002000;
+        L_sum4 = 0x00002000;
+
+        for (i = 0; i < L_INTERPOL2 << 1; i += 4)
+        {
+            int16 tmp1 = pt_exc[i  ];
+            int16 tmp2 = pt_exc[i+1];
+            int16 tmp3 = pt_exc[i+2];
+
+
+            L_sum1 = fxp_mac_16by16(tmp1, pt_inter4_2[i  ], L_sum1);
+            L_sum2 = fxp_mac_16by16(tmp2, pt_inter4_2[i  ], L_sum2);
+            L_sum1 = fxp_mac_16by16(tmp2, pt_inter4_2[i+1], L_sum1);
+            L_sum2 = fxp_mac_16by16(tmp3, pt_inter4_2[i+1], L_sum2);
+            L_sum3 = fxp_mac_16by16(tmp3, pt_inter4_2[i  ], L_sum3);
+            L_sum1 = fxp_mac_16by16(tmp3, pt_inter4_2[i+2], L_sum1);
+
+            tmp1 = pt_exc[i+3];
+            tmp2 = pt_exc[i+4];
+
+            L_sum4 = fxp_mac_16by16(tmp1, pt_inter4_2[i  ], L_sum4);
+            L_sum3 = fxp_mac_16by16(tmp1, pt_inter4_2[i+1], L_sum3);
+            L_sum2 = fxp_mac_16by16(tmp1, pt_inter4_2[i+2], L_sum2);
+            L_sum1 = fxp_mac_16by16(tmp1, pt_inter4_2[i+3], L_sum1);
+            L_sum4 = fxp_mac_16by16(tmp2, pt_inter4_2[i+1], L_sum4);
+            L_sum2 = fxp_mac_16by16(tmp2, pt_inter4_2[i+3], L_sum2);
+            L_sum3 = fxp_mac_16by16(tmp2, pt_inter4_2[i+2], L_sum3);
+
+            tmp1 = pt_exc[i+5];
+            tmp2 = pt_exc[i+6];
+
+            L_sum4 = fxp_mac_16by16(tmp1, pt_inter4_2[i+2], L_sum4);
+            L_sum3 = fxp_mac_16by16(tmp1, pt_inter4_2[i+3], L_sum3);
+            L_sum4 = fxp_mac_16by16(tmp2, pt_inter4_2[i+3], L_sum4);
+
+        }
+
+
+
+        exc[(j<<2)] = (int16)(L_sum1 >> 14);
+        exc[(j<<2)+1] = (int16)(L_sum2 >> 14);
+        exc[(j<<2)+2] = (int16)(L_sum3 >> 14);
+        exc[(j<<2)+3] = (int16)(L_sum4 >> 14);
+
+        pt_exc += 4;
+
+    }
+
+    if (L_subfr&1)
+    {
+        L_sum1 = 0x00002000;
+
+        for (i = 0; i < 2*L_INTERPOL2; i += 4)
+        {
+            int16 tmp1 = pt_exc[i  ];
+            int16 tmp2 = pt_exc[i+1];
+            L_sum1 = fxp_mac_16by16(tmp1, pt_inter4_2[i  ], L_sum1);
+            L_sum1 = fxp_mac_16by16(tmp2, pt_inter4_2[i+1], L_sum1);
+            tmp1 = pt_exc[i+2];
+            tmp2 = pt_exc[i+3];
+            L_sum1 = fxp_mac_16by16(tmp1, pt_inter4_2[i+2], L_sum1);
+            L_sum1 = fxp_mac_16by16(tmp2, pt_inter4_2[i+3], L_sum1);
+
+        }
+
+        exc[(j<<2)] = (int16)((L_sum1) >> 14);
+
+    }
+
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/preemph_amrwb_dec.cpp b/media/libstagefright/codecs/amrwb/src/preemph_amrwb_dec.cpp
new file mode 100644
index 0000000..3eb5cda
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/preemph_amrwb_dec.cpp
@@ -0,0 +1,130 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: preemph_amrwb_dec.cpp
+
+     Date: 12/10/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 x[],         (i/o)   : input signal overwritten by the output
+     int16 mu,          (i) Q15 : preemphasis coefficient
+     int16 lg           (i)     : lenght of filtering
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Preemphasis: filtering through 1 - g z^-1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void preemph_amrwb_dec(
+    int16 x[],         /* (i/o)   : input signal overwritten by the output */
+    int16 mu,          /* (i) Q15 : preemphasis coefficient                */
+    int16 lg           /* (i)     : lenght of filtering                    */
+)
+{
+    int16 i;
+    int32 L_tmp;
+
+    for (i = lg - 1; i != 0; i--)
+    {
+        L_tmp = msu_16by16_from_int32((int32)x[i] << 16, x[i - 1], mu);
+        x[i] = amr_wb_round(L_tmp);
+    }
+
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/pv_amr_wb_type_defs.h b/media/libstagefright/codecs/amrwb/src/pv_amr_wb_type_defs.h
new file mode 100644
index 0000000..1ebcb86
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pv_amr_wb_type_defs.h
@@ -0,0 +1,173 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/pv_amr_wb_type_defs.h
+
+     Date: 12/12/2006
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file was derived from a number of standards bodies. The type
+ definitions below were created from some of the best practices observed
+ in the standards bodies.
+
+ This file is dependent on limits.h for defining the bit widths. In an
+ ANSI C environment limits.h is expected to always be present and contain
+ the following definitions:
+
+     SCHAR_MIN
+     SCHAR_MAX
+     UCHAR_MAX
+
+     INT_MAX
+     INT_MIN
+     UINT_MAX
+
+     SHRT_MIN
+     SHRT_MAX
+     USHRT_MAX
+
+     LONG_MIN
+     LONG_MAX
+     ULONG_MAX
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_AMR_WB_TYPE_DEFS_H
+#define PV_AMR_WB_TYPE_DEFS_H
+
+#include <stdint.h>
+
+typedef int8_t        Word8;
+typedef uint8_t       UWord8;
+
+/*----------------------------------------------------------------------------
+; Define generic signed and unsigned int
+----------------------------------------------------------------------------*/
+typedef signed int  Int;
+
+typedef unsigned int    UInt;
+
+/*----------------------------------------------------------------------------
+; Define 16 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+#ifndef INT16_MIN
+#define INT16_MIN   (-32768)
+#endif
+
+#ifndef INT16_MAX
+#define INT16_MAX   32767
+#endif
+
+/*----------------------------------------------------------------------------
+; Define 32 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+
+
+#ifndef INT32_MIN
+#define INT32_MIN   (-2147483647 - 1)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX   2147483647
+#endif
+
+
+#ifndef UINT32_MIN
+#define UINT32_MIN  0
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX  0xffffffff
+#endif
+
+
+/*----------------------------------------------------------------------------
+; Define 64 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; Define boolean type
+----------------------------------------------------------------------------*/
+
+#ifndef Flag
+typedef Int Flag;
+#endif
+
+#ifndef Bool
+typedef Int     Bool;
+#endif
+#ifndef FALSE
+#define FALSE       0
+#endif
+
+#ifndef TRUE
+#define TRUE        1
+#endif
+
+#ifndef OFF
+#define OFF     0
+#endif
+#ifndef ON
+#define ON      1
+#endif
+
+#ifndef NO
+#define NO      0
+#endif
+#ifndef YES
+#define YES     1
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS     0
+#endif
+
+#ifndef  NULL
+#define  NULL       0
+#endif
+
+typedef int16_t int16;
+typedef int32_t int32;
+typedef int64_t int64;
+typedef uint8_t uint8;
+
+#endif  /* PV_AMR_WB_TYPE_DEFS_H */
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp
new file mode 100644
index 0000000..d1ec790
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.cpp
@@ -0,0 +1,627 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*___________________________________________________________________________
+
+    This file contains mathematic operations in fixed point.
+
+    mult_int16_r()     : Same as mult_int16 with rounding
+    shr_rnd()          : Same as shr(var1,var2) but with rounding
+    div_16by16()       : fractional integer division
+    one_ov_sqrt()      : Compute 1/sqrt(L_x)
+    one_ov_sqrt_norm() : Compute 1/sqrt(x)
+    power_of_2()       : power of 2
+    Dot_product12()    : Compute scalar product of <x[],y[]> using accumulator
+    Isqrt()            : inverse square root (16 bits precision).
+    amrwb_log_2()      : log2 (16 bits precision).
+
+    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:
+
+    int32 L_32     : standard signed 32 bits format
+    int16 hi, lo   : L_32 = hi<<16 + lo<<1  (DPF - Double Precision Format)
+    int32 frac, int16 exp : L_32 = frac << exp-31  (normalised format)
+    int16 int, frac        : L_32 = int.frac        (fractional format)
+ ----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : mult_int16_r
+
+     Purpose :
+
+     Same as mult_int16 with rounding, i.e.:
+       mult_int16_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and
+       mult_int16_r(-32768,-32768) = 32767.
+
+     Complexity weight : 2
+
+     Inputs :
+
+      var1
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+     Outputs :
+
+      none
+
+     Return Value :
+
+      var_out
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+ ----------------------------------------------------------------------------*/
+
+int16 mult_int16_r(int16 var1, int16 var2)
+{
+    int32 L_product_arr;
+
+    L_product_arr = (int32) var1 * (int32) var2;      /* product */
+    L_product_arr += (int32) 0x00004000L;      /* round */
+    L_product_arr >>= 15;       /* shift */
+    if ((L_product_arr >> 15) != (L_product_arr >> 31))
+    {
+        L_product_arr = (L_product_arr >> 31) ^ MAX_16;
+    }
+
+    return ((int16)L_product_arr);
+}
+
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : shr_rnd
+
+     Purpose :
+
+     Same as shr(var1,var2) but with rounding. Saturate the result in case of|
+     underflows or overflows :
+      - If var2 is greater than zero :
+            if (sub(shl_int16(shr(var1,var2),1),shr(var1,sub(var2,1))))
+            is equal to zero
+                       then
+                       shr_rnd(var1,var2) = shr(var1,var2)
+                       else
+                       shr_rnd(var1,var2) = add_int16(shr(var1,var2),1)
+      - If var2 is less than or equal to zero :
+                       shr_rnd(var1,var2) = shr(var1,var2).
+
+     Complexity weight : 2
+
+     Inputs :
+
+      var1
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x0000 0000 <= var2 <= 0x0000 7fff.
+
+     Outputs :
+
+      none
+
+     Return Value :
+
+      var_out
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+ ----------------------------------------------------------------------------*/
+
+int16 shr_rnd(int16 var1, int16 var2)
+{
+    int16 var_out;
+
+    var_out = (int16)(var1 >> (var2 & 0xf));
+    if (var2)
+    {
+        if ((var1 & ((int16) 1 << (var2 - 1))) != 0)
+        {
+            var_out++;
+        }
+    }
+    return (var_out);
+}
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : div_16by16
+
+     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 (int16) whose value falls in the
+               range : 0x0000 0000 <= var1 <= var2 and var2 != 0.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range : var1 <= var2 <= 0x0000 7fff and var2 != 0.
+
+     Outputs :
+
+      none
+
+     Return Value :
+
+      var_out
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x0000 0000 <= var_out <= 0x0000 7fff.
+               It's a Q15 value (point between b15 and b14).
+ ----------------------------------------------------------------------------*/
+
+int16 div_16by16(int16 var1, int16 var2)
+{
+
+    int16 var_out = 0;
+    register int16 iteration;
+    int32 L_num;
+    int32 L_denom;
+    int32 L_denom_by_2;
+    int32 L_denom_by_4;
+
+    if ((var1 > var2) || (var1 < 0))
+    {
+        return 0; // used to exit(0);
+    }
+    if (var1)
+    {
+        if (var1 != var2)
+        {
+
+            L_num = (int32) var1;
+            L_denom = (int32) var2;
+            L_denom_by_2 = (L_denom << 1);
+            L_denom_by_4 = (L_denom << 2);
+            for (iteration = 5; iteration > 0; iteration--)
+            {
+                var_out <<= 3;
+                L_num   <<= 3;
+
+                if (L_num >= L_denom_by_4)
+                {
+                    L_num -= L_denom_by_4;
+                    var_out |= 4;
+                }
+
+                if (L_num >= L_denom_by_2)
+                {
+                    L_num -= L_denom_by_2;
+                    var_out |=  2;
+                }
+
+                if (L_num >= (L_denom))
+                {
+                    L_num -= (L_denom);
+                    var_out |=  1;
+                }
+
+            }
+        }
+        else
+        {
+            var_out = MAX_16;
+        }
+    }
+
+    return (var_out);
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : one_ov_sqrt
+
+         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
+ ----------------------------------------------------------------------------*/
+int32 one_ov_sqrt(     /* (o) Q31 : output value (range: 0<=val<1)         */
+    int32 L_x         /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
+)
+{
+    int16 exp;
+    int32 L_y;
+
+    exp = normalize_amr_wb(L_x);
+    L_x <<= exp;                 /* L_x is normalized */
+    exp = 31 - exp;
+
+    one_ov_sqrt_norm(&L_x, &exp);
+
+    L_y = shl_int32(L_x, exp);                 /* denormalization   */
+
+    return (L_y);
+}
+
+/*----------------------------------------------------------------------------
+
+     Function Name : one_ov_sqrt_norm
+
+         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 const int16 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 one_ov_sqrt_norm(
+    int32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+    int16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */
+)
+{
+    int16 i, a, tmp;
+
+
+    if (*frac <= (int32) 0)
+    {
+        *exp = 0;
+        *frac = 0x7fffffffL;
+        return;
+    }
+
+    if ((*exp & 1) == 1)  /* If exponant odd -> shift right */
+        *frac >>= 1;
+
+    *exp = negate_int16((*exp -  1) >> 1);
+
+    *frac >>= 9;
+    i = extract_h(*frac);                  /* Extract b25-b31 */
+    *frac >>= 1;
+    a = (int16)(*frac);                  /* Extract b10-b24 */
+    a = (int16)(a & (int16) 0x7fff);
+
+    i -= 16;
+
+    *frac = L_deposit_h(table_isqrt[i]);   /* table[i] << 16         */
+    tmp = table_isqrt[i] - table_isqrt[i + 1];      /* table[i] - table[i+1]) */
+
+    *frac = msu_16by16_from_int32(*frac, tmp, a);          /* frac -=  tmp*a*2       */
+
+    return;
+}
+
+/*----------------------------------------------------------------------------
+
+     Function Name : power_2()
+
+       L_x = pow(2.0, exponant.fraction)         (exponant = interger part)
+           = pow(2.0, 0.fraction) << exponant
+
+  Algorithm:
+
+     The function power_2(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)
+ ----------------------------------------------------------------------------*/
+const int16 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
+};
+
+int32 power_of_2(                         /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
+    int16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
+    int16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
+)
+{
+    int16 exp, i, a, tmp;
+    int32 L_x;
+
+    L_x = fraction << 5;          /* L_x = fraction<<6           */
+    i = (fraction >> 10);                  /* Extract b10-b16 of fraction */
+    a = (int16)(L_x);                    /* Extract b0-b9   of fraction */
+    a = (int16)(a & (int16) 0x7fff);
+
+    L_x = ((int32)table_pow2[i]) << 15;    /* table[i] << 16        */
+    tmp = table_pow2[i] - table_pow2[i + 1];        /* table[i] - table[i+1] */
+    L_x -= ((int32)tmp * a);             /* L_x -= tmp*a*2        */
+
+    exp = 29 - exponant ;
+
+    if (exp)
+    {
+        L_x = ((L_x >> exp) + ((L_x >> (exp - 1)) & 1));
+    }
+
+    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
+ ----------------------------------------------------------------------------*/
+
+int32 Dot_product12(   /* (o) Q31: normalized result (1 < val <= -1) */
+    int16 x[],        /* (i) 12bits: x vector                       */
+    int16 y[],        /* (i) 12bits: y vector                       */
+    int16 lg,         /* (i)    : vector length                     */
+    int16 * exp       /* (o)    : exponent of result (0..+30)       */
+)
+{
+    int16 i, sft;
+    int32 L_sum;
+    int16 *pt_x = x;
+    int16 *pt_y = y;
+
+    L_sum = 1L;
+
+
+    for (i = lg >> 3; i != 0; i--)
+    {
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
+    }
+
+    /* Normalize acc in Q31 */
+
+    sft = normalize_amr_wb(L_sum);
+    L_sum <<= sft;
+
+    *exp = 30 - sft;                    /* exponent = 0..30 */
+
+    return (L_sum);
+}
+
+/* Table for Log2() */
+const int16 Log2_norm_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
+};
+
+/*----------------------------------------------------------------------------
+ *
+ *   FUNCTION:   Lg2_normalized()
+ *
+ *   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 Lg2_normalized(
+    int32 L_x,         /* (i) : input value (normalized)                    */
+    int16 exp,         /* (i) : norm_l (L_x)                                */
+    int16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+    int16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
+)
+{
+    int16 i, a, tmp;
+    int32 L_y;
+
+    if (L_x <= (int32) 0)
+    {
+        *exponent = 0;
+        *fraction = 0;;
+        return;
+    }
+
+    *exponent = 30 - exp;
+
+    L_x >>= 9;
+    i = extract_h(L_x);                 /* Extract b25-b31 */
+    L_x >>= 1;
+    a = (int16)(L_x);                 /* Extract b10-b24 of fraction */
+    a &= 0x7fff;
+
+    i -= 32;
+
+    L_y = L_deposit_h(Log2_norm_table[i]);             /* table[i] << 16        */
+    tmp = Log2_norm_table[i] - Log2_norm_table[i + 1]; /* table[i] - table[i+1] */
+    L_y = msu_16by16_from_int32(L_y, tmp, a);           /* L_y -= tmp*a*2        */
+
+    *fraction = extract_h(L_y);
+
+    return;
+}
+
+
+
+/*----------------------------------------------------------------------------
+ *
+ *   FUNCTION:   amrwb_log_2()
+ *
+ *   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 Lg2_normalized().
+ *
+ ----------------------------------------------------------------------------*/
+void amrwb_log_2(
+    int32 L_x,         /* (i) : input value                                 */
+    int16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+    int16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+)
+{
+    int16 exp;
+
+    exp = normalize_amr_wb(L_x);
+    Lg2_normalized(shl_int32(L_x, exp), exp, exponent, fraction);
+}
+
+
+/*****************************************************************************
+ *
+ *  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.                                                     *
+ *****************************************************************************
+*/
+
+
+/*----------------------------------------------------------------------------
+ *
+ *  Function int32_to_dpf()
+ *
+ *  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
+ *
+ ----------------------------------------------------------------------------*/
+
+void int32_to_dpf(int32 L_32, int16 *hi, int16 *lo)
+{
+    *hi = (int16)(L_32 >> 16);
+    *lo = (int16)((L_32 - (*hi << 16)) >> 1);
+    return;
+}
+
+
+/*----------------------------------------------------------------------------
+ * Function mpy_dpf_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
+ *
+ ----------------------------------------------------------------------------*/
+
+int32 mpy_dpf_32(int16 hi1, int16 lo1, int16 hi2, int16 lo2)
+{
+    int32 L_32;
+
+    L_32 = mul_16by16_to_int32(hi1, hi2);
+    L_32 = mac_16by16_to_int32(L_32, mult_int16(hi1, lo2), 1);
+    L_32 = mac_16by16_to_int32(L_32, mult_int16(lo1, hi2), 1);
+
+    return (L_32);
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.h b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.h
new file mode 100644
index 0000000..8951e5c
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwb_math_op.h
@@ -0,0 +1,132 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./src/pvamrwb_math_op.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVAMRWB_MATH_OP_H
+#define PVAMRWB_MATH_OP_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; DEFINES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    int32 one_ov_sqrt(      /* (o) Q31 : output value (range: 0<=val<1)         */
+        int32 L_x          /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
+    );
+    void one_ov_sqrt_norm(
+        int32 * frac,      /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+        int16 * exp        /* (i/o)    : exponent (value = frac x 2^exponent) */
+    );
+    int32 power_of_2(       /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
+        int16 exponant,    /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
+        int16 fraction     /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
+    );
+    int32 Dot_product12(    /* (o) Q31: normalized result (1 < val <= -1) */
+        int16 x[],         /* (i) 12bits: x vector                       */
+        int16 y[],         /* (i) 12bits: y vector                       */
+        int16 lg,          /* (i)    : vector length                     */
+        int16 * exp        /* (o)    : exponent of result (0..+30)       */
+    );
+
+
+    void amrwb_log_2(
+        int32 L_x,        /* (i) : input value                                 */
+        int16 *exponent,  /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+        int16 *fraction   /* (o) : Fractional part of Log2. (range: 0<=val<1)*/
+    );
+
+    void Lg2_normalized(
+        int32 L_x,         /* (i) : input value (normalized)                    */
+        int16 exp,         /* (i) : norm_l (L_x)                                */
+        int16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
+        int16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
+    );
+
+
+    int16 mult_int16_r(int16 var1, int16 var2);          /* Mult with round, 2 */
+    int16 shr_rnd(int16 var1, int16 var2);         /* Shift right with round, 2  */
+
+    int16 div_16by16(int16 var1, int16 var2);       /* Short division,       18  */
+
+
+    void int32_to_dpf(int32 L_32, int16 *hi, int16 *lo);
+    int32 mpy_dpf_32(int16 hi1, int16 lo1, int16 hi2, int16 lo2);
+
+
+#define norm_s( x)    (normalize_amr_wb(  x) - 16)
+
+
+#define extract_h( x)    (int16)(x>>16)
+#define L_deposit_h( x)    (int32)(x<<16)
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /*  PVAMRWB_MATH_OP_H */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.cpp b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.cpp
new file mode 100644
index 0000000..b8cfefa
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.cpp
@@ -0,0 +1,1149 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: pvamrwbdecoder.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 mode,                      input : used mode
+     int16 prms[],                    input : parameter vector
+     int16 synth16k[],                output: synthesis speech
+     int16 * frame_length,            output:  lenght of the frame
+     void *spd_state,                 i/o   : State structure
+     int16 frame_type,                input : received frame type
+     int16 ScratchMem[]
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Performs the main decoder routine AMR WB ACELP coding algorithm with 20 ms
+   speech frames for wideband speech signals.
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "e_pv_amrwbdec.h"
+#include "get_amr_wb_bits.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_api.h"
+#include "pvamrwbdecoder.h"
+#include "synthesis_amr_wb.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/* LPC interpolation coef {0.45, 0.8, 0.96, 1.0}; in Q15 */
+static const int16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};
+
+
+/* isp tables for initialization */
+
+static const int16 isp_init[M] =
+{
+    32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
+    -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
+};
+
+static const int16 isf_init[M] =
+{
+    1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
+    9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+ FUNCTION DESCRIPTION   pvDecoder_AmrWb_Init
+
+   Initialization of variables for the decoder section.
+
+----------------------------------------------------------------------------*/
+
+
+
+
+void pvDecoder_AmrWb_Init(void **spd_state, void *pt_st, int16 **ScratchMem)
+{
+    /* Decoder states */
+    Decoder_State *st = &(((PV_AmrWbDec *)pt_st)->state);
+
+    *ScratchMem = ((PV_AmrWbDec *)pt_st)->ScratchMem;
+    /*
+     *  Init dtx decoding
+     */
+    dtx_dec_amr_wb_reset(&(st->dtx_decSt), isf_init);
+
+    pvDecoder_AmrWb_Reset((void *) st, 1);
+
+    *spd_state = (void *) st;
+
+    return;
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void pvDecoder_AmrWb_Reset(void *st, int16 reset_all)
+{
+    int16 i;
+
+    Decoder_State *dec_state;
+
+    dec_state = (Decoder_State *) st;
+
+    pv_memset((void *)dec_state->old_exc,
+              0,
+              (PIT_MAX + L_INTERPOL)*sizeof(*dec_state->old_exc));
+
+    pv_memset((void *)dec_state->past_isfq,
+              0,
+              M*sizeof(*dec_state->past_isfq));
+
+
+    dec_state->old_T0_frac = 0;               /* old pitch value = 64.0 */
+    dec_state->old_T0 = 64;
+    dec_state->first_frame = 1;
+    dec_state->L_gc_thres = 0;
+    dec_state->tilt_code = 0;
+
+    pv_memset((void *)dec_state->disp_mem,
+              0,
+              8*sizeof(*dec_state->disp_mem));
+
+
+    /* scaling memories for excitation */
+    dec_state->Q_old = Q_MAX;
+    dec_state->Qsubfr[3] = Q_MAX;
+    dec_state->Qsubfr[2] = Q_MAX;
+    dec_state->Qsubfr[1] = Q_MAX;
+    dec_state->Qsubfr[0] = Q_MAX;
+
+    if (reset_all != 0)
+    {
+        /* routines initialization */
+
+        dec_gain2_amr_wb_init(dec_state->dec_gain);
+        oversamp_12k8_to_16k_init(dec_state->mem_oversamp);
+        band_pass_6k_7k_init(dec_state->mem_hf);
+        low_pass_filt_7k_init(dec_state->mem_hf3);
+        highpass_50Hz_at_12k8_init(dec_state->mem_sig_out);
+        highpass_400Hz_at_12k8_init(dec_state->mem_hp400);
+        Init_Lagconc(dec_state->lag_hist);
+
+        /* isp initialization */
+
+        pv_memcpy((void *)dec_state->ispold, (void *)isp_init, M*sizeof(*isp_init));
+
+        pv_memcpy((void *)dec_state->isfold, (void *)isf_init, M*sizeof(*isf_init));
+        for (i = 0; i < L_MEANBUF; i++)
+        {
+            pv_memcpy((void *)&dec_state->isf_buf[i * M],
+                      (void *)isf_init,
+                      M*sizeof(*isf_init));
+        }
+        /* variable initialization */
+
+        dec_state->mem_deemph = 0;
+
+        dec_state->seed  = 21845;              /* init random with 21845 */
+        dec_state->seed2 = 21845;
+        dec_state->seed3 = 21845;
+
+        dec_state->state = 0;
+        dec_state->prev_bfi = 0;
+
+        /* Static vectors to zero */
+
+        pv_memset((void *)dec_state->mem_syn_hf,
+                  0,
+                  M16k*sizeof(*dec_state->mem_syn_hf));
+
+        pv_memset((void *)dec_state->mem_syn_hi,
+                  0,
+                  M*sizeof(*dec_state->mem_syn_hi));
+
+        pv_memset((void *)dec_state->mem_syn_lo,
+                  0,
+                  M*sizeof(*dec_state->mem_syn_lo));
+
+
+        dtx_dec_amr_wb_reset(&(dec_state->dtx_decSt), isf_init);
+        dec_state->vad_hist = 0;
+
+    }
+    return;
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int32 pvDecoder_AmrWbMemRequirements()
+{
+    return(sizeof(PV_AmrWbDec));
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+/*              Main decoder routine.                                       */
+
+int32 pvDecoder_AmrWb(
+    int16 mode,              /* input : used mode                     */
+    int16 prms[],            /* input : parameter vector              */
+    int16 synth16k[],        /* output: synthesis speech              */
+    int16 * frame_length,    /* output:  lenght of the frame          */
+    void *spd_state,         /* i/o   : State structure               */
+    int16 frame_type,        /* input : received frame type           */
+    int16 ScratchMem[]
+)
+{
+
+    /* Decoder states */
+    Decoder_State *st;
+
+    int16 *ScratchMem2 = &ScratchMem[ L_SUBFR + L_SUBFR16k + ((L_SUBFR + M + M16k +1)<<1)];
+
+
+    /* Excitation vector */
+
+
+    int16 *old_exc = ScratchMem2;
+
+    int16 *Aq = &old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];/* A(z)   quantized for the 4 subframes */
+
+    int16 *ispnew  = &Aq[NB_SUBFR * (M + 1)];/* immittance spectral pairs at 4nd sfr */
+    int16 *isf     = &ispnew[M];             /* ISF (frequency domain) at 4nd sfr    */
+    int16 *isf_tmp = &isf[M];
+    int16 *code    = &isf_tmp[M];             /* algebraic codevector                 */
+    int16 *excp    = &code[L_SUBFR];
+    int16 *exc2    = &excp[L_SUBFR];         /* excitation vector                    */
+    int16 *HfIsf   = &exc2[L_FRAME];
+
+
+    int16 *exc;
+
+    /* LPC coefficients */
+
+    int16 *p_Aq;                          /* ptr to A(z) for the 4 subframes      */
+
+
+
+    int16 fac, stab_fac, voice_fac, Q_new = 0;
+    int32 L_tmp, L_gain_code;
+
+    /* Scalars */
+
+    int16 i, j, i_subfr, index, ind[8], tmp;
+    int32 max;
+    int16 T0, T0_frac, pit_flag, T0_max, select, T0_min = 0;
+    int16 gain_pit, gain_code;
+    int16 newDTXState, bfi, unusable_frame, nb_bits;
+    int16 vad_flag;
+    int16 pit_sharp;
+
+    int16 corr_gain = 0;
+
+    st = (Decoder_State *) spd_state;
+
+    /* mode verification */
+
+    nb_bits = AMR_WB_COMPRESSED[mode];
+
+    *frame_length = AMR_WB_PCM_FRAME;
+
+    /* find the new  DTX state  SPEECH OR DTX */
+    newDTXState = rx_amr_wb_dtx_handler(&(st->dtx_decSt), frame_type);
+
+
+    if (newDTXState != SPEECH)
+    {
+        dtx_dec_amr_wb(&(st->dtx_decSt), exc2, newDTXState, isf, &prms);
+    }
+    /* SPEECH action state machine  */
+
+    if ((frame_type == RX_SPEECH_BAD) ||
+            (frame_type == RX_SPEECH_PROBABLY_DEGRADED))
+    {
+        /* bfi for all index, bits are not usable */
+        bfi = 1;
+        unusable_frame = 0;
+    }
+    else if ((frame_type == RX_NO_DATA) ||
+             (frame_type == RX_SPEECH_LOST))
+    {
+        /* bfi only for lsf, gains and pitch period */
+        bfi = 1;
+        unusable_frame = 1;
+    }
+    else
+    {
+        bfi = 0;
+        unusable_frame = 0;
+    }
+
+    if (bfi != 0)
+    {
+        st->state += 1;
+
+        if (st->state > 6)
+        {
+            st->state = 6;
+        }
+    }
+    else
+    {
+        st->state >>=  1;
+    }
+
+    /* If this frame is the first speech frame after CNI period,
+     * set the BFH state machine to an appropriate state depending
+     * on whether there was DTX muting before start of speech or not
+     * If there was DTX muting, the first speech frame is muted.
+     * If there was no DTX muting, the first speech frame is not
+     * muted. The BFH state machine starts from state 5, however, to
+     * keep the audible noise resulting from a SID frame which is
+     * erroneously interpreted as a good speech frame as small as
+     * possible (the decoder output in this case is quickly muted)
+     */
+
+    if (st->dtx_decSt.dtxGlobalState == DTX)
+    {
+        st->state = 5;
+        st->prev_bfi = 0;
+    }
+    else if (st->dtx_decSt.dtxGlobalState == DTX_MUTE)
+    {
+        st->state = 5;
+        st->prev_bfi = 1;
+    }
+
+    if (newDTXState == SPEECH)
+    {
+        vad_flag = Serial_parm_1bit(&prms);
+
+        if (bfi == 0)
+        {
+            if (vad_flag == 0)
+            {
+                st->vad_hist = add_int16(st->vad_hist, 1);
+            }
+            else
+            {
+                st->vad_hist = 0;
+            }
+        }
+    }
+    /*
+     *  DTX-CNG
+     */
+
+    if (newDTXState != SPEECH)     /* CNG mode */
+    {
+        /* increase slightly energy of noise below 200 Hz */
+
+        /* Convert ISFs to the cosine domain */
+        Isf_isp(isf, ispnew, M);
+
+        Isp_Az(ispnew, Aq, M, 1);
+
+        pv_memcpy((void *)isf_tmp, (void *)st->isfold, M*sizeof(*isf_tmp));
+
+
+        for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+        {
+            j = i_subfr >> 6;
+
+            for (i = 0; i < M; i++)
+            {
+                L_tmp = mul_16by16_to_int32(isf_tmp[i], sub_int16(32767, interpol_frac[j]));
+                L_tmp = mac_16by16_to_int32(L_tmp, isf[i], interpol_frac[j]);
+                HfIsf[i] = amr_wb_round(L_tmp);
+            }
+
+            synthesis_amr_wb(Aq,
+                             &exc2[i_subfr],
+                             0,
+                             &synth16k[i_subfr *5/4],
+                             (short) 1,
+                             HfIsf,
+                             nb_bits,
+                             newDTXState,
+                             st,
+                             bfi,
+                             ScratchMem);
+        }
+
+        /* reset speech coder memories */
+        pvDecoder_AmrWb_Reset(st, 0);
+
+        pv_memcpy((void *)st->isfold, (void *)isf, M*sizeof(*isf));
+
+        st->prev_bfi = bfi;
+        st->dtx_decSt.dtxGlobalState = newDTXState;
+
+        return 0;
+    }
+    /*
+     *  ACELP
+     */
+
+    /* copy coder memory state into working space (internal memory for DSP) */
+
+    pv_memcpy((void *)old_exc, (void *)st->old_exc, (PIT_MAX + L_INTERPOL)*sizeof(*old_exc));
+
+    exc = old_exc + PIT_MAX + L_INTERPOL;
+
+    /* Decode the ISFs */
+
+    if (nb_bits > NBBITS_7k)        /* all rates but 6.6 Kbps */
+    {
+        ind[0] = Serial_parm(8, &prms);     /* index of 1st ISP subvector */
+        ind[1] = Serial_parm(8, &prms);     /* index of 2nd ISP subvector */
+        ind[2] = Serial_parm(6, &prms);     /* index of 3rd ISP subvector */
+        ind[3] = Serial_parm(7, &prms);     /* index of 4th ISP subvector */
+        ind[4] = Serial_parm(7, &prms);     /* index of 5th ISP subvector */
+        ind[5] = Serial_parm(5, &prms);     /* index of 6th ISP subvector */
+        ind[6] = Serial_parm(5, &prms);     /* index of 7th ISP subvector */
+
+        Dpisf_2s_46b(ind, isf, st->past_isfq, st->isfold, st->isf_buf, bfi, 1);
+    }
+    else
+    {
+        ind[0] = Serial_parm(8, &prms);
+        ind[1] = Serial_parm(8, &prms);
+        ind[2] = Serial_parm(14, &prms);
+        ind[3] = ind[2] & 0x007F;
+        ind[2] >>= 7;
+        ind[4] = Serial_parm(6, &prms);
+
+        Dpisf_2s_36b(ind, isf, st->past_isfq, st->isfold, st->isf_buf, bfi, 1);
+    }
+
+    /* Convert ISFs to the cosine domain */
+
+    Isf_isp(isf, ispnew, M);
+
+    if (st->first_frame != 0)
+    {
+        st->first_frame = 0;
+        pv_memcpy((void *)st->ispold, (void *)ispnew, M*sizeof(*ispnew));
+
+    }
+    /* Find the interpolated ISPs and convert to a[] for all subframes */
+    interpolate_isp(st->ispold, ispnew, interpol_frac, Aq);
+
+    /* update ispold[] for the next frame */
+    pv_memcpy((void *)st->ispold, (void *)ispnew, M*sizeof(*ispnew));
+
+    /* Check stability on isf : distance between old isf and current isf */
+
+    L_tmp = 0;
+    for (i = 0; i < M - 1; i++)
+    {
+        tmp = sub_int16(isf[i], st->isfold[i]);
+        L_tmp = mac_16by16_to_int32(L_tmp, tmp, tmp);
+    }
+    tmp = extract_h(shl_int32(L_tmp, 8));
+    tmp = mult_int16(tmp, 26214);                /* tmp = L_tmp*0.8/256 */
+
+    tmp = 20480 - tmp;                 /* 1.25 - tmp */
+    stab_fac = shl_int16(tmp, 1);                /* Q14 -> Q15 with saturation */
+
+    if (stab_fac < 0)
+    {
+        stab_fac = 0;
+    }
+    pv_memcpy((void *)isf_tmp, (void *)st->isfold, M*sizeof(*isf_tmp));
+
+    pv_memcpy((void *)st->isfold, (void *)isf, M*sizeof(*isf));
+
+    /*
+     *          Loop for every subframe in the analysis frame
+     *
+     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR
+     *  times
+     *     - decode the pitch delay and filter mode
+     *     - decode algebraic code
+     *     - decode pitch and codebook gains
+     *     - find voicing factor and tilt of code for next subframe.
+     *     - find the excitation and compute synthesis speech
+     */
+
+    p_Aq = Aq;                                /* pointer to interpolated LPC parameters */
+
+
+    /*
+     *   Sub process next 3 subframes
+     */
+
+
+    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+    {
+        pit_flag = i_subfr;
+
+
+        if ((i_subfr == 2*L_SUBFR) && (nb_bits > NBBITS_7k))
+        {
+            pit_flag = 0;        /* set to 0 for 3rd subframe, <=> is not 6.6 kbps */
+        }
+        /*-------------------------------------------------*
+         * - Decode pitch lag                              *
+         * Lag indeces received also in case of BFI,       *
+         * so that the parameter pointer stays in sync.    *
+         *-------------------------------------------------*/
+
+        if (pit_flag == 0)
+        {
+
+            if (nb_bits <= NBBITS_9k)
+            {
+                index = Serial_parm(8, &prms);
+
+                if (index < (PIT_FR1_8b - PIT_MIN) * 2)
+                {
+                    T0 = PIT_MIN + (index >> 1);
+                    T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_MIN), 1));
+                    T0_frac = shl_int16(T0_frac, 1);
+                }
+                else
+                {
+                    T0 = add_int16(index, PIT_FR1_8b - ((PIT_FR1_8b - PIT_MIN) * 2));
+                    T0_frac = 0;
+                }
+            }
+            else
+            {
+                index = Serial_parm(9, &prms);
+
+                if (index < (PIT_FR2 - PIT_MIN) * 4)
+                {
+                    T0 = PIT_MIN + (index >> 2);
+                    T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_MIN), 2));
+                }
+                else if (index < (((PIT_FR2 - PIT_MIN) << 2) + ((PIT_FR1_9b - PIT_FR2) << 1)))
+                {
+                    index -= (PIT_FR2 - PIT_MIN) << 2;
+                    T0 = PIT_FR2 + (index >> 1);
+                    T0_frac = sub_int16(index, shl_int16(sub_int16(T0, PIT_FR2), 1));
+                    T0_frac = shl_int16(T0_frac, 1);
+                }
+                else
+                {
+                    T0 = add_int16(index, (PIT_FR1_9b - ((PIT_FR2 - PIT_MIN) * 4) - ((PIT_FR1_9b - PIT_FR2) * 2)));
+                    T0_frac = 0;
+                }
+            }
+
+            /* 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 = PIT_MAX - 15;
+            }
+        }
+        else
+        {                                  /* if subframe 2 or 4 */
+
+            if (nb_bits <= NBBITS_9k)
+            {
+                index = Serial_parm(5, &prms);
+
+                T0 = T0_min + (index >> 1);
+                T0_frac = sub_int16(index, shl_int16(T0 - T0_min, 1));
+                T0_frac = shl_int16(T0_frac, 1);
+            }
+            else
+            {
+                index = Serial_parm(6, &prms);
+
+                T0 = T0_min + (index >> 2);
+                T0_frac = sub_int16(index, shl_int16(T0 - T0_min, 2));
+            }
+        }
+
+        /* check BFI after pitch lag decoding */
+
+        if (bfi != 0)                      /* if frame erasure */
+        {
+            lagconceal(&(st->dec_gain[17]), st->lag_hist, &T0, &(st->old_T0), &(st->seed3), unusable_frame);
+            T0_frac = 0;
+        }
+        /*
+         *  Find the pitch gain, the interpolation filter
+         *  and the adaptive codebook vector.
+         */
+
+        Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+
+
+        if (unusable_frame)
+        {
+            select = 1;
+        }
+        else
+        {
+
+            if (nb_bits <= NBBITS_9k)
+            {
+                select = 0;
+            }
+            else
+            {
+                select = Serial_parm_1bit(&prms);
+            }
+        }
+
+
+        if (select == 0)
+        {
+            /* find pitch excitation with lp filter */
+            for (i = 0; i < L_SUBFR; i++)
+            {
+                L_tmp  = ((int32) exc[i-1+i_subfr] + exc[i+1+i_subfr]);
+                L_tmp *= 5898;
+                L_tmp += ((int32) exc[i+i_subfr] * 20972);
+
+                code[i] = amr_wb_round(L_tmp << 1);
+            }
+            pv_memcpy((void *)&exc[i_subfr], (void *)code, L_SUBFR*sizeof(*code));
+
+        }
+        /*
+         * Decode innovative codebook.
+         * Add the fixed-gain pitch contribution to code[].
+         */
+
+        if (unusable_frame != 0)
+        {
+            /* the innovative code doesn't need to be scaled (see Q_gain2) */
+            for (i = 0; i < L_SUBFR; i++)
+            {
+                code[i] = noise_gen_amrwb(&(st->seed)) >> 3;
+            }
+        }
+        else if (nb_bits <= NBBITS_7k)
+        {
+            ind[0] = Serial_parm(12, &prms);
+            dec_acelp_2p_in_64(ind[0], code);
+        }
+        else if (nb_bits <= NBBITS_9k)
+        {
+            for (i = 0; i < 4; i++)
+            {
+                ind[i] = Serial_parm(5, &prms);
+            }
+            dec_acelp_4p_in_64(ind, 20, code);
+        }
+        else if (nb_bits <= NBBITS_12k)
+        {
+            for (i = 0; i < 4; i++)
+            {
+                ind[i] = Serial_parm(9, &prms);
+            }
+            dec_acelp_4p_in_64(ind, 36, code);
+        }
+        else if (nb_bits <= NBBITS_14k)
+        {
+            ind[0] = Serial_parm(13, &prms);
+            ind[1] = Serial_parm(13, &prms);
+            ind[2] = Serial_parm(9, &prms);
+            ind[3] = Serial_parm(9, &prms);
+            dec_acelp_4p_in_64(ind, 44, code);
+        }
+        else if (nb_bits <= NBBITS_16k)
+        {
+            for (i = 0; i < 4; i++)
+            {
+                ind[i] = Serial_parm(13, &prms);
+            }
+            dec_acelp_4p_in_64(ind, 52, code);
+        }
+        else if (nb_bits <= NBBITS_18k)
+        {
+            for (i = 0; i < 4; i++)
+            {
+                ind[i] = Serial_parm(2, &prms);
+            }
+            for (i = 4; i < 8; i++)
+            {
+                ind[i] = Serial_parm(14, &prms);
+            }
+            dec_acelp_4p_in_64(ind, 64, code);
+        }
+        else if (nb_bits <= NBBITS_20k)
+        {
+            ind[0] = Serial_parm(10, &prms);
+            ind[1] = Serial_parm(10, &prms);
+            ind[2] = Serial_parm(2, &prms);
+            ind[3] = Serial_parm(2, &prms);
+            ind[4] = Serial_parm(10, &prms);
+            ind[5] = Serial_parm(10, &prms);
+            ind[6] = Serial_parm(14, &prms);
+            ind[7] = Serial_parm(14, &prms);
+            dec_acelp_4p_in_64(ind, 72, code);
+        }
+        else
+        {
+            for (i = 0; i < 8; i++)
+            {
+                ind[i] = Serial_parm(11, &prms);
+            }
+
+            dec_acelp_4p_in_64(ind, 88, code);
+        }
+
+        preemph_amrwb_dec(code, st->tilt_code, L_SUBFR);
+
+        tmp = T0;
+
+        if (T0_frac > 2)
+        {
+            tmp++;
+        }
+        Pit_shrp(code, tmp, PIT_SHARP, L_SUBFR);
+
+        /*
+         *  Decode codebooks gains.
+         */
+
+        if (nb_bits <= NBBITS_9k)
+        {
+            index = Serial_parm(6, &prms); /* codebook gain index */
+
+            dec_gain2_amr_wb(index,
+                             6,
+                             code,
+                             L_SUBFR,
+                             &gain_pit,
+                             &L_gain_code,
+                             bfi,
+                             st->prev_bfi,
+                             st->state,
+                             unusable_frame,
+                             st->vad_hist,
+                             st->dec_gain);
+        }
+        else
+        {
+            index = Serial_parm(7, &prms); /* codebook gain index */
+
+            dec_gain2_amr_wb(index,
+                             7,
+                             code,
+                             L_SUBFR,
+                             &gain_pit,
+                             &L_gain_code,
+                             bfi,
+                             st->prev_bfi,
+                             st->state,
+                             unusable_frame,
+                             st->vad_hist,
+                             st->dec_gain);
+        }
+
+        /* find best scaling to perform on excitation (Q_new) */
+
+        tmp = st->Qsubfr[0];
+        for (i = 1; i < 4; i++)
+        {
+            if (st->Qsubfr[i] < tmp)
+            {
+                tmp = st->Qsubfr[i];
+            }
+        }
+
+        /* limit scaling (Q_new) to Q_MAX: see pv_amr_wb_cnst.h and syn_filt_32() */
+
+        if (tmp > Q_MAX)
+        {
+            tmp = Q_MAX;
+        }
+        Q_new = 0;
+        L_tmp = L_gain_code;                  /* L_gain_code in Q16 */
+
+
+        while ((L_tmp < 0x08000000L) && (Q_new < tmp))
+        {
+            L_tmp <<= 1;
+            Q_new += 1;
+
+        }
+        gain_code = amr_wb_round(L_tmp);          /* scaled gain_code with Qnew */
+
+        scale_signal(exc + i_subfr - (PIT_MAX + L_INTERPOL),
+                     PIT_MAX + L_INTERPOL + L_SUBFR,
+                     (int16)(Q_new - st->Q_old));
+
+        st->Q_old = Q_new;
+
+
+        /*
+         * Update parameters for the next subframe.
+         * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced)
+         */
+
+
+        if (bfi == 0)
+        {
+            /* LTP-Lag history update */
+            for (i = 4; i > 0; i--)
+            {
+                st->lag_hist[i] = st->lag_hist[i - 1];
+            }
+            st->lag_hist[0] = T0;
+
+            st->old_T0 = T0;
+            st->old_T0_frac = 0;              /* Remove fraction in case of BFI */
+        }
+        /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
+
+        /*
+         * Scale down by 1/8
+         */
+        for (i = L_SUBFR - 1; i >= 0; i--)
+        {
+            exc2[i] = (exc[i_subfr + i] + (0x0004 * (exc[i_subfr + i] != MAX_16))) >> 3;
+        }
+
+
+        /* post processing of excitation elements */
+
+        if (nb_bits <= NBBITS_9k)
+        {
+            pit_sharp = shl_int16(gain_pit, 1);
+
+            if (pit_sharp > 16384)
+            {
+                for (i = 0; i < L_SUBFR; i++)
+                {
+                    tmp = mult_int16(exc2[i], pit_sharp);
+                    L_tmp = mul_16by16_to_int32(tmp, gain_pit);
+                    L_tmp >>= 1;
+                    excp[i] = amr_wb_round(L_tmp);
+                }
+            }
+        }
+        else
+        {
+            pit_sharp = 0;
+        }
+
+        voice_fac = voice_factor(exc2, -3, 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;
+
+        /*
+         * - Find the total excitation.
+         * - Find synthesis speech corresponding to exc[].
+         * - Find maximum value of excitation for next scaling
+         */
+
+        pv_memcpy((void *)exc2, (void *)&exc[i_subfr], L_SUBFR*sizeof(*exc2));
+        max = 1;
+
+        for (i = 0; i < L_SUBFR; i++)
+        {
+            L_tmp = mul_16by16_to_int32(code[i], gain_code);
+            L_tmp = shl_int32(L_tmp, 5);
+            L_tmp = mac_16by16_to_int32(L_tmp, exc[i + i_subfr], gain_pit);
+            L_tmp = shl_int32(L_tmp, 1);
+            tmp = amr_wb_round(L_tmp);
+            exc[i + i_subfr] = tmp;
+            tmp = tmp - (tmp < 0);
+            max |= tmp ^(tmp >> 15);  /* |= tmp ^sign(tmp) */
+        }
+
+
+        /* tmp = scaling possible according to max value of excitation */
+        tmp = add_int16(norm_s(max), Q_new) - 1;
+
+        st->Qsubfr[3] = st->Qsubfr[2];
+        st->Qsubfr[2] = st->Qsubfr[1];
+        st->Qsubfr[1] = st->Qsubfr[0];
+        st->Qsubfr[0] = tmp;
+
+        /*
+         * phase dispersion to enhance noise in low bit rate
+         */
+
+
+        if (nb_bits <= NBBITS_7k)
+        {
+            j = 0;      /* high dispersion for rate <= 7.5 kbit/s */
+        }
+        else if (nb_bits <= NBBITS_9k)
+        {
+            j = 1;      /* low dispersion for rate <= 9.6 kbit/s */
+        }
+        else
+        {
+            j = 2;      /* no dispersion for rate > 9.6 kbit/s */
+        }
+
+        /* L_gain_code in Q16 */
+
+        phase_dispersion((int16)(L_gain_code >> 16),
+                         gain_pit,
+                         code,
+                         j,
+                         st->disp_mem,
+                         ScratchMem);
+
+        /*
+         * 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 = mult_int16(stab_fac, tmp);
+
+        L_tmp = L_gain_code;
+
+        if (L_tmp < st->L_gc_thres)
+        {
+            L_tmp += fxp_mul32_by_16b(L_gain_code, 6226) << 1;
+
+            if (L_tmp > st->L_gc_thres)
+            {
+                L_tmp = st->L_gc_thres;
+            }
+        }
+        else
+        {
+            L_tmp = fxp_mul32_by_16b(L_gain_code, 27536) << 1;
+
+            if (L_tmp < st->L_gc_thres)
+            {
+                L_tmp = st->L_gc_thres;
+            }
+        }
+        st->L_gc_thres = L_tmp;
+
+        L_gain_code = fxp_mul32_by_16b(L_gain_code, (32767 - fac)) << 1;
+
+
+        L_gain_code = add_int32(L_gain_code, fxp_mul32_by_16b(L_tmp, fac) << 1);
+
+        /*
+         * 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 */
+
+        /* build excitation */
+
+        gain_code = amr_wb_round(shl_int32(L_gain_code, Q_new));
+
+        L_tmp = (int32)(code[0] << 16);
+        L_tmp = msu_16by16_from_int32(L_tmp, code[1], tmp);
+        L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code);
+        L_tmp = shl_int32(L_tmp, 5);
+        L_tmp = mac_16by16_to_int32(L_tmp, exc2[0], gain_pit);
+        L_tmp = shl_int32(L_tmp, 1);       /* saturation can occur here */
+        exc2[0] = amr_wb_round(L_tmp);
+
+
+        for (i = 1; i < L_SUBFR - 1; i++)
+        {
+            L_tmp = (int32)(code[i] << 16);
+            L_tmp = msu_16by16_from_int32(L_tmp, (code[i + 1] + code[i - 1]), tmp);
+            L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code);
+            L_tmp = shl_int32(L_tmp, 5);
+            L_tmp = mac_16by16_to_int32(L_tmp, exc2[i], gain_pit);
+            L_tmp = shl_int32(L_tmp, 1);       /* saturation can occur here */
+            exc2[i] = amr_wb_round(L_tmp);
+        }
+
+        L_tmp = (int32)(code[L_SUBFR - 1] << 16);
+        L_tmp = msu_16by16_from_int32(L_tmp, code[L_SUBFR - 2], tmp);
+        L_tmp = mul_16by16_to_int32(amr_wb_round(L_tmp), gain_code);
+        L_tmp = shl_int32(L_tmp, 5);
+        L_tmp = mac_16by16_to_int32(L_tmp, exc2[L_SUBFR - 1], gain_pit);
+        L_tmp = shl_int32(L_tmp, 1);       /* saturation can occur here */
+        exc2[L_SUBFR - 1] = amr_wb_round(L_tmp);
+
+
+
+        if (nb_bits <= NBBITS_9k)
+        {
+            if (pit_sharp > 16384)
+            {
+                for (i = 0; i < L_SUBFR; i++)
+                {
+                    excp[i] = add_int16(excp[i], exc2[i]);
+                }
+                agc2_amr_wb(exc2, excp, L_SUBFR);
+                pv_memcpy((void *)exc2, (void *)excp, L_SUBFR*sizeof(*exc2));
+
+            }
+        }
+        if (nb_bits <= NBBITS_7k)
+        {
+            j = i_subfr >> 6;
+            for (i = 0; i < M; i++)
+            {
+                L_tmp = mul_16by16_to_int32(isf_tmp[i], sub_int16(32767, interpol_frac[j]));
+                L_tmp = mac_16by16_to_int32(L_tmp, isf[i], interpol_frac[j]);
+                HfIsf[i] = amr_wb_round(L_tmp);
+            }
+        }
+        else
+        {
+            pv_memset((void *)st->mem_syn_hf,
+                      0,
+                      (M16k - M)*sizeof(*st->mem_syn_hf));
+        }
+
+        if (nb_bits >= NBBITS_24k)
+        {
+            corr_gain = Serial_parm(4, &prms);
+        }
+        else
+        {
+            corr_gain = 0;
+        }
+
+        synthesis_amr_wb(p_Aq,
+                         exc2,
+                         Q_new,
+                         &synth16k[i_subfr + (i_subfr>>2)],
+                         corr_gain,
+                         HfIsf,
+                         nb_bits,
+                         newDTXState,
+                         st,
+                         bfi,
+                         ScratchMem);
+
+        p_Aq += (M + 1);                   /* interpolated LPC parameters for next subframe */
+    }
+
+    /*
+     *   Update signal for next frame.
+     *   -> save past of exc[]
+     *   -> save pitch parameters
+     */
+
+    pv_memcpy((void *)st->old_exc,
+              (void *)&old_exc[L_FRAME],
+              (PIT_MAX + L_INTERPOL)*sizeof(*old_exc));
+
+    scale_signal(exc, L_FRAME, (int16)(-Q_new));
+
+    dtx_dec_amr_wb_activity_update(&(st->dtx_decSt), isf, exc);
+
+    st->dtx_decSt.dtxGlobalState = newDTXState;
+
+    st->prev_bfi = bfi;
+
+    return 0;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.h
new file mode 100644
index 0000000..433fc92
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder.h
@@ -0,0 +1,158 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Name: pvamrwbdecoder.h
+
+     Date: 05/02/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Main header file for the Packet Video AMR Wide  Band  decoder library. The
+ constants, structures, and functions defined within this file, along with
+ a basic data types header file, is all that is needed to use and communicate
+ with the library. The internal data structures within the library are
+ purposely hidden.
+
+ ---* Need description of the input buffering. *-------
+
+ ---* Need an example of calling the library here *----
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+  (Normally header files do not have a reference section)
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef _PVAMRWBDECODER_H
+#define _PVAMRWBDECODER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_amr_wb_type_defs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+typedef struct
+{
+    int16 prev_ft;
+    int16 prev_mode;
+} RX_State;
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void pvDecoder_AmrWb_Init(void **spd_state, void *st, int16 ** ScratchMem);
+
+    int32 pvDecoder_AmrWb(
+        int16 mode,                          /* input : used mode             */
+        int16 prms[],                        /* input : parameter vector      */
+        int16 synth16k[],                    /* output: synthesis speech      */
+        int16 * frame_length,                /* output:  lenght of the frame  */
+        void *spd_state,                     /* i/o   : State structure       */
+        int16 frame_type,                    /* input : received frame type   */
+        int16 ScratchMem[]
+    );
+
+    void pvDecoder_AmrWb_Reset(void *st, int16 reset_all);
+
+    int16 pvDecoder_AmrWb_homing_frame_test(int16 input_frame[], int16 mode);
+
+    int16 pvDecoder_AmrWb_homing_frame_test_first(int16 input_frame[], int16 mode);
+
+    int32 pvDecoder_AmrWbMemRequirements();
+
+    void mime_unsorting(uint8 packet[],
+                        int16 compressed_data[],
+                        int16 *frame_type,
+                        int16 *mode,
+                        uint8 q,
+                        RX_State *st);
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* PVMP4AUDIODECODER_API_H */
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_acelp.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_acelp.h
new file mode 100644
index 0000000..5967115
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_acelp.h
@@ -0,0 +1,329 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/pvamrwbdecoder_acelp.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVAMRWBDECODER_ACELP_H
+#define PVAMRWBDECODER_ACELP_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*-----------------------------------------------------------------*
+     *                        LPC prototypes                           *
+     *-----------------------------------------------------------------*/
+
+    void isf_extrapolation(int16 HfIsf[]);
+
+    void Init_Lagconc(int16 lag_hist[]);
+    void lagconceal(
+        int16 gain_hist[],                   /* (i) : Gain history     */
+        int16 lag_hist[],                    /* (i) : Subframe size         */
+        int16 * T0,
+        int16 * old_T0,
+        int16 * seed,
+        int16 unusable_frame
+    );
+
+    void agc2_amr_wb(
+        int16 * sig_in,                      /* input : postfilter input signal  */
+        int16 * sig_out,                     /* in/out: postfilter output signal */
+        int16 l_trm                          /* input : subframe size            */
+    );
+
+    void low_pass_filt_7k_init(int16 mem[]);
+    void low_pass_filt_7k(
+        int16 signal[],                      /* input:  signal                  */
+        int16 lg,                            /* input:  length of input         */
+        int16 mem[],                         /* in/out: memory (size=30)        */
+        int16 x[]
+    );
+
+    int16 median5(int16 x[]);
+
+    void Isp_Az(
+        int16 isp[],                         /* (i) Q15 : Immittance spectral pairs            */
+        int16 a[],                           /* (o) Q12 : predictor coefficients (order = M)   */
+        int16 m,
+        int16 adaptive_scaling               /* (i) 0   : adaptive scaling disabled */
+        /*     1   : adaptive scaling enabled  */
+    );
+    void Isf_isp(
+        int16 isf[],                         /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+        int16 isp[],                         /* (o) Q15 : isp[m] (range: -1<=val<1)                */
+        int16 m                              /* (i)     : LPC order                                */
+    );
+    void interpolate_isp(
+        int16 isp_old[],                     /* input : isps from past frame              */
+        int16 isp_new[],                     /* input : isps from present frame           */
+        const int16 frac[],                  /* input : fraction for 3 first subfr (Q15)  */
+        int16 Az[]                           /* output: LP coefficients in 4 subframes    */
+    );
+    void weight_amrwb_lpc(
+        int16 a[],                           /* (i) Q12 : a[m+1]  LPC coefficients             */
+        int16 ap[],                          /* (o) Q12 : Spectral expanded LPC coefficients   */
+        int16 gamma,                         /* (i) Q15 : Spectral expansion factor.           */
+        int16 m                              /* (i)     : LPC order.                           */
+    );
+
+
+    /*-----------------------------------------------------------------*
+     *                        isf quantizers                           *
+     *-----------------------------------------------------------------*/
+
+    void Disf_ns(
+        int16 * indice,                      /* input:  quantization indices                  */
+        int16 * isf_q                        /* input : ISF in the frequency domain (0..0.5)  */
+    );
+
+    void Dpisf_2s_46b(
+        int16 * indice,                      /* input:  quantization indices                       */
+        int16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+        int16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+        int16 * isfold,                      /* input : past quantized ISF                    */
+        int16 * isf_buf,                     /* input : isf buffer                                                        */
+        int16 bfi,                           /* input : Bad frame indicator                   */
+        int16 enc_dec
+    );
+    void Dpisf_2s_36b(
+        int16 * indice,                      /* input:  quantization indices                       */
+        int16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
+        int16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
+        int16 * isfold,                      /* input : past quantized ISF                    */
+        int16 * isf_buf,                     /* input : isf buffer                                                        */
+        int16 bfi,                           /* input : Bad frame indicator                   */
+        int16 enc_dec
+    );
+
+
+    void Reorder_isf(
+        int16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+        int16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
+        int16 n                              /* (i)      : number of ISF                        */
+    );
+
+    /*-----------------------------------------------------------------*
+     *                       filter prototypes                         *
+     *-----------------------------------------------------------------*/
+
+    void oversamp_12k8_to_16k_init(
+        int16 mem[]                          /* output: memory (2*NB_COEF_UP) set to zeros  */
+    );
+    void oversamp_12k8_to_16k(
+        int16 sig12k8[],                     /* input:  signal to oversampling  */
+        int16 lg,                            /* input:  length of input         */
+        int16 sig16k[],                      /* output: oversampled signal      */
+        int16 mem[],                         /* in/out: memory (2*NB_COEF_UP)   */
+        int16 signal[]
+    );
+
+    void highpass_50Hz_at_12k8_init(int16 mem[]);
+    void highpass_50Hz_at_12k8(
+        int16 signal[],                      /* input/output signal */
+        int16 lg,                            /* lenght of signal    */
+        int16 mem[]                          /* filter memory [6]   */
+    );
+    void highpass_400Hz_at_12k8_init(int16 mem[]);
+    void highpass_400Hz_at_12k8(
+        int16 signal[],                      /* input/output signal */
+        int16 lg,                            /* lenght of signal    */
+        int16 mem[]                          /* filter memory [6]   */
+    );
+
+    void band_pass_6k_7k_init(int16 mem[]);
+    void band_pass_6k_7k(
+        int16 signal[],                      /* input:  signal                  */
+        int16 lg,                            /* input:  length of input         */
+        int16 mem[],                         /* in/out: memory (size=30)        */
+        int16 x[]
+    );
+
+
+    void preemph_amrwb_dec(
+        int16 x[],                           /* (i/o)   : input signal overwritten by the output */
+        int16 mu,                            /* (i) Q15 : preemphasis coefficient                */
+        int16 lg                             /* (i)     : lenght of filtering                    */
+    );
+
+    void deemphasis_32(
+        int16 x_hi[],                        /* (i)     : input signal (bit31..16) */
+        int16 x_lo[],                        /* (i)     : input signal (bit15..4)  */
+        int16 y[],                           /* (o)     : output signal (x16)      */
+        int16 mu,                            /* (i) Q15 : deemphasis factor        */
+        int16 L,                             /* (i)     : vector size              */
+        int16 * mem                          /* (i/o)   : memory (y[-1])           */
+    );
+
+
+    void wb_syn_filt(
+        int16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients           */
+        int16 m,                             /* (i)     : order of LP filter                       */
+        int16 x[],                           /* (i)     : input signal                             */
+        int16 y[],                           /* (o)     : output signal                            */
+        int16 lg,                            /* (i)     : size of filtering                        */
+        int16 mem[],                         /* (i/o)   : memory associated with this filtering.   */
+        int16 update,                        /* (i)     : 0=no update, 1=update of memory.         */
+        int16 y_buf[]
+    );
+    void Syn_filt_32(
+        int16 a[],                           /* (i) Q12 : a[m+1] prediction coefficients */
+        int16 m,                             /* (i)     : order of LP filter             */
+        int16 exc[],                         /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+        int16 Qnew,                          /* (i)     : exc scaling = 0(min) to 8(max) */
+        int16 sig_hi[],                      /* (o) /16 : synthesis high                 */
+        int16 sig_lo[],                      /* (o) /16 : synthesis low                  */
+        int16 lg                             /* (i)     : size of filtering              */
+    );
+
+    /*-----------------------------------------------------------------*
+     *                       pitch prototypes                          *
+     *-----------------------------------------------------------------*/
+
+
+    void Pred_lt4(
+        int16 exc[],                         /* in/out: excitation buffer */
+        int16 T0,                            /* input : integer pitch lag */
+        int16 frac,                          /* input : fraction of lag   */
+        int16 L_subfr                        /* input : subframe size     */
+    );
+
+    /*-----------------------------------------------------------------*
+     *                       gain prototypes                           *
+     *-----------------------------------------------------------------*/
+
+
+    void dec_gain2_amr_wb_init(
+        int16 * mem                          /* output  : memory (4 words)      */
+    );
+    void dec_gain2_amr_wb(
+        int16 index,                         /* (i)     :index of quantization.       */
+        int16 nbits,                         /* (i)     : number of bits (6 or 7)     */
+        int16 code[],                        /* (i) Q9  :Innovative vector.           */
+        int16 L_subfr,                       /* (i)     :Subframe lenght.             */
+        int16 * gain_pit,                    /* (o) Q14 :Pitch gain.                  */
+        int32 * gain_cod,                    /* (o) Q16 :Code gain.                   */
+        int16 bfi,                           /* (i)     :bad frame indicator          */
+        int16 prev_bfi,                      /* (i) : Previous BF indicator      */
+        int16 state,                         /* (i) : State of BFH               */
+        int16 unusable_frame,                /* (i) : UF indicator            */
+        int16 vad_hist,                      /* (i)         :number of non-speech frames  */
+        int16 * mem                          /* (i/o)   : memory (4 words)      */
+    );
+
+    /*-----------------------------------------------------------------*
+     *                       acelp prototypes                          *
+     *-----------------------------------------------------------------*/
+
+    void dec_acelp_2p_in_64(
+        int16 index,                         /* (i) :    12 bits index                                  */
+        int16 code[]                         /* (o) :Q9  algebraic (fixed) codebook excitation          */
+    );
+
+    void dec_acelp_4p_in_64(
+        int16 index[],                       /* (i) : index (20): 5+5+5+5 = 20 bits.                 */
+        /* (i) : index (36): 9+9+9+9 = 36 bits.                 */
+        /* (i) : index (44): 13+9+13+9 = 44 bits.               */
+        /* (i) : index (52): 13+13+13+13 = 52 bits.             */
+        /* (i) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.     */
+        /* (i) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.   */
+        /* (i) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+        int16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits              */
+        int16 code[]                         /* (o) Q9: algebraic (fixed) codebook excitation        */
+    );
+    void Pit_shrp(
+        int16 * x,                           /* in/out: impulse response (or algebraic code) */
+        int16 pit_lag,                       /* input : pitch lag                            */
+        int16 sharp,                         /* input : pitch sharpening factor (Q15)        */
+        int16 L_subfr                        /* input : subframe size                        */
+    );
+
+
+    /*-----------------------------------------------------------------*
+     *                        others prototypes                        *
+     *-----------------------------------------------------------------*/
+
+    int16 voice_factor(                       /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
+        int16 exc[],                         /* (i) Q_exc: pitch excitation                */
+        int16 Q_exc,                         /* (i)     : exc format                       */
+        int16 gain_pit,                      /* (i) Q14 : gain of pitch                    */
+        int16 code[],                        /* (i) Q9  : Fixed codebook excitation        */
+        int16 gain_code,                     /* (i) Q0  : gain of code                     */
+        int16 L_subfr                        /* (i)     : subframe length                  */
+    );
+
+    void scale_signal(
+        int16 x[],                           /* (i/o) : signal to scale               */
+        int16 lg,                            /* (i)   : size of x[]                   */
+        int16 exp                            /* (i)   : exponent: x = round(x << exp) */
+    );
+
+    int16 noise_gen_amrwb(int16 * seed);
+
+
+    void phase_dispersion(
+        int16 gain_code,                     /* (i) Q0  : gain of code             */
+        int16 gain_pit,                      /* (i) Q14 : gain of pitch            */
+        int16 code[],                        /* (i/o)   : code vector              */
+        int16 mode,                          /* (i)     : level, 0=hi, 1=lo, 2=off */
+        int16 disp_mem[],                    /* (i/o)   :  memory (size = 8) */
+        int16 ScratchMem[]
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* ACELP_H */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op.h
new file mode 100644
index 0000000..df239d2
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op.h
@@ -0,0 +1,249 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./src/pvamrwbdecoder_basic_op.h
+
+     Date: 05/07/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+
+#ifndef PVAMRWBDECODER_BASIC_OP_H
+#define PVAMRWBDECODER_BASIC_OP_H
+
+
+#include "normalize_amr_wb.h"
+
+
+#define MAX_32 (int32)0x7fffffffL
+#define MIN_32 (int32)0x80000000L
+
+#define MAX_16 (int16)+32767    /* 0x7fff */
+#define MIN_16 (int16)-32768    /* 0x8000 */
+
+
+
+
+/*----------------------------------------------------------------------------
+     Function Name : negate_int16
+
+     Negate var1 with saturation, saturate in the case where input is -32768:
+                  negate(var1) = sub(0,var1).
+
+     Inputs :
+      var1
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x8000 <= var1 <= 0x7fff.
+
+     Outputs :
+      none
+
+     Return Value :
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x8000 <= var_out <= 0x7fff.
+ ----------------------------------------------------------------------------*/
+
+__inline int16 negate_int16(int16 var1)
+{
+    return (((var1 == MIN_16) ? MAX_16 : -var1));
+}
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : shl_int16
+
+     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.
+
+     Inputs :
+      var1
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x8000 <= var1 <= 0x7fff.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x8000 <= var1 <= 0x7fff.
+
+     Return Value :
+      var_out
+               16 bit short signed integer (int16) whose value falls in the
+               range : 0x8000 <= var_out <= 0x7fff.
+ ----------------------------------------------------------------------------*/
+
+__inline int16 shl_int16(int16 var1, int16 var2)
+{
+    int16 var_out;
+
+    if (var2 < 0)
+    {
+        var2 = (-var2) & (0xf);
+        var_out = var1 >> var2;
+    }
+    else
+    {
+        var2 &= 0xf;
+        var_out = var1 << var2;
+        if (var_out >> var2 != var1)
+        {
+            var_out = (var1 >> 15) ^ MAX_16;
+        }
+    }
+    return (var_out);
+}
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : shl_int32
+
+     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.
+
+     Inputs :
+      L_var1   32 bit long signed integer (int32) whose value falls in the
+               range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range :  8000 <= var2 <= 7fff.
+     Return Value :
+               32 bit long signed integer (int32) whose value falls in the
+               range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+ ----------------------------------------------------------------------------*/
+
+__inline int32 shl_int32(int32 L_var1, int16 var2)
+{
+    int32 L_var_out;
+
+    if (var2 > 0)
+    {
+        L_var_out = L_var1 << var2;
+        if (L_var_out >> var2 != L_var1)
+        {
+            L_var_out = (L_var1 >> 31) ^ MAX_32;
+        }
+    }
+    else
+    {
+        var2 = (-var2) & (0xf);
+        L_var_out = L_var1 >> var2;
+    }
+
+    return (L_var_out);
+}
+
+
+/*----------------------------------------------------------------------------
+
+     Function Name : shr_int32
+
+     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.
+
+     Inputs :
+      L_var1   32 bit long signed integer (int32) whose value falls in the
+               range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+      var2
+               16 bit short signed integer (int16) whose value falls in the
+               range :  8000 <= var2 <= 7fff.
+     Return Value :
+               32 bit long signed integer (int32) whose value falls in the
+               range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+ ----------------------------------------------------------------------------*/
+
+__inline int32 shr_int32(int32 L_var1, int16 var2)
+{
+    int32 L_var_out;
+
+    if (var2 >= 0)
+    {
+        L_var_out = L_var1 >> (var2 & 0x1f);
+    }
+    else
+    {
+        var2 = (int16)(-var2);
+        var2 &= 0x1f;
+        L_var_out = L_var1 << var2;
+        if (L_var_out >> var2 != L_var1)
+        {
+            L_var_out = (L_var1 >> 31) ^ MAX_32;
+        }
+
+    }
+    return (L_var_out);
+}
+
+
+
+
+
+
+#if defined(PV_ARM_V5)
+
+#include "pvamrwbdecoder_basic_op_armv5.h"
+
+#elif defined(PV_ARM_GCC_V5)
+
+#include "pvamrwbdecoder_basic_op_gcc_armv5.h"
+
+#else
+
+#ifndef C_EQUIVALENT
+#define C_EQUIVALENT        // default to C_EQUIVALENT
+#endif
+
+#include "pvamrwbdecoder_basic_op_cequivalent.h"
+
+#endif
+
+
+#endif   /*  PVAMRWBDECODER_BASIC_OP_H  */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_armv5.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_armv5.h
new file mode 100644
index 0000000..c800a2e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_armv5.h
@@ -0,0 +1,253 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./src/pvamrwbdecoder_basic_op_armv5.h
+
+     Date: 05/07/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVAMRWBDECODER_BASIC_OP_ARMV5_H
+#define PVAMRWBDECODER_BASIC_OP_ARMV5_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+
+
+
+#if defined(PV_ARM_V5)
+
+    __inline int16 add_int16(int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+        int32 L_var_aux;
+
+        __asm
+        {
+            mov L_var_out, var1, lsl #16
+            mov L_var_aux, var2, lsl #16
+            qadd L_var_out, L_var_out, L_var_aux
+            mov L_var_out, L_var_out, asr #16
+
+        }
+        return L_var_out;
+    }
+
+
+    __inline int16 sub_int16(int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+        int32 L_var_aux;
+
+        __asm
+        {
+            mov L_var_out, var1, lsl #16
+            mov L_var_aux, var2, lsl #16
+            qsub L_var_out, L_var_out, L_var_aux
+            mov L_var_out, L_var_out, asr #16
+
+        }
+        return L_var_out;
+    }
+
+
+    __inline int32 add_int32(int32 L_var1, int32 L_var2)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            qadd L_var_out, L_var1, L_var2
+        }
+        return L_var_out;
+    }
+
+
+    __inline int32 mac_16by16_to_int32(int32 L_var3, int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+
+
+        __asm
+        {
+            smulbb L_var_out, var1, var2
+            qdadd L_var_out, L_var3, L_var_out
+        }
+        return L_var_out;
+    }
+
+    __inline int32 sub_int32(int32 L_var1, int32 L_var2)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            qsub L_var_out, L_var1, L_var2
+        }
+        return L_var_out;
+    }
+
+    __inline int32 msu_16by16_from_int32(int32 L_var3, int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+
+
+        __asm
+        {
+            smulbb L_var_out, var1, var2
+            qdsub L_var_out, L_var3, L_var_out
+        }
+        return L_var_out;
+    }
+
+    __inline int32 mul_16by16_to_int32(int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            smulbb L_var_out, var1, var2
+            qadd L_var_out, L_var_out, L_var_out
+        }
+        return L_var_out;
+    }
+
+    __inline int16 mult_int16(int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            smulbb L_var_out, var1, var2
+            mov L_var_out, L_var_out, asr #15
+        }
+        return L_var_out;
+    }
+
+
+    __inline int16 amr_wb_round(int32 L_var1)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            qadd L_var_out, L_var1, (int32) 0x00008000L
+            mov L_var_out, L_var_out, asr #16
+        }
+        return L_var_out;
+    }
+
+
+
+    __inline int16 amr_wb_shl1_round(int32 L_var1)
+    {
+        int32 L_var_out;
+
+        __asm
+        {
+            qadd L_var_out, L_var1, L_var1
+            qadd L_var_out, L_var_out, (int32) 0x00008000L
+            mov L_var_out, L_var_out, asr #16
+        }
+        return L_var_out;
+    }
+
+    __inline int32 mul_32by16(int16 hi, int16 lo, int16 n)
+    {
+        int32 H_32;
+        int32 L_32;
+        __asm
+        {
+            smulbb H_32, hi, n
+            smulbb L_32, lo, n
+            add H_32, H_32, L_32, asr #15
+            qadd H_32, H_32, H_32
+        }
+
+        return (H_32);
+    }
+
+    __inline  int32 fxp_mac_16by16(const int16 var1, const int16 var2, int32 L_add)
+    {
+        __asm
+        {
+            smlabb L_add, var1, var2, L_add
+        }
+        return (L_add);
+    }
+
+    __inline  int32 fxp_mul_16by16(int16 var1, const int16 var2)
+    {
+        int32 L_mult;
+        __asm
+        {
+            smulbb L_mult, var1, var2
+        }
+        return (L_mult);
+    }
+
+    __inline  int32 fxp_mul32_by_16b(int32 L_var1, const int32 L_var2)
+    {
+        int32 L_mult;
+        __asm
+        {
+            smulwb L_mult, L_var1, L_var2
+        }
+
+        return L_mult;
+    }
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif   /*  PVAMRWBDECODER_BASIC_OP_ARMV5_H  */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_cequivalent.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_cequivalent.h
new file mode 100644
index 0000000..7fd680d
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_cequivalent.h
@@ -0,0 +1,545 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./src/pvamrwbdecoder_basic_op_cequivalent.h
+
+     Date: 05/07/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+#ifndef PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H
+#define PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "normalize_amr_wb.h"
+
+#if defined(C_EQUIVALENT)
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : add_int16
+
+         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.
+
+         Inputs :
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+         Outputs :
+          none
+
+         Return Value :
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+
+     ----------------------------------------------------------------------------*/
+    __inline int16 add_int16(int16 var1, int16 var2)
+    {
+        int32 L_sum;
+
+        L_sum = (int32) var1 + var2;
+        if ((L_sum >> 15) != (L_sum >> 31))
+        {
+            L_sum = (L_sum >> 31) ^ MAX_16;
+        }
+        return ((int16)(L_sum));
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : sub_int16
+
+          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.
+
+         Inputs :
+
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+         Outputs :
+          none
+
+         Return Value :
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+
+     ----------------------------------------------------------------------------*/
+    __inline int16 sub_int16(int16 var1, int16 var2)
+    {
+        int32 L_diff;
+
+        L_diff = (int32) var1 - var2;
+        if ((L_diff >> 15) != (L_diff >> 31))
+        {
+            L_diff = (L_diff >> 31) ^ MAX_16;
+        }
+        return ((int16)(L_diff));
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : mult_int16
+
+          Performs the multiplication of var1 by var2 and gives a 16 bit result
+          which is scaled i.e.:
+                   mult_int16(var1,var2) = extract_l(L_shr((var1 times var2),15)) and
+                   mult_int16(-32768,-32768) = 32767.
+
+         Inputs :
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+
+         Return Value :
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+
+     ----------------------------------------------------------------------------*/
+
+    __inline int16 mult_int16(int16 var1, int16 var2)
+    {
+        int32 L_product;
+
+        L_product = ((int32) var1 * (int32) var2) >> 15;
+
+        if ((L_product >> 15) != (L_product >> 31))
+        {
+            L_product = (L_product >> 31) ^ MAX_16;
+        }
+
+        return ((int16)L_product);
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : add_int32
+
+         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.
+
+         Inputs :
+
+          L_var1   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+          L_var2   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+
+         Return Value :
+          L_var_out
+                   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+
+    __inline  int32 add_int32(int32 L_var1, int32 L_var2)
+    {
+        int32 L_var_out;
+
+        L_var_out = L_var1 + L_var2;
+
+        if (((L_var1 ^ L_var2) & MIN_32) == 0)  /* same sign ? */
+        {
+            if ((L_var_out ^ L_var1) & MIN_32)  /* addition matches sign ? */
+            {
+                L_var_out = (L_var1 >> 31) ^ MAX_32;
+            }
+        }
+        return (L_var_out);
+    }
+
+
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : sub_int32
+
+         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.
+
+         Inputs :
+
+          L_var1   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+          L_var2   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+
+         Return Value :
+          L_var_out
+                   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+
+    __inline  int32 sub_int32(int32 L_var1, int32 L_var2)
+    {
+        int32 L_var_out;
+
+        L_var_out = L_var1 - L_var2;
+
+        if (((L_var1 ^ L_var2) & MIN_32) != 0)  /* different sign ? */
+        {
+            if ((L_var_out ^ L_var1) & MIN_32)  /* difference matches sign ? */
+            {
+                L_var_out = (L_var1 >> 31) ^ MAX_32;
+            }
+        }
+        return (L_var_out);
+    }
+
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : mac_16by16_to_int32
+
+         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)).
+
+         Inputs :
+
+          L_var3   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+
+         Return Value :
+                   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+
+    __inline  int32 mac_16by16_to_int32(int32 L_var3, int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+        int32 L_mul;
+
+        L_mul  = ((int32) var1 * (int32) var2);
+
+        if (L_mul != 0x40000000)
+        {
+            L_mul <<= 1;
+        }
+        else
+        {
+            L_mul = MAX_32;     /* saturation */
+        }
+
+        L_var_out = L_var3 + L_mul;
+
+        if (((L_mul ^ L_var3) & MIN_32) == 0)  /* same sign ? */
+        {
+            if ((L_var_out ^ L_var3) & MIN_32)  /* addition matches sign ? */
+            {
+                L_var_out = (L_var3 >> 31) ^ MAX_32;
+            }
+        }
+
+        return (L_var_out);
+    }
+
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : msu_16by16_from_int32
+
+         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)).
+
+         Inputs :
+
+          L_var3   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var3 <= 0x7fff ffff.
+
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+
+         Return Value :
+                   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+    __inline  int32 msu_16by16_from_int32(int32 L_var3, int16 var1, int16 var2)
+    {
+        int32 L_var_out;
+        int32 L_mul;
+
+        L_mul  = ((int32) var1 * (int32) var2);
+
+        if (L_mul != 0x40000000)
+        {
+            L_mul <<= 1;
+        }
+        else
+        {
+            L_mul = MAX_32;     /* saturation */
+        }
+
+        L_var_out = L_var3 - L_mul;
+
+        if (((L_mul ^ L_var3) & MIN_32) != 0)  /* different sign ? */
+        {
+            if ((L_var_out ^ L_var3) & MIN_32)  /* difference matches sign ? */
+            {
+                L_var_out = (L_var3 >> 31) ^ MAX_32;
+            }
+        }
+
+        return (L_var_out);
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : mul_16by16_to_int32
+
+         mul_16by16_to_int32 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.
+
+         Inputs :
+          var1
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+          var2
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var1 <= 0x0000 7fff.
+
+         Return Value :
+                   32 bit long signed integer (int32) whose value falls in the
+                   range : 0x8000 0000 <= L_var_out <= 0x7fff ffff.
+
+     ----------------------------------------------------------------------------*/
+
+
+    __inline  int32 mul_16by16_to_int32(int16 var1, int16 var2)
+    {
+        int32 L_mul;
+
+        L_mul  = ((int32) var1 * (int32) var2);
+
+        if (L_mul != 0x40000000)
+        {
+            L_mul <<= 1;
+        }
+        else
+        {
+            L_mul = MAX_32;     /* saturation */
+        }
+
+        return (L_mul);
+
+    }
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : amr_wb_round
+
+         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))
+
+         Inputs :
+          L_var1
+                   32 bit long signed integer (int32 ) whose value falls in the
+                   range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+         Return Value :
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+
+     ----------------------------------------------------------------------------*/
+    __inline int16 amr_wb_round(int32 L_var1)
+    {
+        if (L_var1 != MAX_32)
+        {
+            L_var1 +=  0x00008000L;
+        }
+        return ((int16)(L_var1 >> 16));
+    }
+
+
+    /*----------------------------------------------------------------------------
+
+         Function Name : amr_wb_shl1_round
+
+         Shift the 32 bit input number to the left by 1, round up the result and
+         shift down by 16
+                     amr_wb_shl1_round(L_var1) = round(L_shl(L_var1,1))
+
+         Inputs :
+          L_var1
+                   32 bit long signed integer (int32 ) whose value falls in the
+                   range : 0x8000 0000 <= L_var1 <= 0x7fff ffff.
+
+         Return Value :
+                   16 bit short signed integer (int16) whose value falls in the
+                   range : 0xffff 8000 <= var_out <= 0x0000 7fff.
+
+     ----------------------------------------------------------------------------*/
+    __inline int16 amr_wb_shl1_round(int32 L_var1)
+    {
+        int16 var_out;
+
+        if ((L_var1 << 1) >> 1 == L_var1)
+        {
+            var_out = (int16)((L_var1 + 0x00004000) >> 15);
+        }
+        else
+        {
+            var_out = (int16)(((L_var1 >> 31) ^ MAX_32) >> 16);
+        }
+
+        return (var_out);
+    }
+
+    /*----------------------------------------------------------------------------
+             Function Name : mul_32by16
+
+             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
+
+             Inputs :
+
+             hi          hi part of 32 bit number.
+             lo          lo part of 32 bit number.
+             n           16 bit number.
+
+         ----------------------------------------------------------------------------*/
+
+
+    __inline int32 mul_32by16(int16 hi, int16 lo, int16 n)
+    {
+        return (((((int32)hi*n)) + ((((int32)lo*n) >> 15))) << 1);
+    }
+
+    __inline  int32 fxp_mac_16by16(int16 var1,  int16 var2, int32 L_add)
+    {
+
+        L_add += (int32)var1 * var2;
+
+        return L_add;
+    }
+
+    __inline  int32 fxp_mul_16by16(int16 var1, const int16 var2)
+    {
+        int32 L_mul = (int32)var1 * var2;
+
+        return L_mul;
+    }
+
+    __inline  int32 fxp_mul32_by_16b(int32 L_var1, const int32 L_var2)
+    {
+
+        int32 L_mul = (int32)(((int64)L_var1 * (L_var2 << 16)) >> 32);
+
+        return L_mul;
+    }
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#endif   /*  PVAMRWBDECODER_BASIC_OP_CEQUIVALENT_H  */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_gcc_armv5.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_gcc_armv5.h
new file mode 100644
index 0000000..741b584
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_basic_op_gcc_armv5.h
@@ -0,0 +1,319 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./src/pvamrwbdecoder_basic_op_gcc_armv5.h
+
+     Date: 05/07/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVAMRWBDECODER_BASIC_OP_GCC_ARMV5_H
+#define PVAMRWBDECODER_BASIC_OP_GCC_ARMV5_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#if (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+    static inline int16 sub_int16(int16 var1, int16 var2)
+    {
+        register int32 L_var_out;
+        register int32 L_var_aux;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+
+        asm volatile(
+            "mov  %0, %2, lsl #16\n"
+            "mov  %1, %3, lsl #16\n"
+            "qsub %0, %0, %1\n"
+            "mov  %0, %0, asr #16"
+    : "=&r*i"(L_var_out),
+            "=&r*i"(L_var_aux)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (int16)L_var_out;
+
+    }
+
+    static inline int16 add_int16(int16 var1, int16 var2)
+{
+        register int32 L_var_out;
+        register int32 L_var_aux;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+
+        asm volatile(
+            "mov  %0, %2, lsl #16\n"
+            "mov  %1, %3, lsl #16\n"
+            "qadd %0, %0, %1\n"
+            "mov  %0, %0, asr #16"
+    : "=&r*i"(L_var_out),
+            "=&r*i"(L_var_aux)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (int16)L_var_out;
+
+    }
+
+    static inline  int32 mul_32by16(int16 hi, int16 lo, int16 n)
+{
+        register int32 H_32;
+        register int32 L_32;
+        register int32 ra = (int32)hi;
+        register int32 rb = (int32)lo;
+        register int32 rc = (int32)n;
+
+
+        asm volatile(
+            "smulbb %0, %2, %4\n"
+            "smulbb %1, %3, %4\n"
+            "add    %0, %0, %1, asr #15\n"
+            "qadd   %0, %0, %0"
+    : "=&r*i"(H_32),
+            "=&r*i"(L_32)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return H_32;
+    }
+
+
+    static inline int32 sub_int32(int32 L_var1, int32 L_var2)
+{
+        register int32 L_var_out;
+        register int32 ra = L_var1;
+        register int32 rb = L_var2;
+
+        asm volatile(
+            "qsub %0, %1, %2"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return L_var_out;
+    }
+
+    static inline int32 add_int32(int32 L_var1, int32 L_var2)
+{
+        register int32 L_var_out;
+        register int32 ra = L_var1;
+        register int32 rb = L_var2;
+
+        asm volatile(
+            "qadd %0, %1, %2"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return L_var_out;
+    }
+
+    static inline int32 msu_16by16_from_int32(int32 L_var3, int16 var1, int16 var2)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+        register int32 rc = L_var3;
+
+        asm volatile(
+            "smulbb %0, %1, %2\n"
+            "qdsub %0, %3, %0"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return L_var_out;
+    }
+
+
+    static inline int32 mac_16by16_to_int32(int32 L_var3, int16 var1, int16 var2)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+        register int32 rc = L_var3;
+
+        asm volatile(
+            "smulbb %0, %1, %2\n"
+            "qdadd %0, %3, %0"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return L_var_out;
+    }
+
+
+    static inline  int32 mul_16by16_to_int32(int16 var1, int16 var2)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+
+        asm volatile(
+            "smulbb %0, %1, %2\n"
+            "qadd %0, %0, %0"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return L_var_out;
+    }
+
+
+    static inline int16 mult_int16(int16 var1, int16 var2)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)var1;
+        register int32 rb = (int32)var2;
+
+        asm volatile(
+            "smulbb %0, %1, %2\n"
+            "mov %0, %0, asr #15"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (int16)L_var_out;
+    }
+
+    static inline int16 amr_wb_round(int32 L_var1)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)L_var1;
+        register int32 rb = (int32)0x00008000L;
+
+        asm volatile(
+            "qadd %0, %1, %2\n"
+            "mov %0, %0, asr #16"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+        return (int16)L_var_out;
+    }
+
+    static inline int16 amr_wb_shl1_round(int32 L_var1)
+{
+        register int32 L_var_out;
+        register int32 ra = (int32)L_var1;
+        register int32 rb = (int32)0x00008000L;
+
+        asm volatile(
+            "qadd %0, %1, %1\n"
+            "qadd %0, %0, %2\n"
+            "mov %0, %0, asr #16"
+    : "=&r*i"(L_var_out)
+                    : "r"(ra),
+                    "r"(rb));
+        return (int16)L_var_out;
+    }
+
+
+    static inline int32 fxp_mac_16by16(const int16 L_var1, const int16 L_var2, int32 L_add)
+{
+        register int32 tmp;
+        register int32 ra = (int32)L_var1;
+        register int32 rb = (int32)L_var2;
+        register int32 rc = (int32)L_add;
+
+        asm volatile(
+            "smlabb %0, %1, %2, %3"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+        return (tmp);
+    }
+
+    static inline int32 fxp_mul_16by16bb(int16 L_var1, const int16 L_var2)
+{
+        register int32 tmp;
+        register int32 ra = (int32)L_var1;
+        register int32 rb = (int32)L_var2;
+
+        asm volatile(
+            "smulbb %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+        return (tmp);
+    }
+
+
+#define fxp_mul_16by16(a, b)  fxp_mul_16by16bb(  a, b)
+
+
+    static inline int32 fxp_mul32_by_16(int32 L_var1, const int32 L_var2)
+{
+        register int32 tmp;
+        register int32 ra = (int32)L_var1;
+        register int32 rb = (int32)L_var2;
+
+        asm volatile(
+            "smulwb %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+        return (tmp);
+    }
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif   /*  PVAMRWBDECODER_BASIC_OP_GCC_ARMV5_H  */
+
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_cnst.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_cnst.h
new file mode 100644
index 0000000..ecf1bf3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_cnst.h
@@ -0,0 +1,142 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+ Name: pvamrwbdecoder_cnst.h
+
+     Date: 05/02/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Main header file for the Packet Video AMR Wide  Band  decoder library. The
+ constants, structures, and functions defined within this file, along with
+ a basic data types header file, is all that is needed to use and communicate
+ with the library. The internal data structures within the library are
+ purposely hidden.
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+  (Normally header files do not have a reference section)
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#ifndef PVAMRWBDECODER_CNST_H
+#define PVAMRWBDECODER_CNST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+#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 (int16)0x0008            /* homing frame pattern                       */
+
+#define BIT_0     (int16)-127
+#define BIT_1     (int16)127
+#define BIT_0_ITU (int16)0x007F
+#define BIT_1_ITU (int16)0x0081
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
diff --git a/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_mem_funcs.h b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_mem_funcs.h
new file mode 100644
index 0000000..e348916
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/pvamrwbdecoder_mem_funcs.h
@@ -0,0 +1,67 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: pvamrwbdecoder_mem_funcs.h
+ Funtions:
+
+
+     Date: 05/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#ifndef PVAMRWBDECODER_MEM_FUNCS_H
+#define PVAMRWBDECODER_MEM_FUNCS_H
+
+#include <string.h>
+
+
+#define pv_memset(to, c, n)         memset(to, c, n)
+
+
+#define pv_memcpy(to, from, n)      memcpy(to, from, n)
+#define pv_memmove(to, from, n)     memmove(to, from, n)
+#define pv_memcmp(p, q, n)          memcmp(p, q, n)
+
+
+
+#endif
diff --git a/media/libstagefright/codecs/amrwb/src/q_gain2_tab.cpp b/media/libstagefright/codecs/amrwb/src/q_gain2_tab.cpp
new file mode 100644
index 0000000..92c235f
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/q_gain2_tab.cpp
@@ -0,0 +1,244 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+#include "qisf_ns.h"
+
+
+/*
+ * Tables for function q_gain2()
+ *
+ *  g_pitch(Q14),  g_code(Q11)
+ *
+ * pitch gain are ordered in table to reduce complexity
+ * during quantization of gains.
+ */
+
+
+
+
+const int16 t_qua_gain6b[NB_QUA_GAIN6B*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
+};
+
+const int16 t_qua_gain7b[NB_QUA_GAIN7B*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/amrwb/src/q_pulse.h b/media/libstagefright/codecs/amrwb/src/q_pulse.h
new file mode 100644
index 0000000..0ac52b3
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/q_pulse.h
@@ -0,0 +1,79 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/q_pulse.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+  Coding and decoding of algebraic codebook
+------------------------------------------------------------------------------
+*/
+
+#ifndef Q_PULSE_H
+#define Q_PULSE_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    void dec_1p_N1(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_2p_2N1(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_3p_3N1(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_4p_4N1(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_4p_4N(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_5p_5N(int32 index, int16 N, int16 offset, int16 pos[]);
+    void dec_6p_6N_2(int32 index, int16 N, int16 offset, int16 pos[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* Q_PULSE_H */
diff --git a/media/libstagefright/codecs/amrwb/src/qisf_ns.cpp b/media/libstagefright/codecs/amrwb/src/qisf_ns.cpp
new file mode 100644
index 0000000..07e342b
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qisf_ns.cpp
@@ -0,0 +1,145 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: qisf_ns.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 indice[] : indices of the selected codebook entries
+     int16 isf[]    : quantized ISFs (in frequency domain)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Coding/Decoding of ISF parameters for background noise.
+
+   The ISF vector is quantized using VQ with split-by-5
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "qisf_ns.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Disf_ns(
+    int16 * indice,   /* input:  quantization indices               */
+    int16 * isf_q     /* input: ISF in the frequency domain (0..0.5)*/
+)
+{
+    int16 i;
+
+    isf_q[0] = dico1_isf_noise[(indice[0] << 1)];
+    isf_q[1] = dico1_isf_noise[(indice[0] << 1) + 1];
+
+    for (i = 0; i < 3; i++)
+    {
+        isf_q[i + 2] = dico2_isf_noise[(indice[1] << 1) + indice[1] + i];
+        isf_q[i + 5] = dico3_isf_noise[(indice[2] << 1) + indice[2] + i];
+    }
+
+    for (i = 0; i < 4; i++)
+    {
+        isf_q[i +  8] = dico4_isf_noise[(indice[3] << 2) + i];
+        isf_q[i + 12] = dico5_isf_noise[(indice[4] << 2) + i];
+    }
+
+    for (i = 0; i < ORDER; i++)
+    {
+        isf_q[i] = add_int16(isf_q[i], mean_isf_noise[i]);
+    }
+
+    Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+}
diff --git a/media/libstagefright/codecs/amrwb/src/qisf_ns.h b/media/libstagefright/codecs/amrwb/src/qisf_ns.h
new file mode 100644
index 0000000..4e9f67e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qisf_ns.h
@@ -0,0 +1,113 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/qisf_ns.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef QISF_NS_H
+#define QISF_NS_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; DEFINES
+----------------------------------------------------------------------------*/
+
+
+#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
+
+#define NB_QUA_GAIN6B  64     /* Number of quantization level */
+#define NB_QUA_GAIN7B  128    /* Number of quantization level */
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+extern const int16 mean_isf_noise[ORDER];
+extern const int16 dico1_isf_noise[SIZE_BK_NOISE1*2];
+extern const int16 dico2_isf_noise[SIZE_BK_NOISE2*3];
+extern const int16 dico3_isf_noise[SIZE_BK_NOISE3*3];
+extern const int16 dico4_isf_noise[SIZE_BK_NOISE4*4];
+extern const int16 dico5_isf_noise[SIZE_BK_NOISE5*4];
+
+extern const int16 t_qua_gain6b[NB_QUA_GAIN6B*2];
+extern const int16 t_qua_gain7b[NB_QUA_GAIN7B*2];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif  /* QISF_NS_H */
diff --git a/media/libstagefright/codecs/amrwb/src/qisf_ns_tab.cpp b/media/libstagefright/codecs/amrwb/src/qisf_ns_tab.cpp
new file mode 100644
index 0000000..e5630e8
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qisf_ns_tab.cpp
@@ -0,0 +1,367 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+ *                         qisf_ns_tab.cpp
+ *
+ * Quantization tables for split by 5 VQ of ISFs for a background
+ * noise database
+ * Version whith no prediction
+ */
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "qisf_ns.h"
+
+
+/* means of ISFs */
+const int16 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
+ */
+
+
+const int16 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
+ */
+
+const int16 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
+ */
+
+const int16 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
+ */
+
+const int16 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
+ */
+
+const int16 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/amrwb/src/qpisf_2s.cpp b/media/libstagefright/codecs/amrwb/src/qpisf_2s.cpp
new file mode 100644
index 0000000..0d465c6
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qpisf_2s.cpp
@@ -0,0 +1,350 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: qpisf_2s.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    int16 * seed          seed for the random ng
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Coding/Decoding of ISF parameters  with prediction.
+
+   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.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+#include "qisf_ns.h"
+#include "qpisf_2s.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#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 */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+/*-------------------------------------------------------------------*
+ * routine:   Disf_2s_46b()                                          *
+ *            ~~~~~~~~~                                              *
+ * Decoding of ISF parameters                                        *
+ *-------------------------------------------------------------------*/
+
+void Dpisf_2s_46b(
+    int16 * indice,   /* input:  quantization indices                       */
+    int16 * isf_q,    /* output: quantized ISF in frequency domain (0..0.5) */
+    int16 * past_isfq,/* i/0   : past ISF quantizer                    */
+    int16 * isfold,   /* input : past quantized ISF                    */
+    int16 * isf_buf,  /* input : isf buffer                            */
+    int16 bfi,        /* input : Bad frame indicator                   */
+    int16 enc_dec
+)
+{
+    int16 ref_isf[M];
+    int16 i, j, tmp;
+    int32 L_tmp;
+
+
+    if (bfi == 0)                          /* Good frame */
+    {
+        for (i = 0; i < 9; i++)
+        {
+            isf_q[i] = dico1_isf[(indice[0] << 3) + indice[0] + i];
+        }
+        for (i = 0; i < 7; i++)
+        {
+            isf_q[i + 9] = dico2_isf[(indice[1] << 3) - indice[1] + i];
+        }
+
+        for (i = 0; i < 3; i++)
+        {
+            isf_q[i]      += dico21_isf[indice[2] * 3 + i];
+            isf_q[i + 3]  += dico22_isf[indice[3] * 3 + i];
+            isf_q[i + 6]  += dico23_isf[indice[4] * 3 + i];
+            isf_q[i + 9]  += dico24_isf[indice[5] * 3 + i];
+            isf_q[i + 12] += dico25_isf[(indice[6] << 2) + i];
+        }
+
+        isf_q[i + 12] += dico25_isf[(indice[6] << 2) + i];
+
+        for (i = 0; i < ORDER; i++)
+        {
+            tmp = isf_q[i];
+            isf_q[i] += mean_isf[i];
+            isf_q[i] += ((int32)MU * past_isfq[i]) >> 15;
+            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 = mul_16by16_to_int32(mean_isf[i], 8192);
+            for (j = 0; j < L_MEANBUF; j++)
+            {
+                L_tmp = mac_16by16_to_int32(L_tmp, isf_buf[j * M + i], 8192);
+            }
+            ref_isf[i] = amr_wb_round(L_tmp);
+        }
+
+        /* use the past ISFs slightly shifted towards their mean */
+        for (i = 0; i < ORDER; i++)
+        {
+            isf_q[i] = add_int16(mult_int16(ALPHA, isfold[i]), mult_int16(ONE_ALPHA, ref_isf[i]));
+        }
+
+        /* estimate past quantized residual to be used in next frame */
+
+        for (i = 0; i < ORDER; i++)
+        {
+            tmp = add_int16(ref_isf[i], mult_int16(past_isfq[i], MU));      /* predicted ISF */
+            past_isfq[i] = sub_int16(isf_q[i], tmp);
+            past_isfq[i] >>= 1;           /* past_isfq[i] *= 0.5 */
+        }
+
+    }
+
+    Reorder_isf(isf_q, ISF_GAP, ORDER);
+}
+
+/*
+ * routine:   Disf_2s_36b()
+ *            ~~~~~~~~~
+ * Decoding of ISF parameters
+ */
+
+void Dpisf_2s_36b(
+    int16 * indice,    /* input:  quantization indices                       */
+    int16 * isf_q,     /* output: quantized ISF in frequency domain (0..0.5) */
+    int16 * past_isfq, /* i/0   : past ISF quantizer                    */
+    int16 * isfold,    /* input : past quantized ISF                    */
+    int16 * isf_buf,   /* input : isf buffer                            */
+    int16 bfi,         /* input : Bad frame indicator                   */
+    int16 enc_dec
+)
+{
+    int16 ref_isf[M];
+    int16 i, j, tmp;
+    int32 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] = add_int16(dico2_isf[indice[1] * 7 + i], dico23_isf_36b[indice[4] * 7 + i]);
+        }
+
+        for (i = 0; i < 5; i++)
+        {
+            isf_q[i] = add_int16(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
+        }
+        for (i = 0; i < 4; i++)
+        {
+            isf_q[i + 5] = add_int16(isf_q[i + 5], dico22_isf_36b[(indice[3] << 2) + i]);
+        }
+
+        for (i = 0; i < ORDER; i++)
+        {
+            tmp = isf_q[i];
+            isf_q[i] = add_int16(tmp, mean_isf[i]);
+            isf_q[i] = add_int16(isf_q[i], mult_int16(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 = mul_16by16_to_int32(mean_isf[i], 8192);
+            for (j = 0; j < L_MEANBUF; j++)
+            {
+                L_tmp = mac_16by16_to_int32(L_tmp, isf_buf[j * M + i], 8192);
+            }
+
+            ref_isf[i] = amr_wb_round(L_tmp);
+        }
+
+        /* use the past ISFs slightly shifted towards their mean */
+        for (i = 0; i < ORDER; i++)
+        {
+            isf_q[i] = add_int16(mult_int16(ALPHA, isfold[i]), mult_int16(ONE_ALPHA, ref_isf[i]));
+        }
+
+        /* estimate past quantized residual to be used in next frame */
+
+        for (i = 0; i < ORDER; i++)
+        {
+            tmp = add_int16(ref_isf[i], mult_int16(past_isfq[i], MU));      /* predicted ISF */
+            past_isfq[i] = sub_int16(isf_q[i], tmp);
+            past_isfq[i] >>=  1;           /* past_isfq[i] *= 0.5 */
+        }
+    }
+
+    Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+    return;
+}
+
+/*
+ * procedure  Reorder_isf()
+ *            ~~~~~~~~~~~~~
+ * 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(
+    int16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+    int16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
+    int16 n                              /* (i)      : number of ISF                        */
+)
+{
+    int16 i, isf_min;
+
+    isf_min = min_dist;
+
+    for (i = 0; i < n - 1; i++)
+    {
+        if (isf[i] < isf_min)
+        {
+            isf[i] = isf_min;
+        }
+        isf_min = add_int16(isf[i], min_dist);
+    }
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/qpisf_2s.h b/media/libstagefright/codecs/amrwb/src/qpisf_2s.h
new file mode 100644
index 0000000..61f8c06
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qpisf_2s.h
@@ -0,0 +1,117 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/qpisf_2s.h
+
+     Date: 01/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef QPISF_2S_H
+#define QPISF_2S_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "qisf_ns.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+----------------------------------------------------------------------------*/
+
+#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
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+extern const int16 mean_isf[ORDER];
+extern const int16 dico1_isf[SIZE_BK1*9];
+extern const int16 dico2_isf[SIZE_BK2*7];
+extern const int16 dico21_isf[SIZE_BK21*3];
+extern const int16 dico22_isf[SIZE_BK22*3];
+extern const int16 dico23_isf[SIZE_BK23*3];
+extern const int16 dico24_isf[SIZE_BK24*3];
+extern const int16 dico25_isf[SIZE_BK25*4];
+extern const int16 dico21_isf_36b[SIZE_BK21_36b*5];
+extern const int16 dico22_isf_36b[SIZE_BK22_36b*4];
+extern const int16 dico23_isf_36b[SIZE_BK23_36b*7];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+#endif  /* QPISF_2S_H */
diff --git a/media/libstagefright/codecs/amrwb/src/qpisf_2s_tab.cpp b/media/libstagefright/codecs/amrwb/src/qpisf_2s_tab.cpp
new file mode 100644
index 0000000..d57522e
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/qpisf_2s_tab.cpp
@@ -0,0 +1,1383 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*-------------------------------------------------------------------*
+ *                         qpisf_2s_tab.cpp
+ *-------------------------------------------------------------------*
+ * Quantization tables for two-stage of ISFs (split by 2 in 1st stage)
+ * Version whith prediction MU = 0.25
+ *-------------------------------------------------------------------*/
+
+#include "qisf_ns.h"
+#include "qpisf_2s.h"
+
+
+
+
+/* means of ISFs */
+const int16 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
+ */
+
+const int16 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
+ *------------------------------------------------*/
+
+const int16 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
+ */
+
+
+const int16 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
+ */
+
+
+const int16 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
+ */
+
+
+const int16 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
+ */
+
+const int16 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
+ */
+
+const int16 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
+ */
+
+const int16 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
+};
+
+const int16 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
+};
+
+const int16 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/amrwb/src/scale_signal.cpp b/media/libstagefright/codecs/amrwb/src/scale_signal.cpp
new file mode 100644
index 0000000..b2b02b1
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/scale_signal.cpp
@@ -0,0 +1,154 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: scale_signal.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 signal[],             (i/o) : signal to scale
+     int16 lg,                   (i)   : size of x[]
+     int16 exp                   (i)   : exponent: x = round(x << exp)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Scale signal to get maximum of dynamic range
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void scale_signal(
+    int16 x[],              /* (i/o) : signal to scale               */
+    int16 lg,               /* (i)   : size of x[]                   */
+    int16 exp               /* (i)   : exponent: x = round(x << exp) */
+)
+{
+    int16 i;
+    int16 tmp;
+    int16 *pt_x;
+
+
+    int32 L_tmp;
+
+
+    if (exp > 0)
+    {
+        for (i = 0; i < lg; i++)
+        {
+            L_tmp = shl_int32(((int32)x[i] << 16), exp);       /* saturation can occur here */
+            x[i] = amr_wb_round(L_tmp);
+        }
+    }
+    else if (exp < 0)
+    {
+        exp = -exp;
+        exp &= 0xf;
+        tmp = (int16)(0x00008000 >> (16 - exp));
+        pt_x = x;
+
+        for (i = lg >> 1; i != 0; i--)
+        {
+            *(pt_x)   = add_int16(*(pt_x), tmp) >> exp;
+            pt_x++;
+            *(pt_x)   = add_int16(*(pt_x), tmp) >> exp;
+            pt_x++;
+        }
+
+    }
+    return;
+}
diff --git a/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.cpp b/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.cpp
new file mode 100644
index 0000000..c3aa887
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.cpp
@@ -0,0 +1,440 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: synthesis_amr_wb.cpp
+
+     Date: 05/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 Aq[],                           A(z)  : quantized Az
+     int16 exc[],                          (i)   : excitation at 12kHz
+     int16 Q_new,                          (i)   : scaling performed on exc
+     int16 synth16k[],                     (o)   : 16kHz synthesis signal
+     int16 prms,                           (i)   : compressed amr wb
+     int16 HfIsf[],
+     int16 nb_bits,
+     int16 newDTXState,
+     Decoder_State * st,                   (i/o) : State structure
+     int16 bfi,                            (i)   : bad frame indicator
+     int16 *ScratchMem
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Synthesis of signal at 16kHz with HF extension
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+#include "e_pv_amrwbdec.h"
+#include "get_amr_wb_bits.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_api.h"
+#include "synthesis_amr_wb.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/* High Band encoding */
+const int16 HP_gain[16] =
+{
+    3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
+    11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
+};
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void synthesis_amr_wb(
+    int16 Aq[],              /* A(z)  : quantized Az               */
+    int16 exc[],             /* (i)   : excitation at 12kHz        */
+    int16 Q_new,             /* (i)   : scaling performed on exc   */
+    int16 synth16k[],        /* (o)   : 16kHz synthesis signal     */
+    int16 prms,              /* (i)   : parameter                  */
+    int16 HfIsf[],
+    int16 nb_bits,
+    int16 newDTXState,
+    Decoder_State * st,      /* (i/o) : State structure            */
+    int16 bfi,               /* (i)   : bad frame indicator        */
+    int16 *ScratchMem
+)
+{
+    int16 i, fac, exp;
+    int16 tmp;
+    int16 ener, exp_ener;
+    int32 L_tmp;
+    int32 L_tmp2;
+
+    int16 HF_corr_gain;
+    int16 HF_gain_ind;
+    int16 gain1, gain2;
+
+    int16 *pt_synth;
+    int16 *pt_HF;
+    int16 *synth_hi =  ScratchMem;
+    int16 *synth_lo = &ScratchMem[M + L_SUBFR];
+    int16 *synth    = &synth_lo[M + L_SUBFR];
+    int16 *HF       = &synth[L_SUBFR];
+    int16 *Ap       = &HF[L_SUBFR16k];       /* High Frequency vector   */
+    int16 *HfA      = &Ap[M16k + 1];
+    int16 *pt_tmp;
+
+    /*------------------------------------------------------------*
+     * speech synthesis                                           *
+     * ~~~~~~~~~~~~~~~~                                           *
+     * - Find synthesis speech corresponding to exc2[].           *
+     * - Perform fixed deemphasis and hp 50hz filtering.          *
+     * - Oversampling from 12.8kHz to 16kHz.                      *
+     *------------------------------------------------------------*/
+
+    pv_memcpy((void *)synth_hi,
+              (void *)st->mem_syn_hi,
+              M*sizeof(*synth_hi));
+
+    pv_memcpy((void *)synth_lo,
+              (void *)st->mem_syn_lo,
+              M*sizeof(*synth_lo));
+
+    Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+
+    pv_memcpy((void *)st->mem_syn_hi,
+              (void *)(synth_hi + L_SUBFR),
+              M*sizeof(*st->mem_syn_hi));
+
+    pv_memcpy((void *)st->mem_syn_lo,
+              (void *)(synth_lo + L_SUBFR),
+              M*sizeof(*st->mem_syn_lo));
+
+    deemphasis_32(synth_hi + M,
+                  synth_lo + M,
+                  synth,
+                  PREEMPH_FAC,
+                  L_SUBFR,
+                  &(st->mem_deemph));
+
+    highpass_50Hz_at_12k8(synth,
+                          L_SUBFR,
+                          st->mem_sig_out);
+
+    oversamp_12k8_to_16k(synth,
+                         L_SUBFR,
+                         synth16k,
+                         st->mem_oversamp,
+                         ScratchMem);
+
+    /*
+     * 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 */
+    pt_tmp = HF;
+    for (i = L_SUBFR16k >> 2; i != 0 ; i--)
+    {
+        *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
+        *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
+        *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
+        *(pt_tmp++) = noise_gen_amrwb(&(st->seed2)) >> 3;
+    }
+    /* energy of excitation */
+
+    pt_tmp = exc;
+
+    for (i = L_SUBFR >> 2; i != 0; i--)
+    {
+        *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
+        pt_tmp++;
+        *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
+        pt_tmp++;
+        *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
+        pt_tmp++;
+        *(pt_tmp) = add_int16(*(pt_tmp), 0x0004) >> 3;
+        pt_tmp++;
+    }
+
+
+    Q_new -= 3;
+
+    ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
+    exp_ener -= Q_new << 1;
+
+    /* set energy of white noise to energy of excitation */
+
+    tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+
+    if (tmp > ener)
+    {
+        tmp >>=  1;                 /* Be sure tmp < ener */
+        exp += 1;
+    }
+    L_tmp = L_deposit_h(div_16by16(tmp, ener)); /* result is normalized */
+    exp -= exp_ener;
+    one_ov_sqrt_norm(&L_tmp, &exp);
+    L_tmp = shl_int32(L_tmp, exp + 1); /* L_tmp x 2, L_tmp in Q31 */
+
+    tmp = (int16)(L_tmp >> 16);    /* tmp = 2 x sqrt(ener_exc/ener_hf) */
+
+
+
+    pt_tmp = HF;
+    for (i = L_SUBFR16k >> 2; i != 0 ; i--)
+    {
+        *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
+        pt_tmp++;
+        *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
+        pt_tmp++;
+        *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
+        pt_tmp++;
+        *(pt_tmp) = (int16)(fxp_mul_16by16(*(pt_tmp), tmp) >> 15);
+        pt_tmp++;
+    }
+
+    /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
+
+    highpass_400Hz_at_12k8(synth, L_SUBFR, st->mem_hp400);
+
+    L_tmp = 1L;
+    L_tmp2 = 1L;
+
+
+    L_tmp = mac_16by16_to_int32(L_tmp, synth[0], synth[0]);
+
+    for (i = 1; i < L_SUBFR; i++)
+    {
+        L_tmp  = mac_16by16_to_int32(L_tmp,  synth[i], synth[i    ]);
+        L_tmp2 = mac_16by16_to_int32(L_tmp2, synth[i], synth[i - 1]);
+    }
+
+
+    exp = normalize_amr_wb(L_tmp);
+
+    ener = (int16)((L_tmp << exp) >> 16);   /* ener = r[0] */
+    tmp  = (int16)((L_tmp2 << exp) >> 16);    /* tmp = r[1] */
+
+    if (tmp > 0)
+    {
+        fac = div_16by16(tmp, ener);
+    }
+    else
+    {
+        fac = 0;
+    }
+
+    /* modify energy of white noise according to synthesis tilt */
+    gain1 = 32767 - fac;
+    gain2 = mult_int16(gain1, 20480);
+    gain2 = shl_int16(gain2, 1);
+
+    if (st->vad_hist > 0)
+    {
+        tmp  = gain2 - 1;
+    }
+    else
+    {
+        tmp  = gain1 - 1;
+    }
+
+
+    if (tmp != 0)
+    {
+        tmp++;
+    }
+
+    if (tmp < 3277)
+    {
+        tmp = 3277;                        /* 0.1 in Q15 */
+
+    }
+
+
+    if ((nb_bits >= NBBITS_24k) && (bfi == 0))
+    {
+        /* HF correction gain */
+        HF_gain_ind = prms;
+        HF_corr_gain = HP_gain[HF_gain_ind];
+
+        pt_tmp = HF;
+        for (i = L_SUBFR16k >> 2; i != 0 ; i--)
+        {
+            *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), HF_corr_gain) << 1;
+            pt_tmp++;
+        }
+
+        /* HF gain */
+    }
+    else
+    {
+        pt_tmp = HF;
+        for (i = L_SUBFR16k >> 2; i != 0 ; i--)
+        {
+            *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
+            pt_tmp++;
+            *(pt_tmp) = mult_int16(*(pt_tmp), tmp);
+            pt_tmp++;
+        }
+    }
+
+
+    if ((nb_bits <= NBBITS_7k) && (newDTXState == SPEECH))
+    {
+        isf_extrapolation(HfIsf);
+        Isp_Az(HfIsf, HfA, M16k, 0);
+
+        weight_amrwb_lpc(HfA, Ap, 29491, M16k);     /* fac=0.9 */
+
+        wb_syn_filt(Ap,
+                    M16k,
+                    HF,
+                    HF,
+                    L_SUBFR16k,
+                    st->mem_syn_hf,
+                    1,
+                    ScratchMem);
+    }
+    else
+    {
+        /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
+        weight_amrwb_lpc(Aq, Ap, 19661, M);         /* fac=0.6 */
+
+        wb_syn_filt(Ap,
+                    M,
+                    HF,
+                    HF,
+                    L_SUBFR16k,
+                    st->mem_syn_hf + (M16k - M),
+                    1,
+                    ScratchMem);
+    }
+
+    /* noise Band Pass filtering (1ms of delay) */
+    band_pass_6k_7k(HF,
+                    L_SUBFR16k,
+                    st->mem_hf,
+                    ScratchMem);
+
+
+    if (nb_bits >= NBBITS_24k)
+    {
+        /* Low Pass filtering (7 kHz) */
+        low_pass_filt_7k(HF,
+                         L_SUBFR16k,
+                         st->mem_hf3,
+                         ScratchMem);
+    }
+    /* add filtered HF noise to speech synthesis */
+
+    pt_synth = synth16k;
+    pt_HF = HF;
+
+    for (i = L_SUBFR16k >> 1; i != 0; i--)
+    {
+        *(pt_synth) = add_int16(*(pt_synth), *(pt_HF++)); /* check 16 bit saturation */
+        pt_synth++;
+        *(pt_synth) = add_int16(*(pt_synth), *(pt_HF++));
+        pt_synth++;
+    }
+
+}
+
diff --git a/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.h b/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.h
new file mode 100644
index 0000000..4bfc3c5
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/synthesis_amr_wb.h
@@ -0,0 +1,96 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Pathname: ./cpp/include/synthesis_amr_wb.h
+
+     Date: 05/04/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef SYNTHESIS_AMR_WB_H
+#define SYNTHESIS_AMR_WB_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void synthesis_amr_wb(
+        int16 Aq[],                          /* A(z)  : quantized Az               */
+        int16 exc[],                         /* (i)   : excitation at 12kHz        */
+        int16 Q_new,                         /* (i)   : scaling performed on exc   */
+        int16 synth16k[],                    /* (o)   : 16kHz synthesis signal     */
+        int16 prms,                          /* (i)   : parameter                  */
+        int16 HfIsf[],
+        int16 nb_bits,
+        int16 newDTXState,
+        Decoder_State * st,                   /* (i/o) : State structure            */
+        int16 bfi,                           /* (i)   : bad frame indicator        */
+        int16 * ScratchMemory
+    );
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif  /* PV_NORMALIZE_H */
diff --git a/media/libstagefright/codecs/amrwb/src/voice_factor.cpp b/media/libstagefright/codecs/amrwb/src/voice_factor.cpp
new file mode 100644
index 0000000..6153c67
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/voice_factor.cpp
@@ -0,0 +1,175 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: voice_factor.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 exc[],        (i) Q_exc : pitch excitation
+     int16 Q_exc,        (i)       : exc format
+     int16 gain_pit,     (i) Q14   : gain of pitch
+     int16 code[],       (i) Q9    : Fixed codebook excitation
+     int16 gain_code,    (i) Q0    : gain of code
+     int16 L_subfr       (i)       : subframe length
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Find the voicing factor (1=voice to -1=unvoiced).
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+int16 voice_factor(    /* (o) Q15   : factor (-1=unvoiced to 1=voiced) */
+    int16 exc[],      /* (i) Q_exc : pitch excitation                 */
+    int16 Q_exc,      /* (i)       : exc format                       */
+    int16 gain_pit,   /* (i) Q14   : gain of pitch                    */
+    int16 code[],     /* (i) Q9    : Fixed codebook excitation        */
+    int16 gain_code,  /* (i) Q0    : gain of code                     */
+    int16 L_subfr     /* (i)       : subframe length                  */
+)
+{
+    int16 i, tmp, exp, ener1, exp1, ener2, exp2;
+    int32 L_tmp;
+
+    ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));
+    exp1 = sub_int16(exp1, Q_exc << 1);
+    L_tmp = mul_16by16_to_int32(gain_pit, gain_pit);
+    exp = normalize_amr_wb(L_tmp);
+
+    tmp = (int16)((L_tmp << exp) >> 16);
+    ener1 = mult_int16(ener1, tmp);
+    exp1 -= (exp + 10);        /* 10 -> gain_pit Q14 to Q9 */
+
+    ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));
+
+    exp = norm_s(gain_code);
+    tmp = shl_int16(gain_code, exp);
+    tmp = mult_int16(tmp, tmp);
+    ener2 = mult_int16(ener2, tmp);
+    exp2 -= (exp << 1);
+
+    i = exp1 - exp2;
+
+
+    if (i >= 0)
+    {
+        ener1 >>=  1;
+        ener2 >>= (i + 1);
+    }
+    else
+    {
+        ener1 >>= (1 - i);
+        ener2 >>= 1;
+    }
+
+    tmp = ener1 - ener2;
+    ener1 += ener2 + 1;
+
+
+    if (tmp >= 0)
+    {
+        tmp = div_16by16(tmp, ener1);
+    }
+    else
+    {
+        tmp = negate_int16(div_16by16(negate_int16(tmp), ener1));
+    }
+
+    return (tmp);
+}
diff --git a/media/libstagefright/codecs/amrwb/src/wb_syn_filt.cpp b/media/libstagefright/codecs/amrwb/src/wb_syn_filt.cpp
new file mode 100644
index 0000000..e1af6d4
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/wb_syn_filt.cpp
@@ -0,0 +1,307 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: wb_syn_filt.cpp
+
+     Date: 05/08/2004
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+wb_syn_filt
+
+     int16 a[],               (i) Q12 : a[m+1] prediction coefficients
+     int16 m,                 (i)     : order of LP filter
+     int16 x[],               (i)     : input signal
+     int16 y[],               (o)     : output signal
+     int16 lg,                (i)     : size of filtering
+     int16 mem[],             (i/o)   : memory associated with this filtering.
+     int16 update,            (i)     : 0=no update, 1=update of memory.
+     int16 y_buf[]
+
+Syn_filt_32
+
+     int16 a[],              (i) Q12 : a[m+1] prediction coefficients
+     int16 m,                (i)     : order of LP filter
+     int16 exc[],            (i) Qnew: excitation (exc[i] >> Qnew)
+     int16 Qnew,             (i)     : exc scaling = 0(min) to 8(max)
+     int16 sig_hi[],         (o) /16 : synthesis high
+     int16 sig_lo[],         (o) /16 : synthesis low
+     int16 lg                (i)     : size of filtering
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Do the synthesis filtering 1/A(z)  16 and 32-bits version
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_mem_funcs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwb_math_op.h"
+#include "pvamrwbdecoder_cnst.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void wb_syn_filt(
+    int16 a[],       /* (i) Q12 : a[m+1] prediction coefficients           */
+    int16 m,         /* (i)     : order of LP filter                       */
+    int16 x[],       /* (i)     : input signal                             */
+    int16 y[],       /* (o)     : output signal                            */
+    int16 lg,        /* (i)     : size of filtering                        */
+    int16 mem[],     /* (i/o)   : memory associated with this filtering.   */
+    int16 update,    /* (i)     : 0=no update, 1=update of memory.         */
+    int16 y_buf[]
+)
+{
+
+    int16 i, j;
+    int32 L_tmp1;
+    int32 L_tmp2;
+    int32 L_tmp3;
+    int32 L_tmp4;
+    int16 *yy;
+
+    /* copy initial filter states into synthesis buffer */
+    pv_memcpy(y_buf, mem, m*sizeof(*yy));
+
+    yy = &y_buf[m];
+
+    /* Do the filtering. */
+
+    for (i = 0; i < lg >> 2; i++)
+    {
+        L_tmp1 = -((int32)x[(i<<2)] << 11);
+        L_tmp2 = -((int32)x[(i<<2)+1] << 11);
+        L_tmp3 = -((int32)x[(i<<2)+2] << 11);
+        L_tmp4 = -((int32)x[(i<<2)+3] << 11);
+
+        /* a[] uses Q12 and abs(a) =< 1 */
+
+        L_tmp1  = fxp_mac_16by16(yy[(i<<2) -3], a[3], L_tmp1);
+        L_tmp2  = fxp_mac_16by16(yy[(i<<2) -2], a[3], L_tmp2);
+        L_tmp1  = fxp_mac_16by16(yy[(i<<2) -2], a[2], L_tmp1);
+        L_tmp2  = fxp_mac_16by16(yy[(i<<2) -1], a[2], L_tmp2);
+        L_tmp1  = fxp_mac_16by16(yy[(i<<2) -1], a[1], L_tmp1);
+
+        for (j = 4; j < m; j += 2)
+        {
+            L_tmp1  = fxp_mac_16by16(yy[(i<<2)-1  - j], a[j+1], L_tmp1);
+            L_tmp2  = fxp_mac_16by16(yy[(i<<2)    - j], a[j+1], L_tmp2);
+            L_tmp1  = fxp_mac_16by16(yy[(i<<2)    - j], a[j  ], L_tmp1);
+            L_tmp2  = fxp_mac_16by16(yy[(i<<2)+1  - j], a[j  ], L_tmp2);
+            L_tmp3  = fxp_mac_16by16(yy[(i<<2)+1  - j], a[j+1], L_tmp3);
+            L_tmp4  = fxp_mac_16by16(yy[(i<<2)+2  - j], a[j+1], L_tmp4);
+            L_tmp3  = fxp_mac_16by16(yy[(i<<2)+2  - j], a[j  ], L_tmp3);
+            L_tmp4  = fxp_mac_16by16(yy[(i<<2)+3  - j], a[j  ], L_tmp4);
+        }
+
+        L_tmp1  = fxp_mac_16by16(yy[(i<<2)    - j], a[j], L_tmp1);
+        L_tmp2  = fxp_mac_16by16(yy[(i<<2)+1  - j], a[j], L_tmp2);
+        L_tmp3  = fxp_mac_16by16(yy[(i<<2)+2  - j], a[j], L_tmp3);
+        L_tmp4  = fxp_mac_16by16(yy[(i<<2)+3  - j], a[j], L_tmp4);
+
+        L_tmp1 = shl_int32(L_tmp1, 4);
+
+        y[(i<<2)] = yy[(i<<2)] = amr_wb_round(-L_tmp1);
+
+        L_tmp2  = fxp_mac_16by16(yy[(i<<2)], a[1], L_tmp2);
+
+        L_tmp2 = shl_int32(L_tmp2, 4);
+
+        y[(i<<2)+1] = yy[(i<<2)+1] = amr_wb_round(-L_tmp2);
+
+        L_tmp3  = fxp_mac_16by16(yy[(i<<2) - 1], a[3], L_tmp3);
+        L_tmp4  = fxp_mac_16by16(yy[(i<<2)], a[3], L_tmp4);
+        L_tmp3  = fxp_mac_16by16(yy[(i<<2)], a[2], L_tmp3);
+        L_tmp4  = fxp_mac_16by16(yy[(i<<2) + 1], a[2], L_tmp4);
+        L_tmp3  = fxp_mac_16by16(yy[(i<<2) + 1], a[1], L_tmp3);
+
+        L_tmp3 = shl_int32(L_tmp3, 4);
+
+        y[(i<<2)+2] = yy[(i<<2)+2] = amr_wb_round(-L_tmp3);
+
+        L_tmp4  = fxp_mac_16by16(yy[(i<<2)+2], a[1], L_tmp4);
+
+        L_tmp4 = shl_int32(L_tmp4, 4);
+
+        y[(i<<2)+3] = yy[(i<<2)+3] = amr_wb_round(-L_tmp4);
+    }
+
+
+    /* Update memory if required */
+
+    if (update)
+    {
+        pv_memcpy(mem, &y[lg - m], m*sizeof(*y));
+    }
+
+    return;
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void Syn_filt_32(
+    int16 a[],              /* (i) Q12 : a[m+1] prediction coefficients */
+    int16 m,                /* (i)     : order of LP filter             */
+    int16 exc[],            /* (i) Qnew: excitation (exc[i] >> Qnew)    */
+    int16 Qnew,             /* (i)     : exc scaling = 0(min) to 8(max) */
+    int16 sig_hi[],         /* (o) /16 : synthesis high                 */
+    int16 sig_lo[],         /* (o) /16 : synthesis low                  */
+    int16 lg                /* (i)     : size of filtering              */
+)
+{
+    int16 i, k, a0;
+    int32 L_tmp1;
+    int32 L_tmp2;
+    int32 L_tmp3;
+    int32 L_tmp4;
+
+    a0 = 9 - Qnew;        /* input / 16 and >>Qnew */
+
+    /* Do the filtering. */
+
+    for (i = 0; i < lg >> 1; i++)
+    {
+
+        L_tmp3 = 0;
+        L_tmp4 = 0;
+
+        L_tmp1 = fxp_mul_16by16(sig_lo[(i<<1) - 1], a[1]);
+        L_tmp2 = fxp_mul_16by16(sig_hi[(i<<1) - 1], a[1]);
+
+        for (k = 2; k < m; k += 2)
+        {
+
+            L_tmp1 = fxp_mac_16by16(sig_lo[(i<<1)-1 - k], a[k+1], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(sig_hi[(i<<1)-1 - k], a[k+1], L_tmp2);
+            L_tmp1 = fxp_mac_16by16(sig_lo[(i<<1)   - k], a[k  ], L_tmp1);
+            L_tmp2 = fxp_mac_16by16(sig_hi[(i<<1)   - k], a[k  ], L_tmp2);
+            L_tmp3 = fxp_mac_16by16(sig_lo[(i<<1)   - k], a[k+1], L_tmp3);
+            L_tmp4 = fxp_mac_16by16(sig_hi[(i<<1)   - k], a[k+1], L_tmp4);
+            L_tmp3 = fxp_mac_16by16(sig_lo[(i<<1)+1 - k], a[k  ], L_tmp3);
+            L_tmp4 = fxp_mac_16by16(sig_hi[(i<<1)+1 - k], a[k  ], L_tmp4);
+        }
+
+        L_tmp1 = -fxp_mac_16by16(sig_lo[(i<<1)   - k], a[k], L_tmp1);
+        L_tmp3 =  fxp_mac_16by16(sig_lo[(i<<1)+1 - k], a[k], L_tmp3);
+        L_tmp2 =  fxp_mac_16by16(sig_hi[(i<<1)   - k], a[k], L_tmp2);
+        L_tmp4 =  fxp_mac_16by16(sig_hi[(i<<1)+1 - k], a[k], L_tmp4);
+
+
+
+        L_tmp1 >>= 11;      /* -4 : sig_lo[i] << 4 */
+
+        L_tmp1 += (int32)exc[(i<<1)] << a0;
+
+        L_tmp1 -= (L_tmp2 << 1);
+        /* sig_hi = bit16 to bit31 of synthesis */
+        L_tmp1 = shl_int32(L_tmp1, 3);           /* ai in Q12 */
+
+        sig_hi[(i<<1)] = (int16)(L_tmp1 >> 16);
+
+        L_tmp4 = fxp_mac_16by16((int16)(L_tmp1 >> 16), a[1], L_tmp4);
+
+        /* sig_lo = bit4 to bit15 of synthesis */
+        /* L_tmp1 >>= 4 : sig_lo[i] >> 4 */
+        sig_lo[(i<<1)] = (int16)((L_tmp1 >> 4) - ((L_tmp1 >> 16) << 12));
+
+        L_tmp3 = fxp_mac_16by16(sig_lo[(i<<1)], a[1], L_tmp3);
+        L_tmp3 = -L_tmp3 >> 11;
+
+        L_tmp3 += (int32)exc[(i<<1)+1] << a0;
+
+        L_tmp3 -= (L_tmp4 << 1);
+        /* sig_hi = bit16 to bit31 of synthesis */
+        L_tmp3 = shl_int32(L_tmp3, 3);           /* ai in Q12 */
+        sig_hi[(i<<1)+1] = (int16)(L_tmp3 >> 16);
+
+        /* sig_lo = bit4 to bit15 of synthesis */
+        /* L_tmp1 >>= 4 : sig_lo[i] >> 4 */
+        sig_lo[(i<<1)+1] = (int16)((L_tmp3 >> 4) - (sig_hi[(i<<1)+1] << 12));
+    }
+
+}
+
+
diff --git a/media/libstagefright/codecs/amrwb/src/weight_amrwb_lpc.cpp b/media/libstagefright/codecs/amrwb/src/weight_amrwb_lpc.cpp
new file mode 100644
index 0000000..63d2e00
--- /dev/null
+++ b/media/libstagefright/codecs/amrwb/src/weight_amrwb_lpc.cpp
@@ -0,0 +1,135 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************************
+Portions of this file are derived from the following 3GPP standard:
+
+    3GPP TS 26.173
+    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
+    Available from http://www.3gpp.org
+
+(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
+Permission to distribute, modify and use this file under the standard license
+terms listed above has been obtained from the copyright holder.
+****************************************************************************************/
+/*
+------------------------------------------------------------------------------
+
+
+
+ Filename: weight_amrwb_lpc.cpp
+
+     Date: 05/08/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+     int16 a[],            (i) Q12 : a[m+1]  LPC coefficients
+     int16 ap[],           (o) Q12 : Spectral expanded LPC coefficients
+     int16 gamma,          (i) Q15 : Spectral expansion factor.
+     int16 m               (i)     : LPC order.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   Weighting of LPC coefficients.
+     ap[i]  =  a[i]   (gamma    i)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_amr_wb_type_defs.h"
+#include "pvamrwbdecoder_basic_op.h"
+#include "pvamrwbdecoder_acelp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void weight_amrwb_lpc(
+    int16 a[],          /* (i) Q12 : a[m+1]  LPC coefficients             */
+    int16 ap[],         /* (o) Q12 : Spectral expanded LPC coefficients   */
+    int16 gamma,        /* (i) Q15 : Spectral expansion factor.           */
+    int16 m             /* (i)     : LPC order.                           */
+)
+{
+    int16 i, fac;
+    int32 roundFactor = 0x00004000L;
+    ap[0] = a[0];
+    fac = gamma;
+    for (i = 1; i < m; i++)
+    {
+        ap[i] = (int16)(fxp_mac_16by16(a[i], fac, roundFactor) >> 15);
+        fac   = (int16)(fxp_mac_16by16(fac, gamma, roundFactor) >> 15);
+    }
+    ap[i] = (int16)(fxp_mac_16by16(a[i], fac, roundFactor) >> 15);
+
+    return;
+}
diff --git a/media/libstagefright/include/AMRNBDecoder.h b/media/libstagefright/include/AMRNBDecoder.h
new file mode 100644
index 0000000..cf24eda
--- /dev/null
+++ b/media/libstagefright/include/AMRNBDecoder.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 AMR_NB_DECODER_H_
+
+#define AMR_NB_DECODER_H_
+
+#include <media/stagefright/MediaSource.h>
+
+namespace android {
+
+struct MediaBufferGroup;
+
+struct AMRNBDecoder : public MediaSource {
+    AMRNBDecoder(const sp<MediaSource> &source);
+
+    virtual status_t start(MetaData *params);
+    virtual status_t stop();
+
+    virtual sp<MetaData> getFormat();
+
+    virtual status_t read(
+            MediaBuffer **buffer, const ReadOptions *options);
+
+protected:
+    virtual ~AMRNBDecoder();
+
+private:
+    sp<MediaSource> mSource;
+    bool mStarted;
+
+    MediaBufferGroup *mBufferGroup;
+
+    void *mState;
+    int64_t mAnchorTimeUs;
+    int64_t mNumSamplesOutput;
+
+    MediaBuffer *mInputBuffer;
+
+    AMRNBDecoder(const AMRNBDecoder &);
+    AMRNBDecoder &operator=(const AMRNBDecoder &);
+};
+
+}  // namespace android
+
+#endif  // AMR_NB_DECODER_H_
diff --git a/media/libstagefright/include/AMRWBDecoder.h b/media/libstagefright/include/AMRWBDecoder.h
new file mode 100644
index 0000000..927c51c
--- /dev/null
+++ b/media/libstagefright/include/AMRWBDecoder.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 AMR_WB_DECODER_H_
+
+#define AMR_WB_DECODER_H_
+
+#include <media/stagefright/MediaSource.h>
+
+namespace android {
+
+struct MediaBufferGroup;
+
+struct AMRWBDecoder : public MediaSource {
+    AMRWBDecoder(const sp<MediaSource> &source);
+
+    virtual status_t start(MetaData *params);
+    virtual status_t stop();
+
+    virtual sp<MetaData> getFormat();
+
+    virtual status_t read(
+            MediaBuffer **buffer, const ReadOptions *options);
+
+protected:
+    virtual ~AMRWBDecoder();
+
+private:
+    sp<MediaSource> mSource;
+    bool mStarted;
+
+    MediaBufferGroup *mBufferGroup;
+
+    void *mState;
+    void *mDecoderBuf;
+    int16_t *mDecoderCookie;
+    int64_t mAnchorTimeUs;
+    int64_t mNumSamplesOutput;
+    int16_t mInputSampleBuffer[477];
+
+    MediaBuffer *mInputBuffer;
+
+    AMRWBDecoder(const AMRWBDecoder &);
+    AMRWBDecoder &operator=(const AMRWBDecoder &);
+};
+
+}  // namespace android
+
+#endif  // AMR_WB_DECODER_H_
