Merge change I3c01bb62 into eclair-mr2
* changes:
Adding copyright headers to recently introduced decoder source files.
diff --git a/Android.mk b/Android.mk
index 0cfae0f..f03b640 100644
--- a/Android.mk
+++ b/Android.mk
@@ -165,6 +165,8 @@
telephony/java/com/android/internal/telephony/IExtendedNetworkService.aidl \
vpn/java/android/net/vpn/IVpnService.aidl \
+LOCAL_SRC_FILES += core/java/android/content/EventLogTags.logtags
+
# FRAMEWORKS_BASE_JAVA_SRC_DIRS comes from build/core/pathmap.mk
LOCAL_AIDL_INCLUDES += $(FRAMEWORKS_BASE_JAVA_SRC_DIRS)
diff --git a/core/java/android/content/AbstractThreadedSyncAdapter.java b/core/java/android/content/AbstractThreadedSyncAdapter.java
index 091d44e..154c4a6 100644
--- a/core/java/android/content/AbstractThreadedSyncAdapter.java
+++ b/core/java/android/content/AbstractThreadedSyncAdapter.java
@@ -37,6 +37,12 @@
* that the sync has been canceled.
*/
public abstract class AbstractThreadedSyncAdapter {
+ /**
+ * Kernel event log tag. Also listed in data/etc/event-log-tags.
+ * @Deprecated
+ */
+ public static final int LOG_SYNC_DETAILS = 2743;
+
private final Context mContext;
private final AtomicInteger mNumSyncStarts;
private final ISyncAdapterImpl mISyncAdapterImpl;
@@ -45,9 +51,6 @@
private SyncThread mSyncThread;
private final Object mSyncThreadLock = new Object();
- /** Kernel event log tag. Also listed in data/etc/event-log-tags. */
- public static final int LOG_SYNC_DETAILS = 2743;
- private static final String TAG = "Sync";
private final boolean mAutoInitialize;
/**
@@ -136,8 +139,6 @@
private final String mAuthority;
private final Account mAccount;
private final Bundle mExtras;
- private long mInitialTxBytes;
- private long mInitialRxBytes;
private SyncThread(String name, SyncContext syncContext, String authority,
Account account, Bundle extras) {
@@ -156,9 +157,6 @@
}
SyncResult syncResult = new SyncResult();
- int uid = Process.myUid();
- mInitialTxBytes = TrafficStats.getUidTxBytes(uid);
- mInitialRxBytes = TrafficStats.getUidRxBytes(uid);
ContentProviderClient provider = null;
try {
provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
@@ -175,8 +173,6 @@
if (!isCanceled()) {
mSyncContext.onFinished(syncResult);
}
- onLogSyncDetails(TrafficStats.getUidTxBytes(uid) - mInitialTxBytes,
- TrafficStats.getUidRxBytes(uid) - mInitialRxBytes, syncResult);
// synchronize so that the assignment will be seen by other threads
// that also synchronize accesses to mSyncThread
synchronized (mSyncThreadLock) {
@@ -211,18 +207,4 @@
*/
public abstract void onPerformSync(Account account, Bundle extras,
String authority, ContentProviderClient provider, SyncResult syncResult);
-
- /**
- * Logs details on the sync.
- * Normally this will be overridden by a subclass that will provide
- * provider-specific details.
- *
- * @param bytesSent number of bytes the sync sent over the network
- * @param bytesReceived number of bytes the sync received over the network
- * @param result The SyncResult object holding info on the sync
- * @hide
- */
- protected void onLogSyncDetails(long bytesSent, long bytesReceived, SyncResult result) {
- EventLog.writeEvent(SyncAdapter.LOG_SYNC_DETAILS, TAG, bytesSent, bytesReceived, "");
- }
}
diff --git a/core/java/android/content/EventLogTags.logtags b/core/java/android/content/EventLogTags.logtags
new file mode 100644
index 0000000..af50a3c
--- /dev/null
+++ b/core/java/android/content/EventLogTags.logtags
@@ -0,0 +1,10 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package android.content
+
+# ---------------------------
+# SyncAdapter.java
+# ---------------------------
+# What happens in a sync operation (bytes sent and received, and
+# operation details)
+2743 sync_details (authority|3),(send|1|2),(recv|1|2),(details|3)
diff --git a/core/java/android/content/SyncAdapter.java b/core/java/android/content/SyncAdapter.java
index af1634e..a5afe87 100644
--- a/core/java/android/content/SyncAdapter.java
+++ b/core/java/android/content/SyncAdapter.java
@@ -26,8 +26,8 @@
public abstract class SyncAdapter {
private static final String TAG = "SyncAdapter";
- /** Kernel event log tag. Also listed in data/etc/event-log-tags. */
- public static final int LOG_SYNC_DETAILS = 2743;
+ /** Kernel event log tag. */
+ public static final int LOG_SYNC_DETAILS = EventLogTags.SYNC_DETAILS;
class Transport extends ISyncAdapter.Stub {
public void startSync(ISyncContext syncContext, String authority, Account account,
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index ec0fe38..8c83303 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -3586,59 +3586,6 @@
public static final String USE_LOCATION_FOR_SERVICES = "use_location";
/**
- * The number of entries to fetch from the feed at a time for calendar sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_ENTRY_FETCH_QUEUE_SIZE =
- "google_calendar_sync_entry_fetch_queue_size";
-
- /**
- * The number of entities to fetch from the provider at a time for calendar sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_ENTITY_FETCH_QUEUE_SIZE =
- "google_calendar_sync_entity_fetch_queue_size";
-
- /**
- * The maximum number of simultaneous changes to allow before alerting the user for
- * calendar sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_NUM_ALLOWED_SIMULTANEOUS_CHANGES =
- "google_calendar_sync_num_allowed_simultaneous changes";
-
- /**
- * The maximum percentage of simultaneous changes to allow before alerting the user for
- * calendar sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_PERCENT_ALLOWED_SIMULTANEOUS_CHANGES =
- "google_calendar_sync_percent_allowed_simultaneous_changes";
-
- /**
- * The number of times to apply local changes in calendar sync before stopping.
- */
- public static final String GOOGLE_CALENDAR_SYNC_MAX_LOOP_ATTEMPTS =
- "google_calendar_sync_max_loop_attempts";
-
- /**
- * The batch size for applying server changes to the provider for calendar sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_NUM_APPLICATIONS_PER_BATCH =
- "google_calendar_sync_num_applications_per_batch";
-
- /**
- * The length of the calendar sync window into the future.
- * This specifies the number of days into the future for the sliding window sync.
- * Setting this to zero will disable sliding sync.
- */
- public static final String GOOGLE_CALENDAR_SYNC_WINDOW_DAYS =
- "google_calendar_sync_window_days";
-
- /**
- * How often to update the calendar sync window.
- * The window will be advanced every n days.
- */
- public static final String GOOGLE_CALENDAR_SYNC_WINDOW_UPDATE_DAYS =
- "google_calendar_sync_window_update_days";
-
- /**
* The number of promoted sources in GlobalSearch.
*/
public static final String SEARCH_NUM_PROMOTED_SOURCES = "search_num_promoted_sources";
diff --git a/core/java/android/test/InstrumentationTestCase.java b/core/java/android/test/InstrumentationTestCase.java
index 22d95d1..6d92ea3 100644
--- a/core/java/android/test/InstrumentationTestCase.java
+++ b/core/java/android/test/InstrumentationTestCase.java
@@ -147,6 +147,42 @@
}
}
+ @Override
+ public void runBare() throws Throwable {
+ runMethod("setUp");
+
+ try {
+ runTest();
+ } finally {
+ runMethod("tearDown");
+ }
+ }
+
+ private Throwable[] runMethod(String name) throws Throwable {
+ final Throwable[] exceptions = new Throwable[1];
+ final Method m = getClass().getMethod(name, (Class[]) null);
+
+ if (m.isAnnotationPresent(UiThreadTest.class)) {
+ getInstrumentation().runOnMainSync(new Runnable() {
+ public void run() {
+ try {
+ m.invoke(this);
+ } catch (Throwable throwable) {
+ exceptions[0] = throwable;
+ }
+ }
+ });
+ if (exceptions[0] != null) {
+ throw exceptions[0];
+ }
+ exceptions[0] = null;
+ } else {
+ m.invoke(this);
+ }
+
+ return exceptions;
+ }
+
/**
* Runs the current unit test. If the unit test is annotated with
* {@link android.test.UiThreadTest}, the test is run on the UI thread.
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..2e431205
--- /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(<pGainHist[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(<pGainHist[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..2c36706a
--- /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..162685ff48
--- /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..f90a5340
--- /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_