diff --git a/api/7.xml b/api/7.xml
index f6ccc93..83d2bc7 100644
--- a/api/7.xml
+++ b/api/7.xml
@@ -199633,6 +199633,292 @@
  visibility="public"
 >
 </field>
+<field name="OP_UNUSED_3e"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="62"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_3f"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="63"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_40"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="64"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_41"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="65"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_42"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="66"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_43"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="67"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_73"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="115"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_79"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="121"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_7A"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="122"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E3"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="227"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E4"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="228"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E5"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="229"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E6"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="230"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E7"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="231"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E8"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="232"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_E9"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="233"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_EA"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="234"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_EB"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="235"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_EC"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="236"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_ED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="237"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_EF"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="239"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_F1"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="241"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_FC"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="252"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_FD"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="253"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_FE"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="254"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="OP_UNUSED_FF"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="255"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
 <field name="OP_USHR_INT"
  type="int"
  transient="false"
diff --git a/api/current.xml b/api/current.xml
index b48edb0..37cbeee 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -85573,6 +85573,142 @@
 >
 </method>
 </class>
+<class name="SslError"
+ extends="java.lang.Object"
+ abstract="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<constructor name="SslError"
+ type="android.net.http.SslError"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="error" type="int">
+</parameter>
+<parameter name="certificate" type="android.net.http.SslCertificate">
+</parameter>
+</constructor>
+<constructor name="SslError"
+ type="android.net.http.SslError"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="error" type="int">
+</parameter>
+<parameter name="certificate" type="java.security.cert.X509Certificate">
+</parameter>
+</constructor>
+<method name="addError"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="error" type="int">
+</parameter>
+</method>
+<method name="getCertificate"
+ return="android.net.http.SslCertificate"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="getPrimaryError"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="hasError"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="error" type="int">
+</parameter>
+</method>
+<field name="SSL_EXPIRED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="1"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SSL_IDMISMATCH"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="2"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SSL_MAX_ERROR"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="4"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SSL_NOTYETVALID"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="0"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="SSL_UNTRUSTED"
+ type="int"
+ transient="false"
+ volatile="false"
+ value="3"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
 </package>
 <package name="android.net.wifi"
 >
@@ -186657,6 +186793,23 @@
 <parameter name="realm" type="java.lang.String">
 </parameter>
 </method>
+<method name="onReceivedSslError"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="view" type="android.webkit.WebView">
+</parameter>
+<parameter name="handler" type="android.webkit.SslErrorHandler">
+</parameter>
+<parameter name="error" type="android.net.http.SslError">
+</parameter>
+</method>
 <method name="onScaleChanged"
  return="void"
  abstract="false"
diff --git a/cmds/stagefright/audioloop.cpp b/cmds/stagefright/audioloop.cpp
index 70ab559..3788e73 100644
--- a/cmds/stagefright/audioloop.cpp
+++ b/cmds/stagefright/audioloop.cpp
@@ -38,12 +38,12 @@
         meta->setInt32(kKeyMaxInputSize, maxInputSize);
     }
 
-    sp<OMXCodec> encoder = OMXCodec::Create(
+    sp<MediaSource> encoder = OMXCodec::Create(
             client.interface(),
             meta, true /* createEncoder */,
             source);
 
-    sp<OMXCodec> decoder = OMXCodec::Create(
+    sp<MediaSource> decoder = OMXCodec::Create(
             client.interface(),
             meta, false /* createEncoder */,
             encoder);
diff --git a/cmds/stagefright/record.cpp b/cmds/stagefright/record.cpp
index a31a5c0..2ec0b70 100644
--- a/cmds/stagefright/record.cpp
+++ b/cmds/stagefright/record.cpp
@@ -154,7 +154,7 @@
 
     sp<MetaData> meta = source->getFormat();
 
-    sp<OMXCodec> decoder = OMXCodec::Create(
+    sp<MediaSource> decoder = OMXCodec::Create(
             client.interface(), meta, false /* createEncoder */, source);
 
     int width, height;
@@ -173,7 +173,7 @@
     enc_meta->setInt32(kKeyWidth, width);
     enc_meta->setInt32(kKeyHeight, height);
 
-    sp<OMXCodec> encoder =
+    sp<MediaSource> encoder =
         OMXCodec::Create(
                 client.interface(), enc_meta, true /* createEncoder */, decoder);
 
diff --git a/core/java/android/app/ISearchManager.aidl b/core/java/android/app/ISearchManager.aidl
index a7d63789..0920467 100644
--- a/core/java/android/app/ISearchManager.aidl
+++ b/core/java/android/app/ISearchManager.aidl
@@ -16,11 +16,11 @@
 
 package android.app;
 
+import android.app.SearchableInfo;
 import android.app.ISearchManagerCallback;
 import android.content.ComponentName;
 import android.content.res.Configuration;
 import android.os.Bundle;
-import android.server.search.SearchableInfo;
 
 /** @hide */
 interface ISearchManager {
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 0757cb0..b204c79 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -37,7 +37,6 @@
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.provider.Browser;
-import android.server.search.SearchableInfo;
 import android.speech.RecognizerIntent;
 import android.text.Editable;
 import android.text.InputType;
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index 2e94a2f..ab5e102 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -26,7 +26,6 @@
 import android.os.Handler;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.server.search.SearchableInfo;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyEvent;
diff --git a/core/java/android/app/SearchableInfo.aidl b/core/java/android/app/SearchableInfo.aidl
new file mode 100644
index 0000000..146b373
--- /dev/null
+++ b/core/java/android/app/SearchableInfo.aidl
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2008, 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.
+ */
+
+package android.app;
+
+parcelable SearchableInfo;
diff --git a/core/java/android/app/SearchableInfo.java b/core/java/android/app/SearchableInfo.java
new file mode 100644
index 0000000..cbf7b3d
--- /dev/null
+++ b/core/java/android/app/SearchableInfo.java
@@ -0,0 +1,799 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+package android.app;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
+import android.content.res.TypedArray;
+import android.content.res.XmlResourceParser;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.text.InputType;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.util.Xml;
+import android.view.inputmethod.EditorInfo;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+/**
+ * 
+ * @hide Pending API council approval
+ */
+public final class SearchableInfo implements Parcelable {
+
+    // general debugging support
+    private static final boolean DBG = false;
+    private static final String LOG_TAG = "SearchableInfo";
+
+    // static strings used for XML lookups.
+    // TODO how should these be documented for the developer, in a more structured way than 
+    // the current long wordy javadoc in SearchManager.java ?
+    private static final String MD_LABEL_SEARCHABLE = "android.app.searchable";
+    private static final String MD_XML_ELEMENT_SEARCHABLE = "searchable";
+    private static final String MD_XML_ELEMENT_SEARCHABLE_ACTION_KEY = "actionkey";
+    
+    // flags in the searchMode attribute
+    private static final int SEARCH_MODE_BADGE_LABEL = 0x04;
+    private static final int SEARCH_MODE_BADGE_ICON = 0x08;
+    private static final int SEARCH_MODE_QUERY_REWRITE_FROM_DATA = 0x10;
+    private static final int SEARCH_MODE_QUERY_REWRITE_FROM_TEXT = 0x20;
+    
+    // true member variables - what we know about the searchability
+    private final int mLabelId;
+    private final ComponentName mSearchActivity;
+    private final int mHintId;
+    private final int mSearchMode;
+    private final int mIconId;
+    private final int mSearchButtonText;
+    private final int mSearchInputType;
+    private final int mSearchImeOptions;
+    private final boolean mIncludeInGlobalSearch;
+    private final boolean mQueryAfterZeroResults;
+    private final boolean mAutoUrlDetect;
+    private final String mSettingsDescription;
+    private final String mSuggestAuthority;
+    private final String mSuggestPath;
+    private final String mSuggestSelection;
+    private final String mSuggestIntentAction;
+    private final String mSuggestIntentData;
+    private final int mSuggestThreshold;
+    // Maps key codes to action key information. auto-boxing is not so bad here,
+    // since keycodes for the hard keys are < 127. For such values, Integer.valueOf()
+    // uses shared Integer objects.
+    // This is not final, to allow lazy initialization.
+    private HashMap<Integer,ActionKeyInfo> mActionKeys = null;
+    private final String mSuggestProviderPackage;
+    
+    // Flag values for Searchable_voiceSearchMode
+    private static int VOICE_SEARCH_SHOW_BUTTON = 1;
+    private static int VOICE_SEARCH_LAUNCH_WEB_SEARCH = 2;
+    private static int VOICE_SEARCH_LAUNCH_RECOGNIZER = 4;
+    private final int mVoiceSearchMode;
+    private final int mVoiceLanguageModeId;       // voiceLanguageModel
+    private final int mVoicePromptTextId;         // voicePromptText
+    private final int mVoiceLanguageId;           // voiceLanguage
+    private final int mVoiceMaxResults;           // voiceMaxResults
+
+    
+    /**
+     * Retrieve the authority for obtaining search suggestions.
+     * 
+     * @return Returns a string containing the suggestions authority.
+     */
+    public String getSuggestAuthority() {
+        return mSuggestAuthority;
+    }
+
+    /**
+     * Gets the name of the package where the suggestion provider lives,
+     * or {@code null}.
+     */
+    public String getSuggestPackage() {
+        return mSuggestProviderPackage;
+    }
+
+    /**
+     * Gets the component name of the searchable activity.
+     */
+    public ComponentName getSearchActivity() {
+        return mSearchActivity;
+    }
+
+    /**
+     * Checks whether the badge should be a text label.
+     */
+    public boolean useBadgeLabel() {
+        return 0 != (mSearchMode & SEARCH_MODE_BADGE_LABEL);
+    }
+
+    /**
+     * Checks whether the badge should be an icon.
+     */
+    public boolean useBadgeIcon() {
+        return (0 != (mSearchMode & SEARCH_MODE_BADGE_ICON)) && (mIconId != 0);
+    }
+
+    /**
+     * Checks whether the text in the query field should come from the suggestion intent data.
+     */
+    public boolean shouldRewriteQueryFromData() {
+        return 0 != (mSearchMode & SEARCH_MODE_QUERY_REWRITE_FROM_DATA);
+    }
+
+    /**
+     * Checks whether the text in the query field should come from the suggestion title.
+     */
+    public boolean shouldRewriteQueryFromText() {
+        return 0 != (mSearchMode & SEARCH_MODE_QUERY_REWRITE_FROM_TEXT);
+    }
+    
+    /**
+     * Gets the description to use for this source in system search settings, or null if
+     * none has been specified.
+     */
+    public String getSettingsDescription() {
+        return mSettingsDescription;
+    }
+
+    /**
+     * Retrieve the path for obtaining search suggestions.
+     * 
+     * @return Returns a string containing the suggestions path, or null if not provided.
+     */
+    public String getSuggestPath() {
+        return mSuggestPath;
+    }
+    
+    /**
+     * Retrieve the selection pattern for obtaining search suggestions.  This must
+     * include a single ? which will be used for the user-typed characters.
+     * 
+     * @return Returns a string containing the suggestions authority.
+     */
+    public String getSuggestSelection() {
+        return mSuggestSelection;
+    }
+    
+    /**
+     * Retrieve the (optional) intent action for use with these suggestions.  This is
+     * useful if all intents will have the same action (e.g. "android.intent.action.VIEW").
+     * 
+     * Can be overriden in any given suggestion via the AUTOSUGGEST_COLUMN_INTENT_ACTION column.
+     * 
+     * @return Returns a string containing the default intent action.
+     */
+    public String getSuggestIntentAction() {
+        return mSuggestIntentAction;
+    }
+    
+    /**
+     * Retrieve the (optional) intent data for use with these suggestions.  This is
+     * useful if all intents will have similar data URIs (e.g. "android.intent.action.VIEW"), 
+     * but you'll likely need to provide a specific ID as well via the column
+     * AUTOSUGGEST_COLUMN_INTENT_DATA_ID, which will be appended to the intent data URI.
+     * 
+     * Can be overriden in any given suggestion via the AUTOSUGGEST_COLUMN_INTENT_DATA column.
+     * 
+     * @return Returns a string containing the default intent data.
+     */
+    public String getSuggestIntentData() {
+        return mSuggestIntentData;
+    }
+    
+    /**
+     * Gets the suggestion threshold for use with these suggestions. 
+     * 
+     * @return The value of the <code>searchSuggestThreshold</code> attribute, 
+     *         or 0 if the attribute is not set.
+     */
+    public int getSuggestThreshold() {
+        return mSuggestThreshold;
+    }
+    
+    /**
+     * Get the context for the searchable activity.  
+     * 
+     * This is fairly expensive so do it on the original scan, or when an app is
+     * selected, but don't hang on to the result forever.
+     * 
+     * @param context You need to supply a context to start with
+     * @return Returns a context related to the searchable activity
+     */
+    public Context getActivityContext(Context context) {
+        return createActivityContext(context, mSearchActivity);
+    }
+    
+    /**
+     * Creates a context for another activity.
+     */
+    private static Context createActivityContext(Context context, ComponentName activity) {
+        Context theirContext = null;
+        try {
+            theirContext = context.createPackageContext(activity.getPackageName(), 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            // unexpected, but we deal with this by null-checking theirContext
+        } catch (java.lang.SecurityException e) {
+            // unexpected, but we deal with this by null-checking theirContext
+        }
+        
+        return theirContext;
+    }
+    
+    /**
+     * Get the context for the suggestions provider.  
+     * 
+     * This is fairly expensive so do it on the original scan, or when an app is
+     * selected, but don't hang on to the result forever.
+     * 
+     * @param context You need to supply a context to start with
+     * @param activityContext If we can determine that the provider and the activity are the
+     * same, we'll just return this one.
+     * @return Returns a context related to the context provider
+     */
+    public Context getProviderContext(Context context, Context activityContext) {
+        Context theirContext = null;
+        if (mSearchActivity.getPackageName().equals(mSuggestProviderPackage)) {
+            return activityContext;
+        }
+        if (mSuggestProviderPackage != null)
+        try {
+            theirContext = context.createPackageContext(mSuggestProviderPackage, 0);
+        } catch (PackageManager.NameNotFoundException e) {
+            // unexpected, but we deal with this by null-checking theirContext
+        } catch (java.lang.SecurityException e) {
+            // unexpected, but we deal with this by null-checking theirContext
+        }
+        
+        return theirContext;
+    }
+    
+    /**
+     * Constructor
+     * 
+     * Given a ComponentName, get the searchability info
+     * and build a local copy of it.  Use the factory, not this.
+     * 
+     * @param activityContext runtime context for the activity that the searchable info is about.
+     * @param attr The attribute set we found in the XML file, contains the values that are used to
+     * construct the object.
+     * @param cName The component name of the searchable activity
+     * @throws IllegalArgumentException if the searchability info is invalid or insufficient
+     */
+    private SearchableInfo(Context activityContext, AttributeSet attr, final ComponentName cName) {
+        mSearchActivity = cName;
+        
+        TypedArray a = activityContext.obtainStyledAttributes(attr,
+                com.android.internal.R.styleable.Searchable);
+        mSearchMode = a.getInt(com.android.internal.R.styleable.Searchable_searchMode, 0);
+        mLabelId = a.getResourceId(com.android.internal.R.styleable.Searchable_label, 0);
+        mHintId = a.getResourceId(com.android.internal.R.styleable.Searchable_hint, 0);
+        mIconId = a.getResourceId(com.android.internal.R.styleable.Searchable_icon, 0);
+        mSearchButtonText = a.getResourceId(
+                com.android.internal.R.styleable.Searchable_searchButtonText, 0);
+        mSearchInputType = a.getInt(com.android.internal.R.styleable.Searchable_inputType, 
+                InputType.TYPE_CLASS_TEXT |
+                InputType.TYPE_TEXT_VARIATION_NORMAL);
+        mSearchImeOptions = a.getInt(com.android.internal.R.styleable.Searchable_imeOptions, 
+                EditorInfo.IME_ACTION_SEARCH);
+        mIncludeInGlobalSearch = a.getBoolean(
+                com.android.internal.R.styleable.Searchable_includeInGlobalSearch, false);
+        mQueryAfterZeroResults = a.getBoolean(
+                com.android.internal.R.styleable.Searchable_queryAfterZeroResults, false);
+        mAutoUrlDetect = a.getBoolean(
+                com.android.internal.R.styleable.Searchable_autoUrlDetect, false);
+
+        mSettingsDescription = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSettingsDescription);
+        mSuggestAuthority = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSuggestAuthority);
+        mSuggestPath = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSuggestPath);
+        mSuggestSelection = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSuggestSelection);
+        mSuggestIntentAction = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSuggestIntentAction);
+        mSuggestIntentData = a.getString(
+                com.android.internal.R.styleable.Searchable_searchSuggestIntentData);
+        mSuggestThreshold = a.getInt(
+                com.android.internal.R.styleable.Searchable_searchSuggestThreshold, 0);
+
+        mVoiceSearchMode = 
+            a.getInt(com.android.internal.R.styleable.Searchable_voiceSearchMode, 0);
+        // TODO this didn't work - came back zero from YouTube
+        mVoiceLanguageModeId = 
+            a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguageModel, 0);
+        mVoicePromptTextId = 
+            a.getResourceId(com.android.internal.R.styleable.Searchable_voicePromptText, 0);
+        mVoiceLanguageId = 
+            a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguage, 0);
+        mVoiceMaxResults = 
+            a.getInt(com.android.internal.R.styleable.Searchable_voiceMaxResults, 0);
+
+        a.recycle();
+
+        // get package info for suggestions provider (if any)
+        String suggestProviderPackage = null;
+        if (mSuggestAuthority != null) {
+            PackageManager pm = activityContext.getPackageManager();
+            ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, 0);
+            if (pi != null) {
+                suggestProviderPackage = pi.packageName;
+            }
+        }
+        mSuggestProviderPackage = suggestProviderPackage;
+
+        // for now, implement some form of rules - minimal data
+        if (mLabelId == 0) {
+            throw new IllegalArgumentException("Search label must be a resource reference.");
+        }
+    }
+    
+    /**
+     * Private class used to hold the "action key" configuration
+     */
+    public static class ActionKeyInfo implements Parcelable {
+        
+        private final int mKeyCode;
+        private final String mQueryActionMsg;
+        private final String mSuggestActionMsg;
+        private final String mSuggestActionMsgColumn;
+        
+        /**
+         * Create one object using attributeset as input data.
+         * @param activityContext runtime context of the activity that the action key information
+         *        is about.
+         * @param attr The attribute set we found in the XML file, contains the values that are used to
+         * construct the object.
+         * @throws IllegalArgumentException if the action key configuration is invalid
+         */
+        public ActionKeyInfo(Context activityContext, AttributeSet attr) {
+            TypedArray a = activityContext.obtainStyledAttributes(attr,
+                    com.android.internal.R.styleable.SearchableActionKey);
+
+            mKeyCode = a.getInt(
+                    com.android.internal.R.styleable.SearchableActionKey_keycode, 0);
+            mQueryActionMsg = a.getString(
+                    com.android.internal.R.styleable.SearchableActionKey_queryActionMsg);
+            mSuggestActionMsg = a.getString(
+                    com.android.internal.R.styleable.SearchableActionKey_suggestActionMsg);
+            mSuggestActionMsgColumn = a.getString(
+                    com.android.internal.R.styleable.SearchableActionKey_suggestActionMsgColumn);
+            a.recycle();
+
+            // sanity check.
+            if (mKeyCode == 0) {
+                throw new IllegalArgumentException("No keycode.");
+            } else if ((mQueryActionMsg == null) && 
+                    (mSuggestActionMsg == null) && 
+                    (mSuggestActionMsgColumn == null)) {
+                throw new IllegalArgumentException("No message information.");
+            }
+        }
+
+        /**
+         * Instantiate a new ActionKeyInfo from the data in a Parcel that was
+         * previously written with {@link #writeToParcel(Parcel, int)}.
+         *
+         * @param in The Parcel containing the previously written ActionKeyInfo,
+         * positioned at the location in the buffer where it was written.
+         */
+        public ActionKeyInfo(Parcel in) {
+            mKeyCode = in.readInt();
+            mQueryActionMsg = in.readString();
+            mSuggestActionMsg = in.readString();
+            mSuggestActionMsgColumn = in.readString();
+        }
+
+        public int getKeyCode() {
+            return mKeyCode;
+        }
+
+        public String getQueryActionMsg() {
+            return mQueryActionMsg;
+        }
+
+        public String getSuggestActionMsg() {
+            return mSuggestActionMsg;
+        }
+
+        public String getSuggestActionMsgColumn() {
+            return mSuggestActionMsgColumn;
+        }
+
+        public int describeContents() {
+            return 0;
+        }
+
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mKeyCode);
+            dest.writeString(mQueryActionMsg);
+            dest.writeString(mSuggestActionMsg);
+            dest.writeString(mSuggestActionMsgColumn);
+        }
+    }
+    
+    /**
+     * If any action keys were defined for this searchable activity, look up and return.
+     * 
+     * @param keyCode The key that was pressed
+     * @return Returns the ActionKeyInfo record, or null if none defined
+     */
+    public ActionKeyInfo findActionKey(int keyCode) {
+        if (mActionKeys == null) {
+            return null;
+        }
+        return mActionKeys.get(keyCode);
+    }
+
+    private void addActionKey(ActionKeyInfo keyInfo) {
+        if (mActionKeys == null) {
+            mActionKeys = new HashMap<Integer,ActionKeyInfo>();
+        }
+        mActionKeys.put(keyInfo.getKeyCode(), keyInfo);
+    }
+
+    /**
+     * Gets search information for the given activity.
+     *
+     * @param context Context to use for reading activity resources.
+     * @param activityInfo Activity to get search information from.
+     * @return Search information about the given activity, or {@code null} if
+     *         the activity has no or invalid searchability meta-data.
+     */
+    public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo) {
+        // for each component, try to find metadata
+        XmlResourceParser xml = 
+                activityInfo.loadXmlMetaData(context.getPackageManager(), MD_LABEL_SEARCHABLE);
+        if (xml == null) {
+            return null;
+        }
+        ComponentName cName = new ComponentName(activityInfo.packageName, activityInfo.name);
+        
+        SearchableInfo searchable = getActivityMetaData(context, xml, cName);
+        xml.close();
+        
+        if (DBG) {
+            if (searchable != null) {
+                Log.d(LOG_TAG, "Checked " + activityInfo.name
+                        + ",label=" + searchable.getLabelId()
+                        + ",icon=" + searchable.getIconId()
+                        + ",suggestAuthority=" + searchable.getSuggestAuthority()
+                        + ",target=" + searchable.getSearchActivity().getClassName()
+                        + ",global=" + searchable.shouldIncludeInGlobalSearch()
+                        + ",settingsDescription=" + searchable.getSettingsDescription()
+                        + ",threshold=" + searchable.getSuggestThreshold());
+            } else {
+                Log.d(LOG_TAG, "Checked " + activityInfo.name + ", no searchable meta-data");
+            }
+        }
+        return searchable;
+    }
+    
+    /**
+     * Get the metadata for a given activity
+     * 
+     * @param context runtime context
+     * @param xml XML parser for reading attributes
+     * @param cName The component name of the searchable activity
+     * 
+     * @result A completely constructed SearchableInfo, or null if insufficient XML data for it
+     */
+    private static SearchableInfo getActivityMetaData(Context context, XmlPullParser xml,
+            final ComponentName cName)  {
+        SearchableInfo result = null;
+        Context activityContext = createActivityContext(context, cName);
+        
+        // in order to use the attributes mechanism, we have to walk the parser
+        // forward through the file until it's reading the tag of interest.
+        try {
+            int tagType = xml.next();
+            while (tagType != XmlPullParser.END_DOCUMENT) {
+                if (tagType == XmlPullParser.START_TAG) {
+                    if (xml.getName().equals(MD_XML_ELEMENT_SEARCHABLE)) {
+                        AttributeSet attr = Xml.asAttributeSet(xml);
+                        if (attr != null) {
+                            try {
+                                result = new SearchableInfo(activityContext, attr, cName);
+                            } catch (IllegalArgumentException ex) {
+                                Log.w(LOG_TAG, "Invalid searchable metadata for " +
+                                        cName.flattenToShortString() + ": " + ex.getMessage());
+                                return null;
+                            }
+                        }
+                    } else if (xml.getName().equals(MD_XML_ELEMENT_SEARCHABLE_ACTION_KEY)) {
+                        if (result == null) {
+                            // Can't process an embedded element if we haven't seen the enclosing
+                            return null;
+                        }
+                        AttributeSet attr = Xml.asAttributeSet(xml);
+                        if (attr != null) {
+                            try {
+                                result.addActionKey(new ActionKeyInfo(activityContext, attr));
+                            } catch (IllegalArgumentException ex) {
+                                Log.w(LOG_TAG, "Invalid action key for " +
+                                        cName.flattenToShortString() + ": " + ex.getMessage());
+                                return null;
+                            }
+                        }
+                    }
+                }
+                tagType = xml.next();
+            }
+        } catch (XmlPullParserException e) {
+            Log.w(LOG_TAG, "Reading searchable metadata for " + cName.flattenToShortString(), e);
+            return null;
+        } catch (IOException e) {
+            Log.w(LOG_TAG, "Reading searchable metadata for " + cName.flattenToShortString(), e);
+            return null;
+        }
+        
+        return result;
+    }
+
+    /**
+     * Return the "label" (user-visible name) of this searchable context.  This must be 
+     * accessed using the target (searchable) Activity's resources, not simply the context of the
+     * caller.
+     * 
+     * @return Returns the resource Id
+     */
+    public int getLabelId() {
+        return mLabelId;
+    }
+    
+    /**
+     * Return the resource Id of the hint text.  This must be 
+     * accessed using the target (searchable) Activity's resources, not simply the context of the
+     * caller.
+     * 
+     * @return Returns the resource Id, or 0 if not specified by this package.
+     */
+    public int getHintId() {
+        return mHintId;
+    }
+    
+    /**
+     * Return the icon Id specified by the Searchable_icon meta-data entry.  This must be 
+     * accessed using the target (searchable) Activity's resources, not simply the context of the
+     * caller.
+     * 
+     * @return Returns the resource id.
+     */
+    public int getIconId() {
+        return mIconId;
+    }
+    
+    /**
+     * @return true if android:voiceSearchMode="showVoiceSearchButton"
+     */
+    public boolean getVoiceSearchEnabled() {
+        return 0 != (mVoiceSearchMode & VOICE_SEARCH_SHOW_BUTTON);
+    }
+    
+    /**
+     * @return true if android:voiceSearchMode="launchWebSearch"
+     */
+    public boolean getVoiceSearchLaunchWebSearch() {
+        return 0 != (mVoiceSearchMode & VOICE_SEARCH_LAUNCH_WEB_SEARCH);
+    }
+    
+    /**
+     * @return true if android:voiceSearchMode="launchRecognizer"
+     */
+    public boolean getVoiceSearchLaunchRecognizer() {
+        return 0 != (mVoiceSearchMode & VOICE_SEARCH_LAUNCH_RECOGNIZER);
+    }
+    
+    /**
+     * @return the resource Id of the language model string, if specified in the searchable
+     * activity's metadata, or 0 if not specified.  
+     */
+    public int getVoiceLanguageModeId() {
+        return mVoiceLanguageModeId;
+    }
+    
+    /**
+     * @return the resource Id of the voice prompt text string, if specified in the searchable
+     * activity's metadata, or 0 if not specified.  
+     */
+    public int getVoicePromptTextId() {
+        return mVoicePromptTextId;
+    }
+    
+    /**
+     * @return the resource Id of the spoken langauge, if specified in the searchable
+     * activity's metadata, or 0 if not specified.  
+     */
+    public int getVoiceLanguageId() {
+        return mVoiceLanguageId;
+    }
+    
+    /**
+     * @return the max results count, if specified in the searchable
+     * activity's metadata, or 0 if not specified.  
+     */
+    public int getVoiceMaxResults() {
+        return mVoiceMaxResults;
+    }
+    
+    /**
+     * Return the resource Id of replacement text for the "Search" button.
+     * 
+     * @return Returns the resource Id, or 0 if not specified by this package.
+     */
+    public int getSearchButtonText() {
+        return mSearchButtonText;
+    }
+    
+    /**
+     * Return the input type as specified in the searchable attributes.  This will default to
+     * InputType.TYPE_CLASS_TEXT if not specified (which is appropriate for free text input).
+     * 
+     * @return the input type
+     */
+    public int getInputType() {
+        return mSearchInputType;
+    }
+    
+    /**
+     * Return the input method options specified in the searchable attributes.
+     * This will default to EditorInfo.ACTION_SEARCH if not specified (which is
+     * appropriate for a search box).
+     * 
+     * @return the input type
+     */
+    public int getImeOptions() {
+        return mSearchImeOptions;
+    }
+    
+    /**
+     * Checks whether the searchable is exported.
+     *
+     * @return The value of the <code>exported</code> attribute,
+     *         or <code>false</code> if the attribute is not set.
+     */
+    public boolean shouldIncludeInGlobalSearch() {
+        return mIncludeInGlobalSearch;
+    }
+
+    /**
+     * Checks whether this searchable activity should be invoked after a query returned zero
+     * results.
+     *
+     * @return The value of the <code>queryAfterZeroResults</code> attribute,
+     *         or <code>false</code> if the attribute is not set.
+     */
+    public boolean queryAfterZeroResults() {
+        return mQueryAfterZeroResults;
+    }
+
+    /**
+     * Checks whether this searchable activity has auto URL detect turned on.
+     *
+     * @return The value of the <code>autoUrlDetect</code> attribute,
+     *         or <code>false</code> if the attribute is not set.
+     */
+    public boolean autoUrlDetect() {
+        return mAutoUrlDetect;
+    }
+
+    /**
+     * Support for parcelable and aidl operations.
+     */
+    public static final Parcelable.Creator<SearchableInfo> CREATOR
+    = new Parcelable.Creator<SearchableInfo>() {
+        public SearchableInfo createFromParcel(Parcel in) {
+            return new SearchableInfo(in);
+        }
+
+        public SearchableInfo[] newArray(int size) {
+            return new SearchableInfo[size];
+        }
+    };
+
+    /**
+     * Instantiate a new SearchableInfo from the data in a Parcel that was
+     * previously written with {@link #writeToParcel(Parcel, int)}.
+     *
+     * @param in The Parcel containing the previously written SearchableInfo,
+     * positioned at the location in the buffer where it was written.
+     */
+    public SearchableInfo(Parcel in) {
+        mLabelId = in.readInt();
+        mSearchActivity = ComponentName.readFromParcel(in);
+        mHintId = in.readInt();
+        mSearchMode = in.readInt();
+        mIconId = in.readInt();
+        mSearchButtonText = in.readInt();
+        mSearchInputType = in.readInt();
+        mSearchImeOptions = in.readInt();
+        mIncludeInGlobalSearch = in.readInt() != 0;
+        mQueryAfterZeroResults = in.readInt() != 0;
+        mAutoUrlDetect = in.readInt() != 0;
+        
+        mSettingsDescription = in.readString();
+        mSuggestAuthority = in.readString();
+        mSuggestPath = in.readString();
+        mSuggestSelection = in.readString();
+        mSuggestIntentAction = in.readString();
+        mSuggestIntentData = in.readString();
+        mSuggestThreshold = in.readInt();
+
+        for (int count = in.readInt(); count > 0; count--) {
+            addActionKey(new ActionKeyInfo(in));
+        }
+
+        mSuggestProviderPackage = in.readString();
+        
+        mVoiceSearchMode = in.readInt();
+        mVoiceLanguageModeId = in.readInt();
+        mVoicePromptTextId = in.readInt();
+        mVoiceLanguageId = in.readInt();
+        mVoiceMaxResults = in.readInt();
+    }
+
+    public int describeContents() {
+        return 0;
+    }
+
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mLabelId);
+        mSearchActivity.writeToParcel(dest, flags);
+        dest.writeInt(mHintId);
+        dest.writeInt(mSearchMode);
+        dest.writeInt(mIconId);
+        dest.writeInt(mSearchButtonText);
+        dest.writeInt(mSearchInputType);
+        dest.writeInt(mSearchImeOptions);
+        dest.writeInt(mIncludeInGlobalSearch ? 1 : 0);
+        dest.writeInt(mQueryAfterZeroResults ? 1 : 0);
+        dest.writeInt(mAutoUrlDetect ? 1 : 0);
+        
+        dest.writeString(mSettingsDescription);
+        dest.writeString(mSuggestAuthority);
+        dest.writeString(mSuggestPath);
+        dest.writeString(mSuggestSelection);
+        dest.writeString(mSuggestIntentAction);
+        dest.writeString(mSuggestIntentData);
+        dest.writeInt(mSuggestThreshold);
+
+        if (mActionKeys == null) {
+            dest.writeInt(0);
+        } else {
+            dest.writeInt(mActionKeys.size());
+            for (ActionKeyInfo actionKey : mActionKeys.values()) {
+                actionKey.writeToParcel(dest, flags);
+            }
+        }
+
+        dest.writeString(mSuggestProviderPackage);
+
+        dest.writeInt(mVoiceSearchMode);
+        dest.writeInt(mVoiceLanguageModeId);
+        dest.writeInt(mVoicePromptTextId);
+        dest.writeInt(mVoiceLanguageId);
+        dest.writeInt(mVoiceMaxResults);
+    }
+}
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 12be97c..173c3e1 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -31,7 +31,6 @@
 import android.graphics.drawable.StateListDrawable;
 import android.net.Uri;
 import android.os.Bundle;
-import android.server.search.SearchableInfo;
 import android.text.Html;
 import android.text.TextUtils;
 import android.util.Log;
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index 7df3637..fda9b81 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -199,6 +199,22 @@
         }
     }
 
+    /** Check if any A2DP sink is in Non Disconnected state
+     * i.e playing, connected, connecting, disconnecting.
+     * @return a unmodifiable set of connected A2DP sinks, or null on error.
+     * @hide
+     */
+    public Set<BluetoothDevice> getNonDisconnectedSinks() {
+        if (DBG) log("getNonDisconnectedSinks()");
+        try {
+            return Collections.unmodifiableSet(
+                    new HashSet<BluetoothDevice>(Arrays.asList(mService.getNonDisconnectedSinks())));
+        } catch (RemoteException e) {
+            Log.e(TAG, "", e);
+            return null;
+        }
+    }
+
     /** Get the state of an A2DP sink
      *  @param device Remote BT device.
      *  @return State code, one of STATE_
diff --git a/core/java/android/bluetooth/IBluetoothA2dp.aidl b/core/java/android/bluetooth/IBluetoothA2dp.aidl
index 002cf4e..168fe3b 100644
--- a/core/java/android/bluetooth/IBluetoothA2dp.aidl
+++ b/core/java/android/bluetooth/IBluetoothA2dp.aidl
@@ -29,6 +29,7 @@
     boolean suspendSink(in BluetoothDevice device);
     boolean resumeSink(in BluetoothDevice device);
     BluetoothDevice[] getConnectedSinks();  // change to Set<> once AIDL supports
+    BluetoothDevice[] getNonDisconnectedSinks();  // change to Set<> once AIDL supports
     int getSinkState(in BluetoothDevice device);
     boolean setSinkPriority(in BluetoothDevice device, int priority);
     int getSinkPriority(in BluetoothDevice device);
diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java
index d9003a3..657bbcc 100644
--- a/core/java/android/database/sqlite/SQLiteDatabase.java
+++ b/core/java/android/database/sqlite/SQLiteDatabase.java
@@ -827,15 +827,6 @@
     }
 
     private void closeClosable() {
-        /* deallocate all compiled sql statement objects in compiledQueries cache.
-         * this should be done before de-referencing all {@link SQLiteClosable} objects
-         * from this database object because calling
-         * {@link SQLiteClosable#onAllReferencesReleasedFromContainer()} could cause the database
-         * to be closed. sqlite doesn't let a database close if there are
-         * any unfinalized statements - such as the compiled-sql objects in mCompiledQueries.
-         */
-        resetCompiledSqlCache();
- 
         Iterator<Map.Entry<SQLiteClosable, Object>> iter = mPrograms.entrySet().iterator();
         while (iter.hasNext()) {
             Map.Entry<SQLiteClosable, Object> entry = iter.next();
@@ -844,6 +835,13 @@
                 program.onAllReferencesReleasedFromContainer();
             }
         }
+
+        // finalize all compiled sql statement objects in compiledQueries cache
+        synchronized (mCompiledQueries) {
+            for (SQLiteCompiledSql compiledStatement : mCompiledQueries.values()) {
+                compiledStatement.releaseSqlStatement();
+            }
+        }
     }
 
     /**
@@ -1791,9 +1789,7 @@
      */
     public void setMaxSqlCacheSize(int cacheSize) {
         synchronized(mCompiledQueries) {
-            if (mMaxSqlCacheSize > 0) {
-                resetCompiledSqlCache();
-            }
+            resetCompiledSqlCache();
             mMaxSqlCacheSize = (cacheSize > MAX_SQL_CACHE_SIZE) ? MAX_SQL_CACHE_SIZE
                     : (cacheSize < 0) ? 0 : cacheSize;
         }
@@ -1804,9 +1800,6 @@
      */
     public void resetCompiledSqlCache() {
         synchronized(mCompiledQueries) {
-            for (SQLiteCompiledSql compiledStatement : mCompiledQueries.values()) {
-                compiledStatement.releaseSqlStatement();
-            }
             mCompiledQueries.clear();
         }
     }
@@ -1842,7 +1835,7 @@
                 /* reached max cachesize. before adding new entry, remove an entry from the
                  * cache. we don't want to wipe out the entire cache because of this:
                  * GCing {@link SQLiteCompiledSql} requires call to sqlite3_finalize
-                 * JNI method. If entire cache is wiped out, it could cause a big GC activity
+                 * JNI method. If entire cache is wiped out, it could be cause a big GC activity
                  * just because a (rogue) process is using the cache incorrectly.
                  */
                 Set<String> keySet = mCompiledQueries.keySet();
@@ -1851,7 +1844,8 @@
                     break;
                 }
             }
-            mCompiledQueries.put(sql, compiledStatement);
+            compiledSql = new SQLiteCompiledSql(this, sql);
+            mCompiledQueries.put(sql, compiledSql);
         }
         if (SQLiteDebug.DEBUG_SQL_CACHE) {
             Log.v(TAG, "|adding_sql_to_cache|" + getPath() + "|" + mCompiledQueries.size() + "|" +
diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java
index 5ee2f1e..edc15cb 100644
--- a/core/java/android/database/sqlite/SQLiteProgram.java
+++ b/core/java/android/database/sqlite/SQLiteProgram.java
@@ -100,7 +100,7 @@
      * @return a unique identifier for this program
      */
     public final int getUniqueId() {
-        return  (compiledSql != null) ? compiledSql.nStatement : 0;
+        return compiledSql.nStatement;
     }
 
     /* package */ String getSqlString() {
diff --git a/core/java/android/net/http/SslError.java b/core/java/android/net/http/SslError.java
index 2788cb1..e1b9deb 100644
--- a/core/java/android/net/http/SslError.java
+++ b/core/java/android/net/http/SslError.java
@@ -20,8 +20,6 @@
 
 /**
  * One or more individual SSL errors and the associated SSL certificate
- * 
- * {@hide}
  */
 public class SslError {
 
diff --git a/core/java/android/server/BluetoothA2dpService.java b/core/java/android/server/BluetoothA2dpService.java
index 46de708..f2e132b5 100644
--- a/core/java/android/server/BluetoothA2dpService.java
+++ b/core/java/android/server/BluetoothA2dpService.java
@@ -376,6 +376,16 @@
         return sinks.toArray(new BluetoothDevice[sinks.size()]);
     }
 
+    public synchronized BluetoothDevice[] getNonDisconnectedSinks() {
+        mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+        Set<BluetoothDevice> sinks = lookupSinksMatchingStates(
+                new int[] {BluetoothA2dp.STATE_CONNECTED,
+                           BluetoothA2dp.STATE_PLAYING,
+                           BluetoothA2dp.STATE_CONNECTING,
+                           BluetoothA2dp.STATE_DISCONNECTING});
+        return sinks.toArray(new BluetoothDevice[sinks.size()]);
+    }
+
     public synchronized int getSinkState(BluetoothDevice device) {
         mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
         Integer state = mAudioDevices.get(device);
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java
index e960491..0d0d245 100644
--- a/core/java/android/server/BluetoothEventLoop.java
+++ b/core/java/android/server/BluetoothEventLoop.java
@@ -546,12 +546,14 @@
 
         boolean authorized = false;
         ParcelUuid uuid = ParcelUuid.fromString(deviceUuid);
+        BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
+
         // Bluez sends the UUID of the local service being accessed, _not_ the
         // remote service
         if (mBluetoothService.isEnabled() &&
                 (BluetoothUuid.isAudioSource(uuid) || BluetoothUuid.isAvrcpTarget(uuid)
-                        || BluetoothUuid.isAdvAudioDist(uuid))) {
-            BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
+                        || BluetoothUuid.isAdvAudioDist(uuid)) &&
+                        (a2dp.getNonDisconnectedSinks().size() == 0)) {
             BluetoothDevice device = mAdapter.getRemoteDevice(address);
             authorized = a2dp.getSinkPriority(device) > BluetoothA2dp.PRIORITY_OFF;
             if (authorized) {
diff --git a/core/java/android/server/search/SearchManagerService.java b/core/java/android/server/search/SearchManagerService.java
index 78ea2e3..6e8b7ee 100644
--- a/core/java/android/server/search/SearchManagerService.java
+++ b/core/java/android/server/search/SearchManagerService.java
@@ -21,6 +21,7 @@
 import android.app.ISearchManager;
 import android.app.ISearchManagerCallback;
 import android.app.SearchManager;
+import android.app.SearchableInfo;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
 import android.content.Context;
diff --git a/core/java/android/server/search/SearchableInfo.aidl b/core/java/android/server/search/SearchableInfo.aidl
deleted file mode 100644
index 9576c2b..0000000
--- a/core/java/android/server/search/SearchableInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2008, 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.
- */
-
-package android.server.search;
-
-parcelable SearchableInfo;
diff --git a/core/java/android/server/search/SearchableInfo.java b/core/java/android/server/search/SearchableInfo.java
deleted file mode 100644
index 69ef98c..0000000
--- a/core/java/android/server/search/SearchableInfo.java
+++ /dev/null
@@ -1,795 +0,0 @@
-/*
- * Copyright (C) 2007 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.
- */
-
-package android.server.search;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ProviderInfo;
-import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.InputType;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.Xml;
-import android.view.inputmethod.EditorInfo;
-
-import java.io.IOException;
-import java.util.HashMap;
-
-public final class SearchableInfo implements Parcelable {
-
-    // general debugging support
-    private static final boolean DBG = false;
-    private static final String LOG_TAG = "SearchableInfo";
-
-    // static strings used for XML lookups.
-    // TODO how should these be documented for the developer, in a more structured way than 
-    // the current long wordy javadoc in SearchManager.java ?
-    private static final String MD_LABEL_SEARCHABLE = "android.app.searchable";
-    private static final String MD_XML_ELEMENT_SEARCHABLE = "searchable";
-    private static final String MD_XML_ELEMENT_SEARCHABLE_ACTION_KEY = "actionkey";
-    
-    // flags in the searchMode attribute
-    private static final int SEARCH_MODE_BADGE_LABEL = 0x04;
-    private static final int SEARCH_MODE_BADGE_ICON = 0x08;
-    private static final int SEARCH_MODE_QUERY_REWRITE_FROM_DATA = 0x10;
-    private static final int SEARCH_MODE_QUERY_REWRITE_FROM_TEXT = 0x20;
-    
-    // true member variables - what we know about the searchability
-    private final int mLabelId;
-    private final ComponentName mSearchActivity;
-    private final int mHintId;
-    private final int mSearchMode;
-    private final int mIconId;
-    private final int mSearchButtonText;
-    private final int mSearchInputType;
-    private final int mSearchImeOptions;
-    private final boolean mIncludeInGlobalSearch;
-    private final boolean mQueryAfterZeroResults;
-    private final boolean mAutoUrlDetect;
-    private final String mSettingsDescription;
-    private final String mSuggestAuthority;
-    private final String mSuggestPath;
-    private final String mSuggestSelection;
-    private final String mSuggestIntentAction;
-    private final String mSuggestIntentData;
-    private final int mSuggestThreshold;
-    // Maps key codes to action key information. auto-boxing is not so bad here,
-    // since keycodes for the hard keys are < 127. For such values, Integer.valueOf()
-    // uses shared Integer objects.
-    // This is not final, to allow lazy initialization.
-    private HashMap<Integer,ActionKeyInfo> mActionKeys = null;
-    private final String mSuggestProviderPackage;
-    
-    // Flag values for Searchable_voiceSearchMode
-    private static int VOICE_SEARCH_SHOW_BUTTON = 1;
-    private static int VOICE_SEARCH_LAUNCH_WEB_SEARCH = 2;
-    private static int VOICE_SEARCH_LAUNCH_RECOGNIZER = 4;
-    private final int mVoiceSearchMode;
-    private final int mVoiceLanguageModeId;       // voiceLanguageModel
-    private final int mVoicePromptTextId;         // voicePromptText
-    private final int mVoiceLanguageId;           // voiceLanguage
-    private final int mVoiceMaxResults;           // voiceMaxResults
-
-    
-    /**
-     * Retrieve the authority for obtaining search suggestions.
-     * 
-     * @return Returns a string containing the suggestions authority.
-     */
-    public String getSuggestAuthority() {
-        return mSuggestAuthority;
-    }
-
-    /**
-     * Gets the name of the package where the suggestion provider lives,
-     * or {@code null}.
-     */
-    public String getSuggestPackage() {
-        return mSuggestProviderPackage;
-    }
-
-    /**
-     * Gets the component name of the searchable activity.
-     */
-    public ComponentName getSearchActivity() {
-        return mSearchActivity;
-    }
-
-    /**
-     * Checks whether the badge should be a text label.
-     */
-    public boolean useBadgeLabel() {
-        return 0 != (mSearchMode & SEARCH_MODE_BADGE_LABEL);
-    }
-
-    /**
-     * Checks whether the badge should be an icon.
-     */
-    public boolean useBadgeIcon() {
-        return (0 != (mSearchMode & SEARCH_MODE_BADGE_ICON)) && (mIconId != 0);
-    }
-
-    /**
-     * Checks whether the text in the query field should come from the suggestion intent data.
-     */
-    public boolean shouldRewriteQueryFromData() {
-        return 0 != (mSearchMode & SEARCH_MODE_QUERY_REWRITE_FROM_DATA);
-    }
-
-    /**
-     * Checks whether the text in the query field should come from the suggestion title.
-     */
-    public boolean shouldRewriteQueryFromText() {
-        return 0 != (mSearchMode & SEARCH_MODE_QUERY_REWRITE_FROM_TEXT);
-    }
-    
-    /**
-     * Gets the description to use for this source in system search settings, or null if
-     * none has been specified.
-     */
-    public String getSettingsDescription() {
-        return mSettingsDescription;
-    }
-
-    /**
-     * Retrieve the path for obtaining search suggestions.
-     * 
-     * @return Returns a string containing the suggestions path, or null if not provided.
-     */
-    public String getSuggestPath() {
-        return mSuggestPath;
-    }
-    
-    /**
-     * Retrieve the selection pattern for obtaining search suggestions.  This must
-     * include a single ? which will be used for the user-typed characters.
-     * 
-     * @return Returns a string containing the suggestions authority.
-     */
-    public String getSuggestSelection() {
-        return mSuggestSelection;
-    }
-    
-    /**
-     * Retrieve the (optional) intent action for use with these suggestions.  This is
-     * useful if all intents will have the same action (e.g. "android.intent.action.VIEW").
-     * 
-     * Can be overriden in any given suggestion via the AUTOSUGGEST_COLUMN_INTENT_ACTION column.
-     * 
-     * @return Returns a string containing the default intent action.
-     */
-    public String getSuggestIntentAction() {
-        return mSuggestIntentAction;
-    }
-    
-    /**
-     * Retrieve the (optional) intent data for use with these suggestions.  This is
-     * useful if all intents will have similar data URIs (e.g. "android.intent.action.VIEW"), 
-     * but you'll likely need to provide a specific ID as well via the column
-     * AUTOSUGGEST_COLUMN_INTENT_DATA_ID, which will be appended to the intent data URI.
-     * 
-     * Can be overriden in any given suggestion via the AUTOSUGGEST_COLUMN_INTENT_DATA column.
-     * 
-     * @return Returns a string containing the default intent data.
-     */
-    public String getSuggestIntentData() {
-        return mSuggestIntentData;
-    }
-    
-    /**
-     * Gets the suggestion threshold for use with these suggestions. 
-     * 
-     * @return The value of the <code>searchSuggestThreshold</code> attribute, 
-     *         or 0 if the attribute is not set.
-     */
-    public int getSuggestThreshold() {
-        return mSuggestThreshold;
-    }
-    
-    /**
-     * Get the context for the searchable activity.  
-     * 
-     * This is fairly expensive so do it on the original scan, or when an app is
-     * selected, but don't hang on to the result forever.
-     * 
-     * @param context You need to supply a context to start with
-     * @return Returns a context related to the searchable activity
-     */
-    public Context getActivityContext(Context context) {
-        return createActivityContext(context, mSearchActivity);
-    }
-    
-    /**
-     * Creates a context for another activity.
-     */
-    private static Context createActivityContext(Context context, ComponentName activity) {
-        Context theirContext = null;
-        try {
-            theirContext = context.createPackageContext(activity.getPackageName(), 0);
-        } catch (PackageManager.NameNotFoundException e) {
-            // unexpected, but we deal with this by null-checking theirContext
-        } catch (java.lang.SecurityException e) {
-            // unexpected, but we deal with this by null-checking theirContext
-        }
-        
-        return theirContext;
-    }
-    
-    /**
-     * Get the context for the suggestions provider.  
-     * 
-     * This is fairly expensive so do it on the original scan, or when an app is
-     * selected, but don't hang on to the result forever.
-     * 
-     * @param context You need to supply a context to start with
-     * @param activityContext If we can determine that the provider and the activity are the
-     * same, we'll just return this one.
-     * @return Returns a context related to the context provider
-     */
-    public Context getProviderContext(Context context, Context activityContext) {
-        Context theirContext = null;
-        if (mSearchActivity.getPackageName().equals(mSuggestProviderPackage)) {
-            return activityContext;
-        }
-        if (mSuggestProviderPackage != null)
-        try {
-            theirContext = context.createPackageContext(mSuggestProviderPackage, 0);
-        } catch (PackageManager.NameNotFoundException e) {
-            // unexpected, but we deal with this by null-checking theirContext
-        } catch (java.lang.SecurityException e) {
-            // unexpected, but we deal with this by null-checking theirContext
-        }
-        
-        return theirContext;
-    }
-    
-    /**
-     * Constructor
-     * 
-     * Given a ComponentName, get the searchability info
-     * and build a local copy of it.  Use the factory, not this.
-     * 
-     * @param activityContext runtime context for the activity that the searchable info is about.
-     * @param attr The attribute set we found in the XML file, contains the values that are used to
-     * construct the object.
-     * @param cName The component name of the searchable activity
-     * @throws IllegalArgumentException if the searchability info is invalid or insufficient
-     */
-    private SearchableInfo(Context activityContext, AttributeSet attr, final ComponentName cName) {
-        mSearchActivity = cName;
-        
-        TypedArray a = activityContext.obtainStyledAttributes(attr,
-                com.android.internal.R.styleable.Searchable);
-        mSearchMode = a.getInt(com.android.internal.R.styleable.Searchable_searchMode, 0);
-        mLabelId = a.getResourceId(com.android.internal.R.styleable.Searchable_label, 0);
-        mHintId = a.getResourceId(com.android.internal.R.styleable.Searchable_hint, 0);
-        mIconId = a.getResourceId(com.android.internal.R.styleable.Searchable_icon, 0);
-        mSearchButtonText = a.getResourceId(
-                com.android.internal.R.styleable.Searchable_searchButtonText, 0);
-        mSearchInputType = a.getInt(com.android.internal.R.styleable.Searchable_inputType, 
-                InputType.TYPE_CLASS_TEXT |
-                InputType.TYPE_TEXT_VARIATION_NORMAL);
-        mSearchImeOptions = a.getInt(com.android.internal.R.styleable.Searchable_imeOptions, 
-                EditorInfo.IME_ACTION_SEARCH);
-        mIncludeInGlobalSearch = a.getBoolean(
-                com.android.internal.R.styleable.Searchable_includeInGlobalSearch, false);
-        mQueryAfterZeroResults = a.getBoolean(
-                com.android.internal.R.styleable.Searchable_queryAfterZeroResults, false);
-        mAutoUrlDetect = a.getBoolean(
-                com.android.internal.R.styleable.Searchable_autoUrlDetect, false);
-
-        mSettingsDescription = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSettingsDescription);
-        mSuggestAuthority = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSuggestAuthority);
-        mSuggestPath = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSuggestPath);
-        mSuggestSelection = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSuggestSelection);
-        mSuggestIntentAction = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSuggestIntentAction);
-        mSuggestIntentData = a.getString(
-                com.android.internal.R.styleable.Searchable_searchSuggestIntentData);
-        mSuggestThreshold = a.getInt(
-                com.android.internal.R.styleable.Searchable_searchSuggestThreshold, 0);
-
-        mVoiceSearchMode = 
-            a.getInt(com.android.internal.R.styleable.Searchable_voiceSearchMode, 0);
-        // TODO this didn't work - came back zero from YouTube
-        mVoiceLanguageModeId = 
-            a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguageModel, 0);
-        mVoicePromptTextId = 
-            a.getResourceId(com.android.internal.R.styleable.Searchable_voicePromptText, 0);
-        mVoiceLanguageId = 
-            a.getResourceId(com.android.internal.R.styleable.Searchable_voiceLanguage, 0);
-        mVoiceMaxResults = 
-            a.getInt(com.android.internal.R.styleable.Searchable_voiceMaxResults, 0);
-
-        a.recycle();
-
-        // get package info for suggestions provider (if any)
-        String suggestProviderPackage = null;
-        if (mSuggestAuthority != null) {
-            PackageManager pm = activityContext.getPackageManager();
-            ProviderInfo pi = pm.resolveContentProvider(mSuggestAuthority, 0);
-            if (pi != null) {
-                suggestProviderPackage = pi.packageName;
-            }
-        }
-        mSuggestProviderPackage = suggestProviderPackage;
-
-        // for now, implement some form of rules - minimal data
-        if (mLabelId == 0) {
-            throw new IllegalArgumentException("Search label must be a resource reference.");
-        }
-    }
-    
-    /**
-     * Private class used to hold the "action key" configuration
-     */
-    public static class ActionKeyInfo implements Parcelable {
-        
-        private final int mKeyCode;
-        private final String mQueryActionMsg;
-        private final String mSuggestActionMsg;
-        private final String mSuggestActionMsgColumn;
-        
-        /**
-         * Create one object using attributeset as input data.
-         * @param activityContext runtime context of the activity that the action key information
-         *        is about.
-         * @param attr The attribute set we found in the XML file, contains the values that are used to
-         * construct the object.
-         * @throws IllegalArgumentException if the action key configuration is invalid
-         */
-        public ActionKeyInfo(Context activityContext, AttributeSet attr) {
-            TypedArray a = activityContext.obtainStyledAttributes(attr,
-                    com.android.internal.R.styleable.SearchableActionKey);
-
-            mKeyCode = a.getInt(
-                    com.android.internal.R.styleable.SearchableActionKey_keycode, 0);
-            mQueryActionMsg = a.getString(
-                    com.android.internal.R.styleable.SearchableActionKey_queryActionMsg);
-            mSuggestActionMsg = a.getString(
-                    com.android.internal.R.styleable.SearchableActionKey_suggestActionMsg);
-            mSuggestActionMsgColumn = a.getString(
-                    com.android.internal.R.styleable.SearchableActionKey_suggestActionMsgColumn);
-            a.recycle();
-
-            // sanity check.
-            if (mKeyCode == 0) {
-                throw new IllegalArgumentException("No keycode.");
-            } else if ((mQueryActionMsg == null) && 
-                    (mSuggestActionMsg == null) && 
-                    (mSuggestActionMsgColumn == null)) {
-                throw new IllegalArgumentException("No message information.");
-            }
-        }
-
-        /**
-         * Instantiate a new ActionKeyInfo from the data in a Parcel that was
-         * previously written with {@link #writeToParcel(Parcel, int)}.
-         *
-         * @param in The Parcel containing the previously written ActionKeyInfo,
-         * positioned at the location in the buffer where it was written.
-         */
-        public ActionKeyInfo(Parcel in) {
-            mKeyCode = in.readInt();
-            mQueryActionMsg = in.readString();
-            mSuggestActionMsg = in.readString();
-            mSuggestActionMsgColumn = in.readString();
-        }
-
-        public int getKeyCode() {
-            return mKeyCode;
-        }
-
-        public String getQueryActionMsg() {
-            return mQueryActionMsg;
-        }
-
-        public String getSuggestActionMsg() {
-            return mSuggestActionMsg;
-        }
-
-        public String getSuggestActionMsgColumn() {
-            return mSuggestActionMsgColumn;
-        }
-
-        public int describeContents() {
-            return 0;
-        }
-
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(mKeyCode);
-            dest.writeString(mQueryActionMsg);
-            dest.writeString(mSuggestActionMsg);
-            dest.writeString(mSuggestActionMsgColumn);
-        }
-    }
-    
-    /**
-     * If any action keys were defined for this searchable activity, look up and return.
-     * 
-     * @param keyCode The key that was pressed
-     * @return Returns the ActionKeyInfo record, or null if none defined
-     */
-    public ActionKeyInfo findActionKey(int keyCode) {
-        if (mActionKeys == null) {
-            return null;
-        }
-        return mActionKeys.get(keyCode);
-    }
-
-    private void addActionKey(ActionKeyInfo keyInfo) {
-        if (mActionKeys == null) {
-            mActionKeys = new HashMap<Integer,ActionKeyInfo>();
-        }
-        mActionKeys.put(keyInfo.getKeyCode(), keyInfo);
-    }
-
-    /**
-     * Gets search information for the given activity.
-     *
-     * @param context Context to use for reading activity resources.
-     * @param activityInfo Activity to get search information from.
-     * @return Search information about the given activity, or {@code null} if
-     *         the activity has no or invalid searchability meta-data.
-     */
-    public static SearchableInfo getActivityMetaData(Context context, ActivityInfo activityInfo) {
-        // for each component, try to find metadata
-        XmlResourceParser xml = 
-                activityInfo.loadXmlMetaData(context.getPackageManager(), MD_LABEL_SEARCHABLE);
-        if (xml == null) {
-            return null;
-        }
-        ComponentName cName = new ComponentName(activityInfo.packageName, activityInfo.name);
-        
-        SearchableInfo searchable = getActivityMetaData(context, xml, cName);
-        xml.close();
-        
-        if (DBG) {
-            if (searchable != null) {
-                Log.d(LOG_TAG, "Checked " + activityInfo.name
-                        + ",label=" + searchable.getLabelId()
-                        + ",icon=" + searchable.getIconId()
-                        + ",suggestAuthority=" + searchable.getSuggestAuthority()
-                        + ",target=" + searchable.getSearchActivity().getClassName()
-                        + ",global=" + searchable.shouldIncludeInGlobalSearch()
-                        + ",settingsDescription=" + searchable.getSettingsDescription()
-                        + ",threshold=" + searchable.getSuggestThreshold());
-            } else {
-                Log.d(LOG_TAG, "Checked " + activityInfo.name + ", no searchable meta-data");
-            }
-        }
-        return searchable;
-    }
-    
-    /**
-     * Get the metadata for a given activity
-     * 
-     * @param context runtime context
-     * @param xml XML parser for reading attributes
-     * @param cName The component name of the searchable activity
-     * 
-     * @result A completely constructed SearchableInfo, or null if insufficient XML data for it
-     */
-    private static SearchableInfo getActivityMetaData(Context context, XmlPullParser xml,
-            final ComponentName cName)  {
-        SearchableInfo result = null;
-        Context activityContext = createActivityContext(context, cName);
-        
-        // in order to use the attributes mechanism, we have to walk the parser
-        // forward through the file until it's reading the tag of interest.
-        try {
-            int tagType = xml.next();
-            while (tagType != XmlPullParser.END_DOCUMENT) {
-                if (tagType == XmlPullParser.START_TAG) {
-                    if (xml.getName().equals(MD_XML_ELEMENT_SEARCHABLE)) {
-                        AttributeSet attr = Xml.asAttributeSet(xml);
-                        if (attr != null) {
-                            try {
-                                result = new SearchableInfo(activityContext, attr, cName);
-                            } catch (IllegalArgumentException ex) {
-                                Log.w(LOG_TAG, "Invalid searchable metadata for " +
-                                        cName.flattenToShortString() + ": " + ex.getMessage());
-                                return null;
-                            }
-                        }
-                    } else if (xml.getName().equals(MD_XML_ELEMENT_SEARCHABLE_ACTION_KEY)) {
-                        if (result == null) {
-                            // Can't process an embedded element if we haven't seen the enclosing
-                            return null;
-                        }
-                        AttributeSet attr = Xml.asAttributeSet(xml);
-                        if (attr != null) {
-                            try {
-                                result.addActionKey(new ActionKeyInfo(activityContext, attr));
-                            } catch (IllegalArgumentException ex) {
-                                Log.w(LOG_TAG, "Invalid action key for " +
-                                        cName.flattenToShortString() + ": " + ex.getMessage());
-                                return null;
-                            }
-                        }
-                    }
-                }
-                tagType = xml.next();
-            }
-        } catch (XmlPullParserException e) {
-            Log.w(LOG_TAG, "Reading searchable metadata for " + cName.flattenToShortString(), e);
-            return null;
-        } catch (IOException e) {
-            Log.w(LOG_TAG, "Reading searchable metadata for " + cName.flattenToShortString(), e);
-            return null;
-        }
-        
-        return result;
-    }
-
-    /**
-     * Return the "label" (user-visible name) of this searchable context.  This must be 
-     * accessed using the target (searchable) Activity's resources, not simply the context of the
-     * caller.
-     * 
-     * @return Returns the resource Id
-     */
-    public int getLabelId() {
-        return mLabelId;
-    }
-    
-    /**
-     * Return the resource Id of the hint text.  This must be 
-     * accessed using the target (searchable) Activity's resources, not simply the context of the
-     * caller.
-     * 
-     * @return Returns the resource Id, or 0 if not specified by this package.
-     */
-    public int getHintId() {
-        return mHintId;
-    }
-    
-    /**
-     * Return the icon Id specified by the Searchable_icon meta-data entry.  This must be 
-     * accessed using the target (searchable) Activity's resources, not simply the context of the
-     * caller.
-     * 
-     * @return Returns the resource id.
-     */
-    public int getIconId() {
-        return mIconId;
-    }
-    
-    /**
-     * @return true if android:voiceSearchMode="showVoiceSearchButton"
-     */
-    public boolean getVoiceSearchEnabled() {
-        return 0 != (mVoiceSearchMode & VOICE_SEARCH_SHOW_BUTTON);
-    }
-    
-    /**
-     * @return true if android:voiceSearchMode="launchWebSearch"
-     */
-    public boolean getVoiceSearchLaunchWebSearch() {
-        return 0 != (mVoiceSearchMode & VOICE_SEARCH_LAUNCH_WEB_SEARCH);
-    }
-    
-    /**
-     * @return true if android:voiceSearchMode="launchRecognizer"
-     */
-    public boolean getVoiceSearchLaunchRecognizer() {
-        return 0 != (mVoiceSearchMode & VOICE_SEARCH_LAUNCH_RECOGNIZER);
-    }
-    
-    /**
-     * @return the resource Id of the language model string, if specified in the searchable
-     * activity's metadata, or 0 if not specified.  
-     */
-    public int getVoiceLanguageModeId() {
-        return mVoiceLanguageModeId;
-    }
-    
-    /**
-     * @return the resource Id of the voice prompt text string, if specified in the searchable
-     * activity's metadata, or 0 if not specified.  
-     */
-    public int getVoicePromptTextId() {
-        return mVoicePromptTextId;
-    }
-    
-    /**
-     * @return the resource Id of the spoken langauge, if specified in the searchable
-     * activity's metadata, or 0 if not specified.  
-     */
-    public int getVoiceLanguageId() {
-        return mVoiceLanguageId;
-    }
-    
-    /**
-     * @return the max results count, if specified in the searchable
-     * activity's metadata, or 0 if not specified.  
-     */
-    public int getVoiceMaxResults() {
-        return mVoiceMaxResults;
-    }
-    
-    /**
-     * Return the resource Id of replacement text for the "Search" button.
-     * 
-     * @return Returns the resource Id, or 0 if not specified by this package.
-     */
-    public int getSearchButtonText() {
-        return mSearchButtonText;
-    }
-    
-    /**
-     * Return the input type as specified in the searchable attributes.  This will default to
-     * InputType.TYPE_CLASS_TEXT if not specified (which is appropriate for free text input).
-     * 
-     * @return the input type
-     */
-    public int getInputType() {
-        return mSearchInputType;
-    }
-    
-    /**
-     * Return the input method options specified in the searchable attributes.
-     * This will default to EditorInfo.ACTION_SEARCH if not specified (which is
-     * appropriate for a search box).
-     * 
-     * @return the input type
-     */
-    public int getImeOptions() {
-        return mSearchImeOptions;
-    }
-    
-    /**
-     * Checks whether the searchable is exported.
-     *
-     * @return The value of the <code>exported</code> attribute,
-     *         or <code>false</code> if the attribute is not set.
-     */
-    public boolean shouldIncludeInGlobalSearch() {
-        return mIncludeInGlobalSearch;
-    }
-
-    /**
-     * Checks whether this searchable activity should be invoked after a query returned zero
-     * results.
-     *
-     * @return The value of the <code>queryAfterZeroResults</code> attribute,
-     *         or <code>false</code> if the attribute is not set.
-     */
-    public boolean queryAfterZeroResults() {
-        return mQueryAfterZeroResults;
-    }
-
-    /**
-     * Checks whether this searchable activity has auto URL detect turned on.
-     *
-     * @return The value of the <code>autoUrlDetect</code> attribute,
-     *         or <code>false</code> if the attribute is not set.
-     */
-    public boolean autoUrlDetect() {
-        return mAutoUrlDetect;
-    }
-
-    /**
-     * Support for parcelable and aidl operations.
-     */
-    public static final Parcelable.Creator<SearchableInfo> CREATOR
-    = new Parcelable.Creator<SearchableInfo>() {
-        public SearchableInfo createFromParcel(Parcel in) {
-            return new SearchableInfo(in);
-        }
-
-        public SearchableInfo[] newArray(int size) {
-            return new SearchableInfo[size];
-        }
-    };
-
-    /**
-     * Instantiate a new SearchableInfo from the data in a Parcel that was
-     * previously written with {@link #writeToParcel(Parcel, int)}.
-     *
-     * @param in The Parcel containing the previously written SearchableInfo,
-     * positioned at the location in the buffer where it was written.
-     */
-    public SearchableInfo(Parcel in) {
-        mLabelId = in.readInt();
-        mSearchActivity = ComponentName.readFromParcel(in);
-        mHintId = in.readInt();
-        mSearchMode = in.readInt();
-        mIconId = in.readInt();
-        mSearchButtonText = in.readInt();
-        mSearchInputType = in.readInt();
-        mSearchImeOptions = in.readInt();
-        mIncludeInGlobalSearch = in.readInt() != 0;
-        mQueryAfterZeroResults = in.readInt() != 0;
-        mAutoUrlDetect = in.readInt() != 0;
-        
-        mSettingsDescription = in.readString();
-        mSuggestAuthority = in.readString();
-        mSuggestPath = in.readString();
-        mSuggestSelection = in.readString();
-        mSuggestIntentAction = in.readString();
-        mSuggestIntentData = in.readString();
-        mSuggestThreshold = in.readInt();
-
-        for (int count = in.readInt(); count > 0; count--) {
-            addActionKey(new ActionKeyInfo(in));
-        }
-
-        mSuggestProviderPackage = in.readString();
-        
-        mVoiceSearchMode = in.readInt();
-        mVoiceLanguageModeId = in.readInt();
-        mVoicePromptTextId = in.readInt();
-        mVoiceLanguageId = in.readInt();
-        mVoiceMaxResults = in.readInt();
-    }
-
-    public int describeContents() {
-        return 0;
-    }
-
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mLabelId);
-        mSearchActivity.writeToParcel(dest, flags);
-        dest.writeInt(mHintId);
-        dest.writeInt(mSearchMode);
-        dest.writeInt(mIconId);
-        dest.writeInt(mSearchButtonText);
-        dest.writeInt(mSearchInputType);
-        dest.writeInt(mSearchImeOptions);
-        dest.writeInt(mIncludeInGlobalSearch ? 1 : 0);
-        dest.writeInt(mQueryAfterZeroResults ? 1 : 0);
-        dest.writeInt(mAutoUrlDetect ? 1 : 0);
-        
-        dest.writeString(mSettingsDescription);
-        dest.writeString(mSuggestAuthority);
-        dest.writeString(mSuggestPath);
-        dest.writeString(mSuggestSelection);
-        dest.writeString(mSuggestIntentAction);
-        dest.writeString(mSuggestIntentData);
-        dest.writeInt(mSuggestThreshold);
-
-        if (mActionKeys == null) {
-            dest.writeInt(0);
-        } else {
-            dest.writeInt(mActionKeys.size());
-            for (ActionKeyInfo actionKey : mActionKeys.values()) {
-                actionKey.writeToParcel(dest, flags);
-            }
-        }
-
-        dest.writeString(mSuggestProviderPackage);
-
-        dest.writeInt(mVoiceSearchMode);
-        dest.writeInt(mVoiceLanguageModeId);
-        dest.writeInt(mVoicePromptTextId);
-        dest.writeInt(mVoiceLanguageId);
-        dest.writeInt(mVoiceMaxResults);
-    }
-}
diff --git a/core/java/android/server/search/Searchables.java b/core/java/android/server/search/Searchables.java
index c615957..cbb63a5 100644
--- a/core/java/android/server/search/Searchables.java
+++ b/core/java/android/server/search/Searchables.java
@@ -19,6 +19,7 @@
 import com.android.internal.app.ResolverActivity;
 
 import android.app.SearchManager;
+import android.app.SearchableInfo;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
diff --git a/core/java/android/text/method/ArrowKeyMovementMethod.java b/core/java/android/text/method/ArrowKeyMovementMethod.java
index ab33cb3..789172f 100644
--- a/core/java/android/text/method/ArrowKeyMovementMethod.java
+++ b/core/java/android/text/method/ArrowKeyMovementMethod.java
@@ -54,7 +54,7 @@
                 Selection.setSelection(buffer, 0);
                 return true;
             } else {
-                return Selection.moveUp(buffer, layout); 
+                return Selection.moveUp(buffer, layout);
             }
         }
     }
@@ -80,7 +80,7 @@
                 Selection.setSelection(buffer, buffer.length());
                 return true;
             } else {
-                return Selection.moveDown(buffer, layout); 
+                return Selection.moveDown(buffer, layout);
             }
         }
     }
@@ -133,6 +133,35 @@
         }
     }
 
+    private int getOffset(int x, int y, TextView widget){
+      // Converts the absolute X,Y coordinates to the character offset for the
+      // character whose position is closest to the specified
+      // horizontal position.
+      x -= widget.getTotalPaddingLeft();
+      y -= widget.getTotalPaddingTop();
+
+      // Clamp the position to inside of the view.
+      if (x < 0) {
+          x = 0;
+      } else if (x >= (widget.getWidth()-widget.getTotalPaddingRight())) {
+          x = widget.getWidth()-widget.getTotalPaddingRight() - 1;
+      }
+      if (y < 0) {
+          y = 0;
+      } else if (y >= (widget.getHeight()-widget.getTotalPaddingBottom())) {
+          y = widget.getHeight()-widget.getTotalPaddingBottom() - 1;
+      }
+
+      x += widget.getScrollX();
+      y += widget.getScrollY();
+
+      Layout layout = widget.getLayout();
+      int line = layout.getLineForVertical(y);
+
+      int offset = layout.getOffsetForHorizontal(line, x);
+      return offset;
+    }
+
     public boolean onKeyDown(TextView widget, Spannable buffer, int keyCode, KeyEvent event) {
         if (executeDown(widget, buffer, keyCode)) {
             MetaKeyKeyListener.adjustMetaAfterKeypress(buffer);
@@ -196,12 +225,12 @@
         }
         return false;
     }
-    
+
     public boolean onTrackballEvent(TextView widget, Spannable text,
             MotionEvent event) {
         return false;
     }
-    
+
     public boolean onTouchEvent(TextView widget, Spannable buffer,
                                 MotionEvent event) {
         int initialScrollX = -1, initialScrollY = -1;
@@ -209,11 +238,63 @@
             initialScrollX = Touch.getInitialScrollX(widget, buffer);
             initialScrollY = Touch.getInitialScrollY(widget, buffer);
         }
-        
+
         boolean handled = Touch.onTouchEvent(widget, buffer, event);
 
         if (widget.isFocused() && !widget.didTouchFocusSelect()) {
-            if (event.getAction() == MotionEvent.ACTION_UP) {
+            if (event.getAction() == MotionEvent.ACTION_DOWN) {
+              boolean cap = (MetaKeyKeyListener.getMetaState(buffer,
+                              KeyEvent.META_SHIFT_ON) == 1) ||
+                            (MetaKeyKeyListener.getMetaState(buffer,
+                              MetaKeyKeyListener.META_SELECTING) != 0);
+              if (cap) {
+                  int x = (int) event.getX();
+                  int y = (int) event.getY();
+                  int offset = getOffset(x, y, widget);
+
+                  buffer.setSpan(LAST_TAP_DOWN, offset, offset,
+                                 Spannable.SPAN_POINT_POINT);
+              }
+            } else if (event.getAction() == MotionEvent.ACTION_MOVE ) {
+              boolean cap = (MetaKeyKeyListener.getMetaState(buffer,
+                              KeyEvent.META_SHIFT_ON) == 1) ||
+                            (MetaKeyKeyListener.getMetaState(buffer,
+                              MetaKeyKeyListener.META_SELECTING) != 0);
+
+              if (cap) {
+                // Update selection as we're moving the selection area.
+
+                // Get the current touch position
+                int x = (int) event.getX();
+                int y = (int) event.getY();
+                int offset = getOffset(x, y, widget);
+
+                // Get the last down touch position (the position at which the
+                // user started the selection)
+                int lastDownOffset = buffer.getSpanStart(LAST_TAP_DOWN);
+
+                // Compute the selection boundries
+                int spanstart;
+                int spanend;
+                if (offset >= lastDownOffset) {
+                  // expand to from word start of the original tap to new word
+                  // end, since we are selecting "forwards"
+                  spanstart = findWordStart(buffer, lastDownOffset);
+                  spanend = findWordEnd(buffer, offset);
+                } else {
+                  // Expand to from new word start to word end of the original
+                  // tap since we are selecting "backwards".
+                  // The spanend will always need to be associated with the touch
+                  // up position, so that refining the selection with the
+                  // trackball will work as expected.
+                  spanstart = findWordEnd(buffer, lastDownOffset);
+                  spanend = findWordStart(buffer, offset);
+                }
+
+                Selection.setSelection(buffer, spanstart, spanend);
+                return true;
+              }
+            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                 // If we have scrolled, then the up shouldn't move the cursor,
                 // but we do need to make sure the cursor is still visible at
                 // the current scroll offset to avoid the scroll jumping later
@@ -223,35 +304,13 @@
                     widget.moveCursorToVisibleOffset();
                     return true;
                 }
-                
+
                 int x = (int) event.getX();
                 int y = (int) event.getY();
-
-                x -= widget.getTotalPaddingLeft();
-                y -= widget.getTotalPaddingTop();
-
-                // Clamp the position to inside of the view.
-                if (x < 0) {
-                    x = 0;
-                } else if (x >= (widget.getWidth()-widget.getTotalPaddingRight())) {
-                    x = widget.getWidth()-widget.getTotalPaddingRight() - 1;
-                }
-                if (y < 0) {
-                    y = 0;
-                } else if (y >= (widget.getHeight()-widget.getTotalPaddingBottom())) {
-                    y = widget.getHeight()-widget.getTotalPaddingBottom() - 1;
-                }
-                
-                x += widget.getScrollX();
-                y += widget.getScrollY();
-
-                Layout layout = widget.getLayout();
-                int line = layout.getLineForVertical(y);
-                
-                int off = layout.getOffsetForHorizontal(line, x);
+                int off = getOffset(x, y, widget);
 
                 // XXX should do the same adjust for x as we do for the line.
-                
+
                 boolean cap = (MetaKeyKeyListener.getMetaState(buffer,
                                 KeyEvent.META_SHIFT_ON) == 1) ||
                               (MetaKeyKeyListener.getMetaState(buffer,
@@ -278,7 +337,7 @@
                 }
 
                 if (cap) {
-                    Selection.extendSelection(buffer, off);
+                    buffer.removeSpan(LAST_TAP_DOWN);
                 } else if (doubletap) {
                     Selection.setSelection(buffer,
                                            findWordStart(buffer, off),
@@ -395,5 +454,7 @@
         return sInstance;
     }
 
+
+    private static final Object LAST_TAP_DOWN = new Object();
     private static ArrowKeyMovementMethod sInstance;
 }
diff --git a/core/java/android/webkit/FileLoader.java b/core/java/android/webkit/FileLoader.java
index 085f1f4..974ccbf 100644
--- a/core/java/android/webkit/FileLoader.java
+++ b/core/java/android/webkit/FileLoader.java
@@ -23,9 +23,12 @@
 import android.net.http.EventHandler;
 import android.net.http.Headers;
 import android.os.Environment;
+import android.util.Log;
+import android.util.TypedValue;
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.lang.reflect.Field;
 
 /**
  * This class is a concrete implementation of StreamLoader that uses a
@@ -35,10 +38,19 @@
 class FileLoader extends StreamLoader {
 
     private String mPath;  // Full path to the file to load
-    private Context mContext;  // Application context, used for asset loads
-    private boolean mIsAsset;  // Indicates if the load is an asset or not
+    private Context mContext;  // Application context, used for asset/res loads
+    private int mType;  // Indicates the type of the load
     private boolean mAllowFileAccess; // Allow/block file system access
 
+    // used for files under asset directory
+    static final int TYPE_ASSET = 1;
+    // used for files under res directory
+    static final int TYPE_RES = 2;
+    // generic file
+    static final int TYPE_FILE = 3;
+
+    private static final String LOGTAG = "webkit";
+
     /**
      * Construct a FileLoader with the file URL specified as the content
      * source.
@@ -51,19 +63,24 @@
      *                        on the file system.
      */
     FileLoader(String url, LoadListener loadListener, Context context,
-            boolean asset, boolean allowFileAccess) {
+            int type, boolean allowFileAccess) {
         super(loadListener);
-        mIsAsset = asset;
+        mType = type;
         mContext = context;
         mAllowFileAccess = allowFileAccess;
 
         // clean the Url
         int index = url.indexOf('?');
-        if (mIsAsset) {
+        if (mType == TYPE_ASSET) {
             mPath = index > 0 ? URLUtil.stripAnchor(
                     url.substring(URLUtil.ASSET_BASE.length(), index)) :
                     URLUtil.stripAnchor(url.substring(
                             URLUtil.ASSET_BASE.length()));
+        } else if (mType == TYPE_RES) {
+            mPath = index > 0 ? URLUtil.stripAnchor(
+                    url.substring(URLUtil.RESOURCE_BASE.length(), index)) :
+                    URLUtil.stripAnchor(url.substring(
+                            URLUtil.RESOURCE_BASE.length()));
         } else {
             mPath = index > 0 ? URLUtil.stripAnchor(
                     url.substring(URLUtil.FILE_BASE.length(), index)) :
@@ -84,13 +101,69 @@
     @Override
     protected boolean setupStreamAndSendStatus() {
         try {
-            if (mIsAsset) {
+            if (mType == TYPE_ASSET) {
                 try {
                     mDataStream = mContext.getAssets().open(mPath);
                 } catch (java.io.FileNotFoundException ex) {
                     // try the rest files included in the package
                     mDataStream = mContext.getAssets().openNonAsset(mPath);
                 }
+            } else if (mType == TYPE_RES) {
+                // get the resource id from the path. e.g. for the path like
+                // drawable/foo.png, the id is located at field "foo" of class
+                // "<package>.R$drawable"
+                if (mPath == null || mPath.length() == 0) {
+                    Log.e(LOGTAG, "Need a path to resolve the res file");
+                    mHandler.error(EventHandler.FILE_ERROR, mContext
+                            .getString(R.string.httpErrorFileNotFound));
+                    return false;
+
+                }
+                int slash = mPath.indexOf('/');
+                int dot = mPath.indexOf('.', slash);
+                if (slash == -1 || dot == -1) {
+                    Log.e(LOGTAG, "Incorrect res path: " + mPath);
+                    mHandler.error(EventHandler.FILE_ERROR, mContext
+                            .getString(R.string.httpErrorFileNotFound));
+                    return false;
+                }
+                String subClassName = mPath.substring(0, slash);
+                String fieldName = mPath.substring(slash + 1, dot);
+                String errorMsg = null;
+                try {
+                    final Class<?> d = mContext.getApplicationContext()
+                            .getClassLoader().loadClass(
+                                    mContext.getPackageName() + ".R$"
+                                            + subClassName);
+                    final Field field = d.getField(fieldName);
+                    final int id = field.getInt(null);
+                    TypedValue value = new TypedValue();
+                    mContext.getResources().getValue(id, value, true);
+                    if (value.type == TypedValue.TYPE_STRING) {
+                        mDataStream = mContext.getAssets().openNonAsset(
+                                value.assetCookie, value.string.toString(),
+                                AssetManager.ACCESS_STREAMING);
+                    } else {
+                        errorMsg = "Only support TYPE_STRING for the res files";
+                    }
+                } catch (ClassNotFoundException e) {
+                    errorMsg = "Can't find class:  "
+                            + mContext.getPackageName() + ".R$" + subClassName;
+                } catch (SecurityException e) {
+                    errorMsg = "Caught SecurityException: " + e;
+                } catch (NoSuchFieldException e) {
+                    errorMsg = "Can't find field:  " + fieldName + " in "
+                            + mContext.getPackageName() + ".R$" + subClassName;
+                } catch (IllegalArgumentException e) {
+                    errorMsg = "Caught IllegalArgumentException: " + e;
+                } catch (IllegalAccessException e) {
+                    errorMsg = "Caught IllegalAccessException: " + e;
+                }
+                if (errorMsg != null) {
+                    mHandler.error(EventHandler.FILE_ERROR, mContext
+                            .getString(R.string.httpErrorFileNotFound));
+                    return false;
+                }
             } else {
                 if (!mAllowFileAccess) {
                     mHandler.error(EventHandler.FILE_ERROR,
@@ -131,8 +204,8 @@
      *                        file system.
      */
     public static void requestUrl(String url, LoadListener loadListener,
-            Context context, boolean asset, boolean allowFileAccess) {
-        FileLoader loader = new FileLoader(url, loadListener, context, asset,
+            Context context, int type, boolean allowFileAccess) {
+        FileLoader loader = new FileLoader(url, loadListener, context, type,
                 allowFileAccess);
         loader.load();
     }
diff --git a/core/java/android/webkit/FrameLoader.java b/core/java/android/webkit/FrameLoader.java
index c3dac6e..51f60c3 100644
--- a/core/java/android/webkit/FrameLoader.java
+++ b/core/java/android/webkit/FrameLoader.java
@@ -142,11 +142,15 @@
         }
         if (URLUtil.isAssetUrl(url)) {
             FileLoader.requestUrl(url, loadListener, loadListener.getContext(),
-                    true, settings.getAllowFileAccess());
+                    FileLoader.TYPE_ASSET, true);
+            return true;
+        } else if (URLUtil.isResourceUrl(url)) {
+            FileLoader.requestUrl(url, loadListener, loadListener.getContext(),
+                    FileLoader.TYPE_RES, true);
             return true;
         } else if (URLUtil.isFileUrl(url)) {
             FileLoader.requestUrl(url, loadListener, loadListener.getContext(),
-                    false, settings.getAllowFileAccess());
+                    FileLoader.TYPE_FILE, settings.getAllowFileAccess());
             return true;
         } else if (URLUtil.isContentUrl(url)) {
             // Send the raw url to the ContentLoader because it will do a
diff --git a/core/java/android/webkit/Network.java b/core/java/android/webkit/Network.java
index b53e404..598f20d 100644
--- a/core/java/android/webkit/Network.java
+++ b/core/java/android/webkit/Network.java
@@ -163,10 +163,10 @@
             return false;
         }
 
-        // asset, file system or data stream are handled in the other code path.
-        // This only handles network request.
-        if (URLUtil.isAssetUrl(url) || URLUtil.isFileUrl(url) ||
-                URLUtil.isDataUrl(url)) {
+        // asset, res, file system or data stream are handled in the other code
+        // path. This only handles network request.
+        if (URLUtil.isAssetUrl(url) || URLUtil.isResourceUrl(url)
+                || URLUtil.isFileUrl(url) || URLUtil.isDataUrl(url)) {
             return false;
         }
 
diff --git a/core/java/android/webkit/URLUtil.java b/core/java/android/webkit/URLUtil.java
index 211e5e4..7c5f2b0 100644
--- a/core/java/android/webkit/URLUtil.java
+++ b/core/java/android/webkit/URLUtil.java
@@ -28,8 +28,14 @@
 public final class URLUtil {
 
     private static final String LOGTAG = "webkit";
-    
+
+    // to refer to bar.png under your package's asset/foo/ directory, use
+    // "file:///android_asset/foo/bar.png".
     static final String ASSET_BASE = "file:///android_asset/";
+    // to refer to bar.png under your package's res/drawable/ directory, use
+    // "file:///android_res/drawable/bar.png". Use "drawable" to refer to
+    // "drawable-hdpi" directory as well.
+    static final String RESOURCE_BASE = "file:///android_res/";
     static final String FILE_BASE = "file://";
     static final String PROXY_BASE = "file:///cookieless_proxy/";
 
@@ -166,7 +172,15 @@
     public static boolean isAssetUrl(String url) {
         return (null != url) && url.startsWith(ASSET_BASE);
     }
-    
+
+    /**
+     * @return True iff the url is a resource file.
+     * @hide
+     */
+    public static boolean isResourceUrl(String url) {
+        return (null != url) && url.startsWith(RESOURCE_BASE);
+    }
+
     /**
      * @return True iff the url is an proxy url to allow cookieless network 
      * requests from a file url.
@@ -251,6 +265,7 @@
         }
 
         return (isAssetUrl(url) ||
+                isResourceUrl(url) ||
                 isFileUrl(url) ||
                 isAboutUrl(url) ||
                 isHttpUrl(url) ||
diff --git a/core/java/android/webkit/WebTextView.java b/core/java/android/webkit/WebTextView.java
index f04b04f..924398e 100644
--- a/core/java/android/webkit/WebTextView.java
+++ b/core/java/android/webkit/WebTextView.java
@@ -338,6 +338,7 @@
             super.onEditorAction(actionCode);
             break;
         case EditorInfo.IME_ACTION_GO:
+        case EditorInfo.IME_ACTION_SEARCH:
             // Send an enter and hide the soft keyboard
             InputMethodManager.getInstance(mContext)
                     .hideSoftInputFromWindow(getWindowToken(), 0);
@@ -598,7 +599,8 @@
      */
     public void setAdapterCustom(AutoCompleteAdapter adapter) {
         if (adapter != null) {
-            setInputType(EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE);
+            setInputType(getInputType()
+                    | EditorInfo.TYPE_TEXT_FLAG_AUTO_COMPLETE);
             adapter.setTextView(this);
         }
         super.setAdapter(adapter);
@@ -739,7 +741,7 @@
         mFromSetInputType = false;
     }
 
-    /* package */ void setMaxLength(int maxLength) {
+    private void setMaxLength(int maxLength) {
         mMaxLength = maxLength;
         if (-1 == maxLength) {
             setFilters(NO_FILTERS);
@@ -804,42 +806,6 @@
     }
 
     /**
-     * Set whether this is a single-line textfield or a multi-line textarea.
-     * Textfields scroll horizontally, and do not handle the enter key.
-     * Textareas behave oppositely.
-     * Do NOT call this after calling setInPassword(true).  This will result in
-     * removing the password input type.
-     */
-    public void setSingleLine(boolean single) {
-        int inputType = EditorInfo.TYPE_CLASS_TEXT
-                | EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT;
-        if (single) {
-            int action = mWebView.nativeTextFieldAction();
-            switch (action) {
-            // Keep in sync with CachedRoot::ImeAction
-            case 0: // NEXT
-                setImeOptions(EditorInfo.IME_ACTION_NEXT);
-                break;
-            case 1: // GO
-                setImeOptions(EditorInfo.IME_ACTION_GO);
-                break;
-            case -1: // FAILURE
-            case 2: // DONE
-                setImeOptions(EditorInfo.IME_ACTION_DONE);
-                break;
-            }
-        } else {
-            inputType |= EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
-                    | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES
-                    | EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT;
-            setImeOptions(EditorInfo.IME_ACTION_NONE);
-        }
-        mSingle = single;
-        setHorizontallyScrolling(single);
-        setInputType(inputType);
-    }
-
-    /**
      * Set the text to the new string, but use the old selection, making sure
      * to keep it within the new string.
      * @param   text    The new text to place in the textfield.
@@ -854,6 +820,90 @@
     }
 
     /**
+     * Called by WebView.rebuildWebTextView().  Based on the type of the <input>
+     * element, set up the WebTextView, its InputType, and IME Options properly.
+     * @param type int corresponding to enum "type" defined in WebView.cpp.
+     *              Does not correspond to HTMLInputElement::InputType so this
+     *              is unaffected if that changes, and also because that has no
+     *              type corresponding to textarea (which is its own tag).
+     */
+    /* package */ void setType(int type) {
+        if (mWebView == null) return;
+        boolean single = true;
+        boolean inPassword = false;
+        int maxLength = -1;
+        int inputType = EditorInfo.TYPE_CLASS_TEXT
+                | EditorInfo.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT;
+        switch (type) {
+            case 1: // TEXT_AREA
+                single = false;
+                inputType |= EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE
+                        | EditorInfo.TYPE_TEXT_FLAG_CAP_SENTENCES
+                        | EditorInfo.TYPE_TEXT_FLAG_AUTO_CORRECT;
+                setImeOptions(EditorInfo.IME_ACTION_NONE);
+                break;
+            case 2: // PASSWORD
+                inPassword = true;
+                break;
+            case 3: // SEARCH
+                setImeOptions(EditorInfo.IME_ACTION_SEARCH);
+                break;
+            case 4: // EMAIL
+                // TYPE_TEXT_VARIATION_WEB_EDIT_TEXT prevents EMAIL_ADDRESS
+                // from working, so exclude it for now.
+                inputType = EditorInfo.TYPE_CLASS_TEXT
+                        | EditorInfo.TYPE_TEXT_VARIATION_EMAIL_ADDRESS;
+                break;
+            case 5: // NUMBER
+                inputType = EditorInfo.TYPE_CLASS_NUMBER;
+                break;
+            case 6: // TELEPHONE
+                inputType = EditorInfo.TYPE_CLASS_PHONE;
+                break;
+            case 7: // URL
+                // TYPE_TEXT_VARIATION_WEB_EDIT_TEXT prevents URI
+                // from working, so exclude it for now.
+                inputType = EditorInfo.TYPE_CLASS_TEXT
+                        | EditorInfo.TYPE_TEXT_VARIATION_URI;
+                break;
+            default:
+                break;
+        }
+        if (single) {
+            maxLength = mWebView.nativeFocusCandidateMaxLength();
+            if (type != 2 /* PASSWORD */) {
+                String name = mWebView.nativeFocusCandidateName();
+                if (name != null && name.length() > 0) {
+                    mWebView.requestFormData(name, mNodePointer);
+                }
+            }
+            if (type != 3 /* SEARCH */) {
+                int action = mWebView.nativeTextFieldAction();
+                switch (action) {
+                    // Keep in sync with CachedRoot::ImeAction
+                    case 0: // NEXT
+                        setImeOptions(EditorInfo.IME_ACTION_NEXT);
+                        break;
+                    case 1: // GO
+                        setImeOptions(EditorInfo.IME_ACTION_GO);
+                        break;
+                    case -1: // FAILURE
+                    case 2: // DONE
+                        setImeOptions(EditorInfo.IME_ACTION_DONE);
+                        break;
+                }
+            }
+        }
+        mSingle = single;
+        setMaxLength(maxLength);
+        setHorizontallyScrolling(single);
+        setInputType(inputType);
+        setInPassword(inPassword);
+        AutoCompleteAdapter adapter = null;
+        setAdapterCustom(adapter);
+    }
+
+    /**
      *  Update the cache to reflect the current text.
      */
     /* package */ void updateCachedTextfield() {
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 7885b8a..3be6a3f 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -3236,34 +3236,10 @@
                     vBox.height());
             mWebTextView.setGravity(nativeFocusCandidateIsRtlText() ?
                     Gravity.RIGHT : Gravity.NO_GRAVITY);
-            // this needs to be called before update adapter thread starts to
-            // ensure the mWebTextView has the same node pointer
+            // This needs to be called before setType, which may call
+            // requestFormData, and it needs to have the correct nodePointer.
             mWebTextView.setNodePointer(nodePointer);
-            int maxLength = -1;
-            boolean isTextField = nativeFocusCandidateIsTextField();
-            boolean isPassword;
-            if (isTextField) {
-                maxLength = nativeFocusCandidateMaxLength();
-                String name = nativeFocusCandidateName();
-                isPassword = nativeFocusCandidateIsPassword();
-                if (!isPassword && mWebViewCore.getSettings().getSaveFormData()
-                        && name != null && name.length() > 0) {
-                    Message update = mPrivateHandler.obtainMessage(
-                            REQUEST_FORM_DATA);
-                    update.arg1 = nodePointer;
-                    RequestFormData updater = new RequestFormData(name,
-                            getUrl(), update);
-                    Thread t = new Thread(updater);
-                    t.start();
-                }
-            } else {
-                isPassword = false;
-            }
-            mWebTextView.setMaxLength(maxLength);
-            AutoCompleteAdapter adapter = null;
-            mWebTextView.setAdapterCustom(adapter);
-            mWebTextView.setSingleLine(isTextField);
-            mWebTextView.setInPassword(isPassword);
+            mWebTextView.setType(nativeFocusCandidateType());
             if (null == text) {
                 if (DebugFlags.WEB_VIEW) {
                     Log.v(LOGTAG, "rebuildWebTextView null == text");
@@ -3275,6 +3251,25 @@
         }
     }
 
+    /**
+     * Called by WebTextView to find saved form data associated with the
+     * textfield
+     * @param name Name of the textfield.
+     * @param nodePointer Pointer to the node of the textfield, so it can be
+     *          compared to the currently focused textfield when the data is
+     *          retrieved.
+     */
+    /* package */ void requestFormData(String name, int nodePointer) {
+        if (mWebViewCore.getSettings().getSaveFormData()) {
+            Message update = mPrivateHandler.obtainMessage(REQUEST_FORM_DATA);
+            update.arg1 = nodePointer;
+            RequestFormData updater = new RequestFormData(name, getUrl(),
+                    update);
+            Thread t = new Thread(updater);
+            t.start();
+        }
+    }
+
     /*
      * This class requests an Adapter for the WebTextView which shows past
      * entries stored in the database.  It is a Runnable so that it can be done
@@ -5914,14 +5909,18 @@
     private native boolean  nativeFocusCandidateIsPassword();
     private native boolean  nativeFocusCandidateIsPlugin();
     private native boolean  nativeFocusCandidateIsRtlText();
-    private native boolean  nativeFocusCandidateIsTextField();
     private native boolean  nativeFocusCandidateIsTextInput();
-    private native int      nativeFocusCandidateMaxLength();
+    /* package */ native int      nativeFocusCandidateMaxLength();
     /* package */ native String   nativeFocusCandidateName();
     private native Rect     nativeFocusCandidateNodeBounds();
     /* package */ native int nativeFocusCandidatePointer();
     private native String   nativeFocusCandidateText();
     private native int      nativeFocusCandidateTextSize();
+    /**
+     * Returns an integer corresponding to WebView.cpp::type.
+     * See WebTextView.setType()
+     */
+    private native int      nativeFocusCandidateType();
     private native boolean  nativeFocusIsPlugin();
     /* package */ native int nativeFocusNodePointer();
     private native Rect     nativeGetCursorRingBounds();
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index 30dea74..032295d 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -173,8 +173,6 @@
      * @param handler An SslErrorHandler object that will handle the user's
      *            response.
      * @param error The SSL error object.
-     * @hide - hide this because it contains a parameter of type SslError,
-     * which is located in a hidden package.
      */
     public void onReceivedSslError(WebView view, SslErrorHandler handler,
             SslError error) {
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index e353501..92ff315 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2109,6 +2109,9 @@
                             }
                             reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
                             mFlingRunnable.start(-initialVelocity);
+                        } else {
+                            mTouchMode = TOUCH_MODE_REST;
+                            reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
                         }
                     }
                 } else {
diff --git a/core/java/android/widget/ExpandableListView.java b/core/java/android/widget/ExpandableListView.java
index 6abb2ae4..405461a 100644
--- a/core/java/android/widget/ExpandableListView.java
+++ b/core/java/android/widget/ExpandableListView.java
@@ -33,7 +33,6 @@
 import android.view.SoundEffectConstants;
 import android.view.View;
 import android.view.ContextMenu.ContextMenuInfo;
-import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.ExpandableListConnector.PositionMetadata;
 
 /**
@@ -514,37 +513,36 @@
         boolean returnValue;
         if (posMetadata.position.type == ExpandableListPosition.GROUP) {
             /* It's a group, so handle collapsing/expanding */
-            
+
+            /* It's a group click, so pass on event */
+            if (mOnGroupClickListener != null) {
+                if (mOnGroupClickListener.onGroupClick(this, v,
+                        posMetadata.position.groupPos, id)) {
+                    posMetadata.recycle();
+                    return true;
+                }
+            }
+
             if (posMetadata.isExpanded()) {
                 /* Collapse it */
                 mConnector.collapseGroup(posMetadata);
 
                 playSoundEffect(SoundEffectConstants.CLICK);
-                
+
                 if (mOnGroupCollapseListener != null) {
                     mOnGroupCollapseListener.onGroupCollapse(posMetadata.position.groupPos);
                 }
-                
             } else {
-                /* It's a group click, so pass on event */
-                if (mOnGroupClickListener != null) {
-                    if (mOnGroupClickListener.onGroupClick(this, v,
-                            posMetadata.position.groupPos, id)) {
-                        posMetadata.recycle();
-                        return true;
-                    }
-                }
-
                 /* Expand it */
                 mConnector.expandGroup(posMetadata);
 
                 playSoundEffect(SoundEffectConstants.CLICK);
-                
+
                 if (mOnGroupExpandListener != null) {
                     mOnGroupExpandListener.onGroupExpand(posMetadata.position.groupPos);
                 }
             }
-            
+
             returnValue = true;
         } else {
             /* It's a child, so pass on event */
@@ -553,12 +551,12 @@
                 return mOnChildClickListener.onChildClick(this, v, posMetadata.position.groupPos,
                         posMetadata.position.childPos, id);
             }
-            
+
             returnValue = false;
         }
-        
+
         posMetadata.recycle();
-        
+
         return returnValue;
     }
 
diff --git a/core/java/com/google/android/collect/Sets.java b/core/java/com/google/android/collect/Sets.java
index f5be0ec..fbfbe50 100644
--- a/core/java/com/google/android/collect/Sets.java
+++ b/core/java/com/google/android/collect/Sets.java
@@ -44,41 +44,50 @@
         return new HashSet<K>();
     }
 
-   /**
-    * Creates a {@code HashSet} instance containing the given elements.
-    *
-    * <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
-    * following:
-    *
-    * <p>{@code Set<Base> set = Sets.newHashSet(sub1, sub2);}
-    *
-    * <p>where {@code sub1} and {@code sub2} are references to subtypes of {@code
-    * Base}, not of {@code Base} itself. To get around this, you must use:
-    *
-    * <p>{@code Set<Base> set = Sets.<Base>newHashSet(sub1, sub2);}
-    *
-    * @param elements the elements that the set should contain
-    * @return a newly-created {@code HashSet} containing those elements (minus
-    *     duplicates)
-    */
-   public static <E> HashSet<E> newHashSet(E... elements) {
-     int capacity = elements.length * 4 / 3 + 1;
-     HashSet<E> set = new HashSet<E>(capacity);
-     Collections.addAll(set, elements);
-     return set;
-   }
+    /**
+     * Creates a {@code HashSet} instance containing the given elements.
+     *
+     * <p><b>Note:</b> due to a bug in javac 1.5.0_06, we cannot support the
+     * following:
+     *
+     * <p>{@code Set<Base> set = Sets.newHashSet(sub1, sub2);}
+     *
+     * <p>where {@code sub1} and {@code sub2} are references to subtypes of {@code
+     * Base}, not of {@code Base} itself. To get around this, you must use:
+     *
+     * <p>{@code Set<Base> set = Sets.<Base>newHashSet(sub1, sub2);}
+     *
+     * @param elements the elements that the set should contain
+     * @return a newly-created {@code HashSet} containing those elements (minus
+     *     duplicates)
+     */
+    public static <E> HashSet<E> newHashSet(E... elements) {
+        int capacity = elements.length * 4 / 3 + 1;
+        HashSet<E> set = new HashSet<E>(capacity);
+        Collections.addAll(set, elements);
+        return set;
+    }
 
-   /**
-    * Creates a {@code SortedSet} instance containing the given elements.
-    *
-    * @param elements the elements that the set should contain
-    * @return a newly-created {@code SortedSet} containing those elements (minus
-    *     duplicates)
-    */
-   public static <E> SortedSet<E> newSortedSet(E... elements) {
-       SortedSet<E> set = new TreeSet<E>();
-       Collections.addAll(set, elements);
-       return set;
-     }
+    /**
+     * Creates an empty {@code SortedSet} instance.
+     *
+     * @return a newly-created, initially-empty {@code SortedSet}.
+     */
+    public static <E> SortedSet<E> newSortedSet() {
+        return new TreeSet<E>();
+    }
+
+    /**
+     * Creates a {@code SortedSet} instance containing the given elements.
+     *
+     * @param elements the elements that the set should contain
+     * @return a newly-created {@code SortedSet} containing those elements (minus
+     *     duplicates)
+     */
+    public static <E> SortedSet<E> newSortedSet(E... elements) {
+        SortedSet<E> set = new TreeSet<E>();
+        Collections.addAll(set, elements);
+        return set;
+    }
 
 }
diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp
index 0be996d..d7485ae 100644
--- a/core/jni/android_media_AudioRecord.cpp
+++ b/core/jni/android_media_AudioRecord.cpp
@@ -224,17 +224,17 @@
 
 
 // ----------------------------------------------------------------------------
-static void
+static int
 android_media_AudioRecord_start(JNIEnv *env, jobject thiz)
 {
     AudioRecord *lpRecorder = 
             (AudioRecord *)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj);
     if (lpRecorder == NULL ) {
         jniThrowException(env, "java/lang/IllegalStateException", NULL);
-        return;
+        return AUDIORECORD_ERROR;
     }
     
-    lpRecorder->start();
+    return android_media_translateRecorderErrorCode(lpRecorder->start());
 }
 
 
@@ -482,7 +482,7 @@
 // ----------------------------------------------------------------------------
 static JNINativeMethod gMethods[] = {
     // name,               signature,  funcPtr
-    {"native_start",         "()V",    (void *)android_media_AudioRecord_start},
+    {"native_start",         "()I",    (void *)android_media_AudioRecord_start},
     {"native_stop",          "()V",    (void *)android_media_AudioRecord_stop},
     {"native_setup",         "(Ljava/lang/Object;IIIII)I",
                                        (void *)android_media_AudioRecord_setup},
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index f1c1cb9..094b02d 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -285,6 +285,7 @@
 
     if (rc) {
         signalExceptionForGroupError(env, clazz, errno);
+        return;
     }
 
     if (setpriority(PRIO_PROCESS, pid, pri) < 0) {
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml
index f8944b5..a45faad 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml
@@ -45,7 +45,6 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_below="@id/carrier"
-        android:layout_marginBottom="10dip"
         android:layout_marginTop="52dip"
         android:layout_marginLeft="20dip"
         >
@@ -53,6 +52,8 @@
         <TextView android:id="@+id/timeDisplay"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:singleLine="true"
+            android:ellipsize="none"
             android:gravity="bottom"
             android:textSize="72sp"
             android:textAppearance="?android:attr/textAppearanceMedium"
@@ -60,6 +61,7 @@
             android:shadowDx="0"
             android:shadowDy="0"
             android:shadowRadius="3.0"
+            android:layout_marginBottom="10dip"
             />
 
 
@@ -67,10 +69,10 @@
             android:layout_width="wrap_content"
             android:layout_height="fill_parent"
             android:gravity="bottom"
-            android:textSize="22sp"
             android:singleLine="true"
+            android:ellipsize="none"
+            android:textSize="22sp"
             android:layout_marginLeft="8dip"
-            android:layout_marginBottom="-6dip"
             android:textAppearance="?android:attr/textAppearanceMedium"
             android:shadowColor="#C0000000"
             android:shadowDx="0"
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
index 22c0b8e..1001697 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
@@ -49,7 +49,6 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@id/carrier"
-            android:layout_marginBottom="8dip"
             android:layout_marginTop="56dip"
             >
 
@@ -57,12 +56,15 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="bottom"
+                android:singleLine="true"
+                android:ellipsize="none"
                 android:textSize="72sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
                 android:shadowDy="0"
                 android:shadowRadius="3.0"
+                android:layout_marginBottom="6dip"
                 />
 
 
@@ -70,10 +72,10 @@
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:gravity="bottom"
-                android:textSize="22sp"
                 android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="22sp"
                 android:layout_marginLeft="8dip"
-                android:layout_marginBottom="-6dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
index 602a37c..f8f326a 100644
--- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml
@@ -60,7 +60,6 @@
             android:layout_height="wrap_content"
             android:layout_alignParentTop="true"
             android:layout_alignParentLeft="true"
-            android:layout_marginBottom="8dip"
             android:layout_marginTop="8dip"
             >
 
@@ -68,12 +67,15 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="bottom"
+                android:singleLine="true"
+                android:ellipsize="none"
                 android:textSize="72sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
                 android:shadowDy="0"
                 android:shadowRadius="3.0"
+                android:layout_marginBottom="6dip"
                 />
 
 
@@ -81,10 +83,10 @@
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:gravity="bottom"
-                android:textSize="22sp"
                 android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="22sp"
                 android:layout_marginLeft="8dip"
-                android:layout_marginBottom="-6dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
index 9ce5a25..d7c4aae 100644
--- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml
+++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml
@@ -50,7 +50,6 @@
             android:layout_alignParentLeft="true"
             android:layout_alignParentTop="true"
             android:layout_marginTop="15dip"
-            android:layout_marginBottom="6dip"
             android:layout_marginLeft="20dip"
             >
 
@@ -58,22 +57,25 @@
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:gravity="bottom"
+                android:singleLine="true"
+                android:ellipsize="none"
                 android:textSize="56sp"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
                 android:shadowDy="0"
                 android:shadowRadius="3.0"
+                android:layout_marginBottom="6dip"
                 />
 
             <TextView android:id="@+id/am_pm"
                 android:layout_width="wrap_content"
                 android:layout_height="fill_parent"
                 android:gravity="bottom"
-                android:textSize="18sp"
                 android:singleLine="true"
+                android:ellipsize="none"
+                android:textSize="18sp"
                 android:layout_marginLeft="4dip"
-                android:layout_marginBottom="-6dip"
                 android:textAppearance="?android:attr/textAppearanceMedium"
                 android:shadowColor="#C0000000"
                 android:shadowDx="0"
diff --git a/graphics/java/android/renderscript/Allocation.java b/graphics/java/android/renderscript/Allocation.java
index 957f2dd..b6ac14a 100644
--- a/graphics/java/android/renderscript/Allocation.java
+++ b/graphics/java/android/renderscript/Allocation.java
@@ -40,27 +40,36 @@
     }
 
     public void uploadToTexture(int baseMipLevel) {
+        mRS.validate();
+        mRS.validateSurface();
         mRS.nAllocationUploadToTexture(mID, baseMipLevel);
     }
 
     public void uploadToBufferObject() {
+        mRS.validate();
+        mRS.validateSurface();
         mRS.nAllocationUploadToBufferObject(mID);
     }
 
     public void data(int[] d) {
+        mRS.validate();
         subData1D(0, mType.getElementCount(), d);
     }
     public void data(short[] d) {
+        mRS.validate();
         subData1D(0, mType.getElementCount(), d);
     }
     public void data(byte[] d) {
+        mRS.validate();
         subData1D(0, mType.getElementCount(), d);
     }
     public void data(float[] d) {
+        mRS.validate();
         subData1D(0, mType.getElementCount(), d);
     }
 
     private void data1DChecks(int off, int count, int len, int dataSize) {
+        mRS.validate();
         if((off < 0) || (count < 1) || ((off + count) > mType.getElementCount())) {
             throw new IllegalArgumentException("Offset or Count out of bounds.");
         }
@@ -93,30 +102,37 @@
 
 
     public void subData2D(int xoff, int yoff, int w, int h, int[] d) {
+        mRS.validate();
         mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
     }
 
     public void subData2D(int xoff, int yoff, int w, int h, float[] d) {
+        mRS.validate();
         mRS.nAllocationSubData2D(mID, xoff, yoff, w, h, d, d.length * 4);
     }
 
     public void readData(int[] d) {
+        mRS.validate();
         mRS.nAllocationRead(mID, d);
     }
 
     public void readData(float[] d) {
+        mRS.validate();
         mRS.nAllocationRead(mID, d);
     }
 
     public void data(Object o) {
+        mRS.validate();
         mRS.nAllocationSubDataFromObject(mID, mType, 0, o);
     }
 
     public void read(Object o) {
+        mRS.validate();
         mRS.nAllocationSubReadFromObject(mID, mType, 0, o);
     }
 
     public void subData(int offset, Object o) {
+        mRS.validate();
         mRS.nAllocationSubDataFromObject(mID, mType, offset, o);
     }
 
@@ -127,27 +143,33 @@
         }
 
         public void setConstraint(Dimension dim, int value) {
+            mRS.validate();
             mRS.nAdapter1DSetConstraint(mID, dim.mID, value);
         }
 
         public void data(int[] d) {
+            mRS.validate();
             mRS.nAdapter1DData(mID, d);
         }
 
         public void data(float[] d) {
+            mRS.validate();
             mRS.nAdapter1DData(mID, d);
         }
 
         public void subData(int off, int count, int[] d) {
+            mRS.validate();
             mRS.nAdapter1DSubData(mID, off, count, d);
         }
 
         public void subData(int off, int count, float[] d) {
+            mRS.validate();
             mRS.nAdapter1DSubData(mID, off, count, d);
         }
     }
 
     public Adapter1D createAdapter1D() {
+        mRS.validate();
         int id = mRS.nAdapter1DCreate();
         if (id != 0) {
             mRS.nAdapter1DBindAllocation(id, mID);
@@ -163,27 +185,33 @@
         }
 
         public void setConstraint(Dimension dim, int value) {
+            mRS.validate();
             mRS.nAdapter2DSetConstraint(mID, dim.mID, value);
         }
 
         public void data(int[] d) {
+            mRS.validate();
             mRS.nAdapter2DData(mID, d);
         }
 
         public void data(float[] d) {
+            mRS.validate();
             mRS.nAdapter2DData(mID, d);
         }
 
         public void subData(int xoff, int yoff, int w, int h, int[] d) {
+            mRS.validate();
             mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
         }
 
         public void subData(int xoff, int yoff, int w, int h, float[] d) {
+            mRS.validate();
             mRS.nAdapter2DSubData(mID, xoff, yoff, w, h, d);
         }
     }
 
     public Adapter2D createAdapter2D() {
+        mRS.validate();
         int id = mRS.nAdapter2DCreate();
         if (id != 0) {
             mRS.nAdapter2DBindAllocation(id, mID);
@@ -202,6 +230,7 @@
     static public Allocation createTyped(RenderScript rs, Type type)
         throws IllegalArgumentException {
 
+        rs.validate();
         if(type.mID == 0) {
             throw new IllegalStateException("Bad Type");
         }
@@ -212,6 +241,7 @@
     static public Allocation createSized(RenderScript rs, Element e, int count)
         throws IllegalArgumentException {
 
+        rs.validate();
         Type.Builder b = new Type.Builder(rs, e);
         b.add(Dimension.X, count);
         Type t = b.create();
@@ -226,6 +256,7 @@
     static public Allocation createFromBitmap(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
         throws IllegalArgumentException {
 
+        rs.validate();
         int id = rs.nAllocationCreateFromBitmap(dstFmt.mID, genMips, b);
         return new Allocation(id, rs, null);
     }
@@ -233,6 +264,7 @@
     static public Allocation createFromBitmapBoxed(RenderScript rs, Bitmap b, Element dstFmt, boolean genMips)
         throws IllegalArgumentException {
 
+        rs.validate();
         int id = rs.nAllocationCreateFromBitmapBoxed(dstFmt.mID, genMips, b);
         return new Allocation(id, rs, null);
     }
@@ -240,6 +272,7 @@
     static public Allocation createFromBitmapResource(RenderScript rs, Resources res, int id, Element dstFmt, boolean genMips)
         throws IllegalArgumentException {
 
+        rs.validate();
         InputStream is = null;
         try {
             final TypedValue value = new TypedValue();
diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java
index 73d8266..ee9b098 100644
--- a/graphics/java/android/renderscript/Element.java
+++ b/graphics/java/android/renderscript/Element.java
@@ -284,6 +284,7 @@
     }
 
     public static Element createFromClass(RenderScript rs, Class c) {
+        rs.validate();
         Field[] fields = c.getFields();
         Builder b = new Builder(rs);
 
@@ -322,6 +323,7 @@
     }
 
     void init() {
+        mRS.validate();
         internalCreate(mRS, this);
     }
 
@@ -483,6 +485,7 @@
         }
 
         public Element create() {
+            mRS.validate();
             Element e = new Element(mRS, mEntryCount);
             java.lang.System.arraycopy(mEntries, 0, e.mEntries, 0, mEntryCount);
             e.init();
diff --git a/graphics/java/android/renderscript/Light.java b/graphics/java/android/renderscript/Light.java
index 115ae03..aab656f 100644
--- a/graphics/java/android/renderscript/Light.java
+++ b/graphics/java/android/renderscript/Light.java
@@ -30,10 +30,12 @@
     }
 
     public void setColor(float r, float g, float b) {
+        mRS.validate();
         mRS.nLightSetColor(mID, r, g, b);
     }
 
     public void setPosition(float x, float y, float z) {
+        mRS.validate();
         mRS.nLightSetPosition(mID, x, y, z);
     }
 
@@ -65,6 +67,7 @@
         }
 
         public Light create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/ProgramFragment.java b/graphics/java/android/renderscript/ProgramFragment.java
index f8625e8..2b2557d 100644
--- a/graphics/java/android/renderscript/ProgramFragment.java
+++ b/graphics/java/android/renderscript/ProgramFragment.java
@@ -47,6 +47,7 @@
 
     public void bindTexture(Allocation va, int slot)
         throws IllegalArgumentException {
+        mRS.validate();
         if((slot < 0) || (slot >= MAX_SLOT)) {
             throw new IllegalArgumentException("Slot ID out of range.");
         }
@@ -56,6 +57,7 @@
 
     public void bindSampler(Sampler vs, int slot)
         throws IllegalArgumentException {
+        mRS.validate();
         if((slot < 0) || (slot >= MAX_SLOT)) {
             throw new IllegalArgumentException("Slot ID out of range.");
         }
@@ -158,6 +160,7 @@
         }
 
         public ProgramFragment create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/ProgramRaster.java b/graphics/java/android/renderscript/ProgramRaster.java
index ab327f1..56f9bf4 100644
--- a/graphics/java/android/renderscript/ProgramRaster.java
+++ b/graphics/java/android/renderscript/ProgramRaster.java
@@ -46,11 +46,13 @@
     }
 
     public void setLineWidth(float w) {
+        mRS.validate();
         mLineWidth = w;
         mRS.nProgramRasterSetLineWidth(mID, w);
     }
 
     public void setPointSize(float s) {
+        mRS.validate();
         mPointSize = s;
         mRS.nProgramRasterSetPointSize(mID, s);
     }
@@ -98,6 +100,7 @@
         }
 
         public ProgramRaster create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/ProgramStore.java b/graphics/java/android/renderscript/ProgramStore.java
index 5cbe1b2..69be2454 100644
--- a/graphics/java/android/renderscript/ProgramStore.java
+++ b/graphics/java/android/renderscript/ProgramStore.java
@@ -162,6 +162,7 @@
         }
 
         public ProgramStore create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/ProgramVertex.java b/graphics/java/android/renderscript/ProgramVertex.java
index 8a22138..e284984 100644
--- a/graphics/java/android/renderscript/ProgramVertex.java
+++ b/graphics/java/android/renderscript/ProgramVertex.java
@@ -34,6 +34,7 @@
     }
 
     public void bindAllocation(MatrixAllocation va) {
+        mRS.validate();
         mRS.nProgramVertexBindAllocation(mID, va.mAlloc.mID);
     }
 
@@ -97,6 +98,7 @@
         }
 
         public ProgramVertex create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java
index 22bfa69..c8213c8 100644
--- a/graphics/java/android/renderscript/RenderScript.java
+++ b/graphics/java/android/renderscript/RenderScript.java
@@ -244,6 +244,18 @@
         }
     }
 
+    void validate() {
+        if (mContext == 0) {
+            throw new IllegalStateException("Calling RS with no Context active.");
+        }
+    }
+
+    void validateSurface() {
+        if (mSurface == null) {
+            throw new IllegalStateException("Uploading data to GL with no surface.");
+        }
+    }
+
     public void contextSetPriority(Priority p) {
         nContextSetPriority(p.mID);
     }
diff --git a/graphics/java/android/renderscript/Sampler.java b/graphics/java/android/renderscript/Sampler.java
index 5e0b110..625a576 100644
--- a/graphics/java/android/renderscript/Sampler.java
+++ b/graphics/java/android/renderscript/Sampler.java
@@ -100,6 +100,7 @@
         }
 
         public Sampler create() {
+            mRS.validate();
             return internalCreate(mRS, this);
         }
     }
diff --git a/graphics/java/android/renderscript/Script.java b/graphics/java/android/renderscript/Script.java
index 35791a3..57ccfa3 100644
--- a/graphics/java/android/renderscript/Script.java
+++ b/graphics/java/android/renderscript/Script.java
@@ -48,22 +48,27 @@
     }
 
     public void bindAllocation(Allocation va, int slot) {
+        mRS.validate();
         mRS.nScriptBindAllocation(mID, va.mID, slot);
     }
 
     public void setClearColor(float r, float g, float b, float a) {
+        mRS.validate();
         mRS.nScriptSetClearColor(mID, r, g, b, a);
     }
 
     public void setClearDepth(float d) {
+        mRS.validate();
         mRS.nScriptSetClearDepth(mID, d);
     }
 
     public void setClearStencil(int stencil) {
+        mRS.validate();
         mRS.nScriptSetClearStencil(mID, stencil);
     }
 
     public void setTimeZone(String timeZone) {
+        mRS.validate();
         try {
             mRS.nScriptSetTimeZone(mID, timeZone.getBytes("UTF-8"));
         } catch (java.io.UnsupportedEncodingException e) {
diff --git a/graphics/java/android/renderscript/SimpleMesh.java b/graphics/java/android/renderscript/SimpleMesh.java
index 3d10e3b..f45074e 100644
--- a/graphics/java/android/renderscript/SimpleMesh.java
+++ b/graphics/java/android/renderscript/SimpleMesh.java
@@ -35,18 +35,22 @@
     }
 
     public void bindVertexAllocation(Allocation a, int slot) {
+        mRS.validate();
         mRS.nSimpleMeshBindVertex(mID, a.mID, slot);
     }
 
     public void bindIndexAllocation(Allocation a) {
+        mRS.validate();
         mRS.nSimpleMeshBindIndex(mID, a.mID);
     }
 
     public Allocation createVertexAllocation(int slot) {
+        mRS.validate();
         return Allocation.createTyped(mRS, mVertexTypes[slot]);
     }
 
     public Allocation createIndexAllocation() {
+        mRS.validate();
         return Allocation.createTyped(mRS, mIndexType);
     }
 
@@ -162,6 +166,7 @@
         }
 
         public SimpleMesh create() {
+            mRS.validate();
             SimpleMesh sm = internalCreate(mRS, this);
             sm.mVertexTypes = new Type[mVertexTypeCount];
             for(int ct=0; ct < mVertexTypeCount; ct++) {
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 4199252..351763c 100644
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -33,7 +33,7 @@
     enum CreationFlags {
         kPreferSoftwareCodecs = 1,
     };
-    static sp<OMXCodec> Create(
+    static sp<MediaSource> Create(
             const sp<IOMX> &omx,
             const sp<MetaData> &meta, bool createEncoder,
             const sp<MediaSource> &source,
diff --git a/include/media/stagefright/OMXPluginBase.h b/include/media/stagefright/OMXPluginBase.h
index 9643c5f..61cc50a 100644
--- a/include/media/stagefright/OMXPluginBase.h
+++ b/include/media/stagefright/OMXPluginBase.h
@@ -36,6 +36,9 @@
             OMX_PTR appData,
             OMX_COMPONENTTYPE **component) = 0;
 
+    virtual OMX_ERRORTYPE destroyComponentInstance(
+            OMX_COMPONENTTYPE *component) = 0;
+
     virtual OMX_ERRORTYPE enumerateComponents(
             OMX_STRING name,
             size_t size,
diff --git a/libs/audioflinger/AudioFlinger.cpp b/libs/audioflinger/AudioFlinger.cpp
index 9ec8de5..2024cc0 100644
--- a/libs/audioflinger/AudioFlinger.cpp
+++ b/libs/audioflinger/AudioFlinger.cpp
@@ -1111,7 +1111,6 @@
 {
     track->mState = TrackBase::TERMINATED;
     if (mActiveTracks.indexOf(track) < 0) {
-        LOGV("remove track (%d) and delete from mixer", track->name());
         mTracks.remove(track);
         deleteTrackName_l(track->name());
     }
@@ -1511,6 +1510,7 @@
 // deleteTrackName_l() must be called with ThreadBase::mLock held
 void AudioFlinger::MixerThread::deleteTrackName_l(int name)
 {
+    LOGV("remove track (%d) and delete from mixer", name);
     mAudioMixer->deleteTrackName(name);
 }
 
@@ -1922,6 +1922,9 @@
 
 AudioFlinger::DuplicatingThread::~DuplicatingThread()
 {
+    for (size_t i = 0; i < mOutputTracks.size(); i++) {
+        mOutputTracks[i]->destroy();
+    }
     mOutputTracks.clear();
 }
 
@@ -2044,17 +2047,6 @@
         outputTracks.clear();
     }
 
-    { // scope for the mLock
-
-        Mutex::Autolock _l(mLock);
-        if (!mStandby) {
-            LOGV("DuplicatingThread() exiting out of standby");
-            for (size_t i = 0; i < mOutputTracks.size(); i++) {
-                mOutputTracks[i]->destroy();
-            }
-        }
-    }
-
     return false;
 }
 
@@ -3086,23 +3078,34 @@
             }
             if (mActiveTrack != 0) {
                 if (mActiveTrack->mState == TrackBase::PAUSING) {
+                    if (!mStandby) {
+                        mInput->standby();
+                        mStandby = true;
+                    }
                     mActiveTrack.clear();
                     mStartStopCond.broadcast();
                 } else if (mActiveTrack->mState == TrackBase::RESUMING) {
-                    mRsmpInIndex = mFrameCount;
                     if (mReqChannelCount != mActiveTrack->channelCount()) {
                         mActiveTrack.clear();
-                    } else {
-                        mActiveTrack->mState = TrackBase::ACTIVE;
+                        mStartStopCond.broadcast();
+                    } else if (mBytesRead != 0) {
+                        // record start succeeds only if first read from audio input
+                        // succeeds
+                        if (mBytesRead > 0) {
+                            mActiveTrack->mState = TrackBase::ACTIVE;
+                        } else {
+                            mActiveTrack.clear();
+                        }
+                        mStartStopCond.broadcast();
                     }
-                    mStartStopCond.broadcast();
+                    mStandby = false;
                 }
-                mStandby = false;
             }
         }
 
         if (mActiveTrack != 0) {
-            if (mActiveTrack->mState != TrackBase::ACTIVE) {
+            if (mActiveTrack->mState != TrackBase::ACTIVE &&
+                mActiveTrack->mState != TrackBase::RESUMING) {
                 usleep(5000);
                 continue;
             }
@@ -3140,18 +3143,19 @@
                             }
                         }
                         if (framesOut && mFrameCount == mRsmpInIndex) {
-                            ssize_t bytesRead;
                             if (framesOut == mFrameCount &&
                                 (mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) {
-                                bytesRead = mInput->read(buffer.raw, mInputBytes);
+                                mBytesRead = mInput->read(buffer.raw, mInputBytes);
                                 framesOut = 0;
                             } else {
-                                bytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
+                                mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
                                 mRsmpInIndex = 0;
                             }
-                            if (bytesRead < 0) {
+                            if (mBytesRead < 0) {
                                 LOGE("Error reading audio input");
-                                sleep(1);
+                                if (mActiveTrack->mState == TrackBase::ACTIVE) {
+                                    sleep(1);
+                                }
                                 mRsmpInIndex = mFrameCount;
                                 framesOut = 0;
                                 buffer.frameCount = 0;
@@ -3220,7 +3224,7 @@
             if (recordTrack != mActiveTrack.get()) {
                 status = -EBUSY;
             } else if (mActiveTrack->mState == TrackBase::PAUSING) {
-                mActiveTrack->mState = TrackBase::RESUMING;
+                mActiveTrack->mState = TrackBase::ACTIVE;
             }
             return status;
         }
@@ -3235,6 +3239,8 @@
             return status;
         }
         mActiveTrack->mState = TrackBase::RESUMING;
+        mRsmpInIndex = mFrameCount;
+        mBytesRead = 0;
         // signal thread to start
         LOGV("Signal record thread");
         mWaitWorkCV.signal();
@@ -3275,6 +3281,7 @@
                 mLock.unlock();
                 AudioSystem::stopInput(mId);
                 mLock.lock();
+                LOGV("Record stopped OK");
             }
         }
     }
@@ -3325,10 +3332,12 @@
     int channelCount;
 
     if (framesReady == 0) {
-        ssize_t bytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
-        if (bytesRead < 0) {
+        mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
+        if (mBytesRead < 0) {
             LOGE("RecordThread::getNextBuffer() Error reading audio input");
-            sleep(1);
+            if (mActiveTrack->mState == TrackBase::ACTIVE) {
+                sleep(1);
+            }
             buffer->raw = 0;
             buffer->frameCount = 0;
             return NOT_ENOUGH_DATA;
@@ -3546,9 +3555,11 @@
         if (pFormat) *pFormat = format;
         if (pChannels) *pChannels = channels;
         if (pLatencyMs) *pLatencyMs = thread->latency();
+
+        return mNextThreadId;
     }
 
-    return mNextThreadId;
+    return 0;
 }
 
 int AudioFlinger::openDuplicateOutput(int output1, int output2)
@@ -3694,9 +3705,11 @@
         if (pChannels) *pChannels = reqChannels;
 
         input->standby();
+
+        return mNextThreadId;
     }
 
-    return mNextThreadId;
+    return 0;
 }
 
 status_t AudioFlinger::closeInput(int input)
diff --git a/libs/audioflinger/AudioFlinger.h b/libs/audioflinger/AudioFlinger.h
index 5a17294..8c29da85 100644
--- a/libs/audioflinger/AudioFlinger.h
+++ b/libs/audioflinger/AudioFlinger.h
@@ -744,6 +744,7 @@
                 size_t                              mInputBytes;
                 int                                 mReqChannelCount;
                 uint32_t                            mReqSampleRate;
+                ssize_t                             mBytesRead;
     };
 
     class RecordHandle : public android::BnAudioRecord {
diff --git a/libs/surfaceflinger/Android.mk b/libs/surfaceflinger/Android.mk
index eb51c22..b3fed58 100644
--- a/libs/surfaceflinger/Android.mk
+++ b/libs/surfaceflinger/Android.mk
@@ -22,9 +22,6 @@
 ifeq ($(TARGET_BOARD_PLATFORM), msm7k)
 	LOCAL_CFLAGS += -DDIM_WITH_TEXTURE
 endif
-ifeq ($(TARGET_BOARD_PLATFORM), qsd8k)
-	LOCAL_CFLAGS += -DDIM_WITH_TEXTURE
-endif
 
 # need "-lrt" on Linux simulator to pick up clock_gettime
 ifeq ($(TARGET_SIMULATOR),true)
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 7a47157..c48eaad 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -498,8 +498,9 @@
 
         // start recording
         synchronized(mRecordingStateLock) {
-            native_start();
-            mRecordingState = RECORDSTATE_RECORDING;
+            if (native_start() == SUCCESS) {
+                mRecordingState = RECORDSTATE_RECORDING;
+            }
         }
     }
 
@@ -764,7 +765,7 @@
     
     private native final void native_release();
 
-    private native final void native_start();  
+    private native final int native_start();
 
     private native final void native_stop();
 
diff --git a/media/jni/soundpool/SoundPool.cpp b/media/jni/soundpool/SoundPool.cpp
index b17e31b..4d2e048 100644
--- a/media/jni/soundpool/SoundPool.cpp
+++ b/media/jni/soundpool/SoundPool.cpp
@@ -38,7 +38,7 @@
 uint32_t kDefaultSampleRate = 44100;
 uint32_t kDefaultFrameCount = 1200;
 
-SoundPool::SoundPool(jobject soundPoolRef, int maxChannels, int streamType, int srcQuality)
+SoundPool::SoundPool(int maxChannels, int streamType, int srcQuality)
 {
     LOGV("SoundPool constructor: maxChannels=%d, streamType=%d, srcQuality=%d",
             maxChannels, streamType, srcQuality);
@@ -54,7 +54,6 @@
     LOGW_IF(maxChannels != mMaxChannels, "App requested %d channels", maxChannels);
 
     mQuit = false;
-    mSoundPoolRef = soundPoolRef;
     mDecodeThread = 0;
     mStreamType = streamType;
     mSrcQuality = srcQuality;
diff --git a/media/jni/soundpool/SoundPool.h b/media/jni/soundpool/SoundPool.h
index ab86e90..94cd978 100644
--- a/media/jni/soundpool/SoundPool.h
+++ b/media/jni/soundpool/SoundPool.h
@@ -159,7 +159,7 @@
     friend class SoundPoolThread;
     friend class SoundChannel;
 public:
-    SoundPool(jobject soundPoolRef, int maxChannels, int streamType, int srcQuality);
+    SoundPool(int maxChannels, int streamType, int srcQuality);
     ~SoundPool();
     int load(const char* url, int priority);
     int load(int fd, int64_t offset, int64_t length, int priority);
@@ -186,9 +186,6 @@
     SoundPool() {} // no default constructor
     bool startThreads();
     void doLoad(sp<Sample>& sample);
-    inline void notify(const SoundPoolEvent* event) {
-        android_soundpool_SoundPool_notify(mSoundPoolRef, event);
-    }
     sp<Sample> findSample(int sampleID) { return mSamples.valueFor(sampleID); }
     SoundChannel* findChannel (int channelID);
     SoundChannel* findNextChannel (int channelID);
@@ -202,7 +199,6 @@
     int run();
     void quit();
 
-    jobject                 mSoundPoolRef;
     Mutex                   mLock;
     Mutex                   mRestartLock;
     Condition               mCondition;
diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp
index 0ce2d6f..1381db3 100644
--- a/media/jni/soundpool/android_media_SoundPool.cpp
+++ b/media/jni/soundpool/android_media_SoundPool.cpp
@@ -154,7 +154,7 @@
         jobject weak_this, jint maxChannels, jint streamType, jint srcQuality)
 {
     LOGV("android_media_SoundPool_native_setup");
-    SoundPool *ap = new SoundPool(weak_this, maxChannels, streamType, srcQuality);
+    SoundPool *ap = new SoundPool(maxChannels, streamType, srcQuality);
     if (ap == NULL) {
         jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
         return;
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index c3828f0..f4165ff 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -125,7 +125,7 @@
     audio_io_handle_t input = AudioSystem::getInput(inputSource,
                                     sampleRate, format, channels, (AudioSystem::audio_in_acoustics)flags);
     if (input == 0) {
-        LOGE("Could not get audio output for stream type %d", inputSource);
+        LOGE("Could not get audio input for record source %d", inputSource);
         return BAD_VALUE;
     }
 
@@ -539,7 +539,6 @@
         return BAD_VALUE;
     }
 
-    LOGV("read size: %d", userSize);
 
     do {
 
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 460c496..cd180fd 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -36,6 +36,7 @@
         WAVExtractor.cpp          \
         string.cpp
 
+LOCAL_CFLAGS += -DBUILD_WITH_FULL_STAGEFRIGHT
 endif
 
 LOCAL_C_INCLUDES:= \
@@ -50,6 +51,14 @@
         libcutils         \
         libui
 
+ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
+
+LOCAL_STATIC_LIBRARIES := \
+        libstagefright_aacdec \
+        libstagefright_mp3dec
+
+endif
+
 ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)
         LOCAL_LDLIBS += -lpthread
 endif
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 670f748..07508e7 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -18,6 +18,11 @@
 #define LOG_TAG "OMXCodec"
 #include <utils/Log.h>
 
+#if BUILD_WITH_FULL_STAGEFRIGHT
+#include "include/AACDecoder.h"
+#include "include/MP3Decoder.h"
+#endif
+
 #include "include/ESDS.h"
 
 #include <binder/IServiceManager.h>
@@ -274,7 +279,7 @@
 }
 
 // static
-sp<OMXCodec> OMXCodec::Create(
+sp<MediaSource> OMXCodec::Create(
         const sp<IOMX> &omx,
         const sp<MetaData> &meta, bool createEncoder,
         const sp<MediaSource> &source,
@@ -284,6 +289,14 @@
     bool success = meta->findCString(kKeyMIMEType, &mime);
     CHECK(success);
 
+#if BUILD_WITH_FULL_STAGEFRIGHT
+    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
+        return new AACDecoder(source);
+    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) {
+        return new MP3Decoder(source);
+    }
+#endif
+
     Vector<String8> matchingCodecs;
     findMatchingCodecs(
             mime, createEncoder, matchComponentName, flags, &matchingCodecs);
diff --git a/media/libstagefright/codecs/Android.mk b/media/libstagefright/codecs/Android.mk
new file mode 100644
index 0000000..1fa7e93
--- /dev/null
+++ b/media/libstagefright/codecs/Android.mk
@@ -0,0 +1,8 @@
+ifeq ($(BUILD_WITH_FULL_STAGEFRIGHT),true)
+
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
+
+endif
diff --git a/media/libstagefright/codecs/aacdec/AACDecoder.cpp b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
new file mode 100644
index 0000000..03ac88d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/AACDecoder.cpp
@@ -0,0 +1,202 @@
+#include "AACDecoder.h"
+
+#include "../../include/ESDS.h"
+
+#include "pvmp4audiodecoder_api.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+AACDecoder::AACDecoder(const sp<MediaSource> &source)
+    : mSource(source),
+      mStarted(false),
+      mBufferGroup(NULL),
+      mConfig(new tPVMP4AudioDecoderExternal),
+      mDecoderBuf(NULL),
+      mLastSeekTimeUs(0),
+      mNumSamplesOutput(0),
+      mInputBuffer(NULL) {
+}
+
+AACDecoder::~AACDecoder() {
+    if (mStarted) {
+        stop();
+    }
+
+    delete mConfig;
+    mConfig = NULL;
+}
+
+status_t AACDecoder::start(MetaData *params) {
+    CHECK(!mStarted);
+
+    mBufferGroup = new MediaBufferGroup;
+    mBufferGroup->add_buffer(new MediaBuffer(2048 * 2));
+
+    mConfig->outputFormat = OUTPUTFORMAT_16PCM_INTERLEAVED;
+    mConfig->aacPlusUpsamplingFactor = 0;
+    mConfig->aacPlusEnabled = false;
+
+    int32_t numChannels;
+    CHECK(mSource->getFormat()->findInt32(kKeyChannelCount, &numChannels));
+    mConfig->desiredChannels = numChannels;
+
+    UInt32 memRequirements = PVMP4AudioDecoderGetMemRequirements();
+    mDecoderBuf = malloc(memRequirements);
+
+    CHECK_EQ(PVMP4AudioDecoderInitLibrary(mConfig, mDecoderBuf),
+             MP4AUDEC_SUCCESS);
+
+    uint32_t type;
+    const void *data;
+    size_t size;
+    if (mSource->getFormat()->findData(kKeyESDS, &type, &data, &size)) {
+        ESDS esds((const char *)data, size);
+        CHECK_EQ(esds.InitCheck(), OK);
+
+        const void *codec_specific_data;
+        size_t codec_specific_data_size;
+        esds.getCodecSpecificInfo(
+                &codec_specific_data, &codec_specific_data_size);
+
+        mConfig->pInputBuffer = (UChar *)codec_specific_data;
+        mConfig->inputBufferCurrentLength = codec_specific_data_size;
+        mConfig->inputBufferMaxLength = 0;
+        mConfig->inputBufferUsedLength = 0;
+        mConfig->remainderBits = 0;
+
+        mConfig->pOutputBuffer = NULL;
+        mConfig->pOutputBuffer_plus = NULL;
+        mConfig->repositionFlag = false;
+
+        CHECK_EQ(PVMP4AudioDecoderConfig(mConfig, mDecoderBuf),
+                 MP4AUDEC_SUCCESS);
+    }
+
+    mSource->start();
+
+    mLastSeekTimeUs = 0;
+    mNumSamplesOutput = 0;
+    mStarted = true;
+
+    return OK;
+}
+
+status_t AACDecoder::stop() {
+    CHECK(mStarted);
+
+    if (mInputBuffer) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    free(mDecoderBuf);
+    mDecoderBuf = NULL;
+
+    delete mBufferGroup;
+    mBufferGroup = NULL;
+
+    mSource->stop();
+
+    mStarted = false;
+
+    return OK;
+}
+
+sp<MetaData> AACDecoder::getFormat() {
+    sp<MetaData> srcFormat = mSource->getFormat();
+
+    int32_t numChannels;
+    int32_t sampleRate;
+    CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
+    CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
+
+    sp<MetaData> meta = new MetaData;
+    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
+    meta->setInt32(kKeyChannelCount, numChannels);
+    meta->setInt32(kKeySampleRate, sampleRate);
+
+    return meta;
+}
+
+status_t AACDecoder::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;
+        }
+
+        if (seekTimeUs >= 0) {
+            CHECK(mInputBuffer->meta_data()->findInt64(
+                        kKeyTime, &mLastSeekTimeUs));
+
+            mNumSamplesOutput = 0;
+        }
+    }
+
+    MediaBuffer *buffer;
+    CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+
+    mConfig->pInputBuffer =
+        (UChar *)mInputBuffer->data() + mInputBuffer->range_offset();
+
+    mConfig->inputBufferCurrentLength = mInputBuffer->range_length();
+    mConfig->inputBufferMaxLength = 0;
+    mConfig->inputBufferUsedLength = 0;
+    mConfig->remainderBits = 0;
+
+    mConfig->pOutputBuffer = static_cast<Int16 *>(buffer->data());
+    mConfig->pOutputBuffer_plus = NULL;
+    mConfig->repositionFlag = false;
+
+    CHECK_EQ(PVMP4AudioDecodeFrame(mConfig, mDecoderBuf), MP4AUDEC_SUCCESS);
+
+    buffer->set_range(
+            0, mConfig->frameLength * sizeof(int16_t) * mConfig->desiredChannels);
+
+    mInputBuffer->set_range(
+            mInputBuffer->range_offset() + mConfig->inputBufferUsedLength,
+            mInputBuffer->range_length() - mConfig->inputBufferUsedLength);
+
+    if (mInputBuffer->range_length() == 0) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    buffer->meta_data()->setInt64(
+            kKeyTime,
+            mLastSeekTimeUs
+                + (mNumSamplesOutput * 1000000) / mConfig->samplingRate);
+
+    mNumSamplesOutput += mConfig->frameLength;
+
+    *out = buffer;
+
+    return OK;
+}
+
+}  // namespace android
diff --git a/media/libstagefright/codecs/aacdec/Android.mk b/media/libstagefright/codecs/aacdec/Android.mk
new file mode 100644
index 0000000..7f06095
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/Android.mk
@@ -0,0 +1,158 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+	analysis_sub_band.cpp \
+ 	apply_ms_synt.cpp \
+ 	apply_tns.cpp \
+ 	buf_getbits.cpp \
+ 	byte_align.cpp \
+ 	calc_auto_corr.cpp \
+ 	calc_gsfb_table.cpp \
+ 	calc_sbr_anafilterbank.cpp \
+ 	calc_sbr_envelope.cpp \
+ 	calc_sbr_synfilterbank.cpp \
+ 	check_crc.cpp \
+ 	dct16.cpp \
+ 	dct64.cpp \
+ 	decode_huff_cw_binary.cpp \
+ 	decode_noise_floorlevels.cpp \
+ 	deinterleave.cpp \
+ 	digit_reversal_tables.cpp \
+ 	dst16.cpp \
+ 	dst32.cpp \
+ 	dst8.cpp \
+ 	esc_iquant_scaling.cpp \
+ 	extractframeinfo.cpp \
+ 	fft_rx4_long.cpp \
+ 	fft_rx4_short.cpp \
+ 	fft_rx4_tables_fxp.cpp \
+ 	find_adts_syncword.cpp \
+ 	fwd_long_complex_rot.cpp \
+ 	fwd_short_complex_rot.cpp \
+ 	gen_rand_vector.cpp \
+ 	get_adif_header.cpp \
+ 	get_adts_header.cpp \
+ 	get_audio_specific_config.cpp \
+ 	get_dse.cpp \
+ 	get_ele_list.cpp \
+ 	get_ga_specific_config.cpp \
+ 	get_ics_info.cpp \
+ 	get_prog_config.cpp \
+ 	get_pulse_data.cpp \
+ 	get_sbr_bitstream.cpp \
+ 	get_sbr_startfreq.cpp \
+ 	get_sbr_stopfreq.cpp \
+ 	get_tns.cpp \
+ 	getfill.cpp \
+ 	getgroup.cpp \
+ 	getics.cpp \
+ 	getmask.cpp \
+ 	hcbtables_binary.cpp \
+ 	huffcb.cpp \
+ 	huffdecode.cpp \
+ 	hufffac.cpp \
+ 	huffspec_fxp.cpp \
+ 	idct16.cpp \
+ 	idct32.cpp \
+ 	idct8.cpp \
+ 	imdct_fxp.cpp \
+ 	infoinit.cpp \
+ 	init_sbr_dec.cpp \
+ 	intensity_right.cpp \
+ 	inv_long_complex_rot.cpp \
+ 	inv_short_complex_rot.cpp \
+ 	iquant_table.cpp \
+ 	long_term_prediction.cpp \
+ 	long_term_synthesis.cpp \
+ 	lt_decode.cpp \
+ 	mdct_fxp.cpp \
+ 	mdct_tables_fxp.cpp \
+ 	mdst.cpp \
+ 	mix_radix_fft.cpp \
+ 	ms_synt.cpp \
+ 	pns_corr.cpp \
+ 	pns_intensity_right.cpp \
+ 	pns_left.cpp \
+ 	ps_all_pass_filter_coeff.cpp \
+ 	ps_all_pass_fract_delay_filter.cpp \
+ 	ps_allocate_decoder.cpp \
+ 	ps_applied.cpp \
+ 	ps_bstr_decoding.cpp \
+ 	ps_channel_filtering.cpp \
+ 	ps_decode_bs_utils.cpp \
+ 	ps_decorrelate.cpp \
+ 	ps_fft_rx8.cpp \
+ 	ps_hybrid_analysis.cpp \
+ 	ps_hybrid_filter_bank_allocation.cpp \
+ 	ps_hybrid_synthesis.cpp \
+ 	ps_init_stereo_mixing.cpp \
+ 	ps_pwr_transient_detection.cpp \
+ 	ps_read_data.cpp \
+ 	ps_stereo_processing.cpp \
+ 	pulse_nc.cpp \
+ 	pv_div.cpp \
+ 	pv_log2.cpp \
+ 	pv_normalize.cpp \
+ 	pv_pow2.cpp \
+ 	pv_sine.cpp \
+ 	pv_sqrt.cpp \
+ 	pvmp4audiodecoderconfig.cpp \
+ 	pvmp4audiodecoderframe.cpp \
+ 	pvmp4audiodecodergetmemrequirements.cpp \
+ 	pvmp4audiodecoderinitlibrary.cpp \
+ 	pvmp4audiodecoderresetbuffer.cpp \
+ 	q_normalize.cpp \
+ 	qmf_filterbank_coeff.cpp \
+ 	sbr_aliasing_reduction.cpp \
+ 	sbr_applied.cpp \
+ 	sbr_code_book_envlevel.cpp \
+ 	sbr_crc_check.cpp \
+ 	sbr_create_limiter_bands.cpp \
+ 	sbr_dec.cpp \
+ 	sbr_decode_envelope.cpp \
+ 	sbr_decode_huff_cw.cpp \
+ 	sbr_downsample_lo_res.cpp \
+ 	sbr_envelope_calc_tbl.cpp \
+ 	sbr_envelope_unmapping.cpp \
+ 	sbr_extract_extended_data.cpp \
+ 	sbr_find_start_andstop_band.cpp \
+ 	sbr_generate_high_freq.cpp \
+ 	sbr_get_additional_data.cpp \
+ 	sbr_get_cpe.cpp \
+ 	sbr_get_dir_control_data.cpp \
+ 	sbr_get_envelope.cpp \
+ 	sbr_get_header_data.cpp \
+ 	sbr_get_noise_floor_data.cpp \
+ 	sbr_get_sce.cpp \
+ 	sbr_inv_filt_levelemphasis.cpp \
+ 	sbr_open.cpp \
+ 	sbr_read_data.cpp \
+ 	sbr_requantize_envelope_data.cpp \
+ 	sbr_reset_dec.cpp \
+ 	sbr_update_freq_scale.cpp \
+ 	set_mc_info.cpp \
+ 	sfb.cpp \
+ 	shellsort.cpp \
+ 	synthesis_sub_band.cpp \
+ 	tns_ar_filter.cpp \
+ 	tns_decode_coef.cpp \
+ 	tns_inv_filter.cpp \
+ 	trans4m_freq_2_time_fxp.cpp \
+ 	trans4m_time_2_freq_fxp.cpp \
+ 	unpack_idx.cpp \
+ 	window_tables_fxp.cpp \
+ 	pvmp4setaudioconfig.cpp \
+        AACDecoder.cpp
+
+LOCAL_CFLAGS := -DAAC_PLUS -DHQ_SBR -DPARAMETRICSTEREO -DOSCL_IMPORT_REF= -DOSCL_EXPORT_REF= -DOSCL_UNUSED_ARG=
+
+LOCAL_C_INCLUDES := frameworks/base/media/libstagefright/include
+
+LOCAL_SHARED_LIBRARIES := \
+        libstagefright \
+        libutils
+
+LOCAL_MODULE := libstagefright_aacdec
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/aacdec/aac_mem_funcs.h b/media/libstagefright/codecs/aacdec/aac_mem_funcs.h
new file mode 100644
index 0000000..ce7cb12
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/aac_mem_funcs.h
@@ -0,0 +1,50 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+ Filename: aac_mem_funcs.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#include <string.h>
+
+#ifndef AAC_MEM_FUNCS_H
+#define AAC_MEM_FUNCS_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/aacdec/analysis_sub_band.cpp b/media/libstagefright/codecs/aacdec/analysis_sub_band.cpp
new file mode 100644
index 0000000..2786dcc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/analysis_sub_band.cpp
@@ -0,0 +1,289 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: analysis_sub_band.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 vec[],            Input vector, 32-bit
+    const Int32 *cosTerms,  Cosine Terms
+    Int   maxbands          number of bands used
+    Int32 *scratch_mem      Scratch memory
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement root squared of a number
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "analysis_sub_band.h"
+#include "dst32.h"
+#include "idct32.h"
+#include "mdst.h"
+
+#include "aac_mem_funcs.h"
+#include "pv_audio_type_defs.h"
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+
+#ifdef HQ_SBR
+
+
+const Int32 exp_1_5_phi[32] =
+{
+
+    0x7FEA04B6,  0x7F380E1C, 0x7DD6176E, 0x7BC6209F,
+    0x790A29A4,  0x75A6326E, 0x719E3AF3, 0x6CF94326,
+    0x67BD4AFB,  0x61F15269, 0x5B9D5964, 0x54CA5FE4,
+    0x4D8165DE,  0x45CD6B4B, 0x3DB87023, 0x354E7460,
+    0x2C9977FB,  0x23A77AEF, 0x1A837D3A, 0x113A7ED6,
+    0x07D97FC2,  0xFE6E7FFE, 0xF5057F87, 0xEBAB7E60,
+    0xE26D7C89,  0xD9587A06, 0xD07976D9, 0xC7DB7308,
+    0xBF8C6E97,  0xB796698C, 0xB00563EF, 0xA8E25DC8,
+
+};
+
+#endif
+
+
+/*----------------------------------------------------------------------------
+; 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 analysis_sub_band_LC(Int32 vec[64],
+                          Int32 cosine_total[],
+                          Int32 maxBand,
+                          Int32 scratch_mem[][64])
+{
+    Int32 i;
+    Int32 *cosine_term = &scratch_mem[0][0];
+    Int32 *sine_term   = &scratch_mem[0][32];
+
+    Int32 *pt_cos_t;
+
+
+    Int32 *pt_vec    =  &vec[0];
+    Int32 *pt_vec_32 =  &vec[32];
+
+    Int32 *pt_cos = cosine_term;
+    Int32 *pt_sin = sine_term;
+
+    for (i = 8; i != 0; i--)
+    {
+        Int32 tmp1 = *(pt_vec_32++);
+        Int32 tmp3 = *(pt_vec_32++);
+        Int32 tmp2 = *(pt_vec++);
+        Int32 tmp4 = *(pt_vec++);
+        *(pt_cos++) = (tmp1 - tmp2) >> 1;
+        *(pt_cos++) = (tmp3 - tmp4) >> 1;
+        *(pt_sin++) = (tmp1 + tmp2);
+        *(pt_sin++) = (tmp3 + tmp4);
+        tmp1 = *(pt_vec_32++);
+        tmp3 = *(pt_vec_32++);
+        tmp2 = *(pt_vec++);
+        tmp4 = *(pt_vec++);
+        *(pt_cos++) = (tmp1 - tmp2) >> 1;
+        *(pt_cos++) = (tmp3 - tmp4) >> 1;
+        *(pt_sin++) = (tmp1 + tmp2);
+        *(pt_sin++) = (tmp3 + tmp4);
+    }
+
+
+    idct_32(cosine_term, scratch_mem[1]);
+
+    dst_32(sine_term, scratch_mem[1]);
+
+    pt_cos  = cosine_term;
+    pt_sin  = sine_term;
+
+    pt_cos_t  = cosine_total;
+
+    for (i = 0; i < maxBand; i += 4)
+    {
+        *(pt_cos_t++) = (*(pt_cos++) + *(pt_sin++));
+        *(pt_cos_t++) = (-*(pt_cos++) + *(pt_sin++));
+        *(pt_cos_t++) = (-*(pt_cos++) - *(pt_sin++));
+        *(pt_cos_t++) = (*(pt_cos++) - *(pt_sin++));
+    }
+
+    pt_cos_t  = &cosine_total[maxBand];
+
+    for (i = (32 - maxBand); i != 0; i--)
+    {
+        *(pt_cos_t++) =   0;
+    }
+}
+
+
+#ifdef HQ_SBR
+
+
+void analysis_sub_band(Int32 vec[64],
+                       Int32 cosine_total[],
+                       Int32 sine_total[],
+                       Int32 maxBand,
+                       Int32 scratch_mem[][64])
+{
+    Int32 i;
+    Int32 *sine_term1   = &scratch_mem[0][0];
+    Int32 *sine_term2   = &scratch_mem[0][32];
+
+    Int32 temp1;
+    Int32 temp2;
+    Int32 temp3;
+    Int32 temp4;
+
+    const Int32 *pt_exp;
+    Int32 exp_1_5;
+
+    Int32 *pt_vec    =  &vec[0];
+    Int32 *pt_vec_32 =  &vec[32];
+
+    Int32 *pt_cos1 = pt_vec;
+    Int32 *pt_sin1 = sine_term1;
+    Int32 *pt_cos2 = pt_vec_32;
+    Int32 *pt_sin2 = sine_term2;
+
+
+    pv_memcpy(sine_term1, vec, 64*sizeof(*vec));
+
+    mdst_32(sine_term1, scratch_mem[1]);
+    mdst_32(sine_term2, scratch_mem[1]);
+
+    mdct_32(&vec[ 0]);
+    mdct_32(&vec[32]);
+
+    pt_cos1 = &vec[ 0];
+    pt_cos2 = &vec[32];
+
+
+    pt_sin1 = sine_term1;
+    pt_sin2 = sine_term2;
+
+    pt_vec     = cosine_total;
+    pt_vec_32  =   sine_total;
+    pt_exp  = exp_1_5_phi;
+
+    temp3 = (*(pt_cos1++) - *(pt_sin2++));
+    temp4 = (*(pt_sin1++) + *(pt_cos2++));
+
+    for (i = 0; i < maxBand; i += 2)
+    {
+
+        exp_1_5 = *(pt_exp++);
+        temp1    =  cmplx_mul32_by_16(temp3,  temp4, exp_1_5);
+        temp2    =  cmplx_mul32_by_16(temp4, -temp3, exp_1_5);
+
+        *(pt_vec++)    =  shft_lft_1(temp1);
+        *(pt_vec_32++) =  shft_lft_1(temp2);
+
+        temp3 = (*(pt_cos1++) + *(pt_sin2++));
+        temp4 = (*(pt_sin1++) - *(pt_cos2++));
+
+        exp_1_5 = *(pt_exp++);
+        temp1    =  cmplx_mul32_by_16(temp3,  temp4, exp_1_5);
+        temp2    =  cmplx_mul32_by_16(temp4, -temp3, exp_1_5);
+
+        *(pt_vec++)    =  shft_lft_1(temp1);
+        *(pt_vec_32++) =  shft_lft_1(temp2);
+
+        temp3 = (*(pt_cos1++) - *(pt_sin2++));
+        temp4 = (*(pt_sin1++) + *(pt_cos2++));
+    }
+
+
+    pt_cos1  = &cosine_total[maxBand];  /* in the chance that maxband is not even */
+    pt_sin1  = &sine_total[maxBand];
+
+    for (i = (32 - maxBand); i != 0; i--)
+    {
+        *(pt_cos1++) =  0;
+        *(pt_sin1++) =  0;
+    }
+
+}
+
+
+#endif
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/analysis_sub_band.h b/media/libstagefright/codecs/aacdec/analysis_sub_band.h
new file mode 100644
index 0000000..815456c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/analysis_sub_band.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/analysis_sub_band.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef ANALYSIS_SUB_BAND_H
+#define ANALYSIS_SUB_BAND_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    void analysis_sub_band_LC(Int32 vec[64],
+    Int32 cosine_total[],
+    Int32 maxBand,
+    Int32 scratch_mem[][64]);
+
+#ifdef HQ_SBR
+
+
+    void analysis_sub_band(Int32 vec[64],
+                           Int32 cosine_total[],
+                           Int32 sine_total[],
+                           Int32 maxBand,
+                           Int32 scratch_mem[][64]);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* ANALYSIS_SUB_BAND_H */
diff --git a/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp b/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
new file mode 100644
index 0000000..ab36c6af
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/apply_ms_synt.cpp
@@ -0,0 +1,454 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/apply_ms_synt.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated pseudocode to correct capitalized format for the IF
+ FOR and WHILE statements.
+
+ Description: Delete local variable start_indx, since it is never used.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    pFrameInfo = Pointer to structure that holds information about each group.
+                 (long block flag, number of windows, scalefactor bands
+                  per group, etc.)
+                 [const pFrameInfo * const]
+
+    group      = Array that contains indexes of the
+                 first window in the next group.
+                 [const Int *, length 8]
+
+    mask_map   = Array that denotes whether M/S stereo is turned on for
+                 each grouped scalefactor band.
+                 [const Int *, length MAX_SFB]
+
+    codebook_map = Array that denotes which Huffman codebook was used for
+                   the encoding of each grouped scalefactor band.
+                   [const Int *, length MAX_SFB]
+
+    coefLeft = Array containing the fixed-point spectral coefficients
+                       for the left channel.
+                       [Int32 *, length 1024]
+
+    coefRight = Array containing the fixed-point spectral coefficients
+                        for the right channel.
+                        [Int32 *, length 1024]
+
+    q_formatLeft = The Q-format for the left channel's fixed-point spectral
+                   coefficients, on a per-scalefactor band, non-grouped basis.
+                   [Int *, length MAX_SFB]
+
+    q_formatRight = The Q-format for the right channel's fixed-point spectral
+                    coefficients, on a per-scalefactor band, non-grouped basis.
+                    [Int *, length MAX_SFB]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coefLeft  = Contains the new spectral information.
+
+    coefRight = Contains the new spectral information.
+
+    q_formatLeft      = Q-format may be updated with changed to fixed-point
+                        data in coefLeft.
+
+    q_formatRight     = Q-format may be updated with changed to fixed-point
+                        data in coefRight.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function steps through all of the tools that are applied on a
+ scalefactor band basis.
+
+ The use of M/S stereo is checked for.  For M/S decoding to take
+ place, ms_mask_map must be TRUE for that particular SFB, AND the Huffman
+ codebook used must be < NOISE_HCB.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.7.1   M/S stereo
+        Subpart 4.6.2     ScaleFactors
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pCoefRight = coefRight;
+    pCoefLeft = coefLeft;
+
+    window_start = 0;
+    tot_sfb = 0;
+
+    coef_per_win = pFrameInfo->coef_per_win[0];
+
+    sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+    DO
+
+        pBand     = pFrameInfo->win_sfb_top[window_start];
+
+        partition = *(pGroup);
+
+        pGroup = pGroup + 1;
+
+        band_start = 0;
+
+        wins_in_group = (partition - window_start);
+
+        FOR (sfb = sfb_per_win; sfb > 0; sfb--)
+
+            band_stop = *(pBand);
+
+            pBand = pBand + 1;
+
+            codebook = *(pCodebookMap);
+
+            pCodebookMap = pCodebookMap + 1;
+
+            mask_enabled = *(pMaskMap);
+
+            pMaskMap = pMaskMap + 1;
+
+            IF (codebook < NOISE_HCB)
+            THEN
+                IF (mask_enabled != FALSE)
+                THEN
+                    band_length = band_stop - band_start;
+
+                    CALL
+                        ms_synt(
+                            wins_in_group,
+                            coef_per_win,
+                            sfb_per_win,
+                            band_length,
+                           &(pCoefLeft[band_start]),
+                           &(pCoefRight[band_start]),
+                           &(q_formatLeft[tot_sfb]),
+                           &(q_formatRight[tot_sfb]) );
+
+                    MODIFYING
+                        &(pCoefLeft[band_start]),
+                        &(pCoefRight[band_start]),
+                        &(q_formatLeft[tot_sfb]),
+                        &(q_formatRight[tot_sfb])
+
+                    RETURNING
+                        None
+                ENDIF
+            ENDIF
+            band_start = band_stop;
+
+            tot_sfb = tot_sfb + 1;
+
+        ENDFOR
+
+        pCoefRight = pCoefRight + coef_per_win * wins_in_group;
+        pCoefLeft  = pCoefLeft  + coef_per_win * wins_in_group;
+
+        wins_in_group = wins_in_group - 1;
+
+        tot_sfb = tot_sfb + sfb_per_win * wins_in_group;
+
+        window_start = partition;
+
+    WHILE (partition < pFrameInfo->num_win);
+
+    return;
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor 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 "pv_audio_type_defs.h"
+#include "apply_ms_synt.h"
+#include "e_huffmanconst.h"
+#include "ms_synt.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 apply_ms_synt(
+    const FrameInfo * const pFrameInfo,
+    const Int        group[],
+    const Bool       mask_map[],
+    const Int        codebook_map[],
+    Int32      coefLeft[],
+    Int32      coefRight[],
+    Int        q_formatLeft[MAXBANDS],
+    Int        q_formatRight[MAXBANDS])
+
+{
+
+    Int32   *pCoefRight;
+
+    Int32   *pCoefLeft;
+
+    Int     tot_sfb;
+    Int     sfb;
+
+    Int     band_length;
+    Int     band_start;
+    Int     band_stop;
+    Int     coef_per_win;
+
+    Int     codebook;
+    Int     partition;
+    Int     window_start;
+
+    Int     sfb_per_win;
+    Int     wins_in_group;
+
+    const Int16 *pBand;
+    const Int   *pCodebookMap  = codebook_map;
+    const Int   *pGroup        = group;
+    const Bool  *pMaskMap      = mask_map;
+
+    Bool mask_enabled;
+
+    pCoefRight = coefRight;
+    pCoefLeft = coefLeft;
+
+    window_start = 0;
+    tot_sfb = 0;
+
+    /*
+     * Each window in the frame should have the same number of coef's,
+     * so coef_per_win is constant in all the loops
+     */
+    coef_per_win = pFrameInfo->coef_per_win[0];
+
+    /*
+     * Because the number of scalefactor bands per window should be
+     * constant for each frame, sfb_per_win can be determined outside
+     * of the loop.
+     *
+     * For 44.1 kHz sampling rate   sfb_per_win = 14 for short windows
+     *                              sfb_per_win = 49 for long  windows
+     */
+
+    sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+    do
+    {
+        pBand     = pFrameInfo->win_sfb_top[window_start];
+
+        /*
+         * Partition is equal to the first window in the next group
+         *
+         * { Group 0    }{      Group 1      }{    Group 2 }{Group 3}
+         * [win 0][win 1][win 2][win 3][win 4][win 5][win 6][win 7]
+         *
+         * pGroup[0] = 2
+         * pGroup[1] = 5
+         * pGroup[2] = 7
+         * pGroup[3] = 8
+         */
+
+        partition = *(pGroup++);
+
+        band_start = 0;
+
+        wins_in_group = (partition - window_start);
+
+        for (sfb = sfb_per_win; sfb > 0; sfb--)
+        {
+            /* band is offset table, band_stop is last coef in band */
+            band_stop = *(pBand++);
+
+            codebook = *(pCodebookMap++);
+
+            mask_enabled = *(pMaskMap++);
+
+            /*
+             * When a codebook < NOISE_HCB is found, apply M/S to that
+             * scalefactorband.
+             *
+             * Example...  sfb[3] == NOISE_HCB
+             *
+             * [ Group 1                                      ]
+             * [win 0                 ][win 1                 ]
+             * [0][1][2][X][4][5][6][7][0][1][2][X][4][5][6][7]
+             *
+             * The for(sfb) steps through the sfb's 0-7 in win 0.
+             *
+             * Finding sfb[3]'s codebook == NOISE_HCB, the code
+             * steps through all the windows in the group (they share
+             * the same scalefactors) and replaces that sfb with noise.
+             */
+
+            if (codebook < NOISE_HCB)
+            {
+                if (mask_enabled != FALSE)
+                {
+                    band_length = band_stop - band_start;
+
+                    ms_synt(
+                        wins_in_group,
+                        coef_per_win,
+                        sfb_per_win,
+                        band_length,
+                        &(pCoefLeft[band_start]),
+                        &(pCoefRight[band_start]),
+                        &(q_formatLeft[tot_sfb]),
+                        &(q_formatRight[tot_sfb]));
+                }
+            }
+            band_start = band_stop;
+
+            tot_sfb++;
+
+        } /* for (sfb) */
+
+        /*
+         * Increment pCoefRight and pCoefLeft by
+         * coef_per_win * the number of windows
+         */
+
+        pCoefRight += coef_per_win * wins_in_group;
+        pCoefLeft  += coef_per_win * wins_in_group--;
+
+        /*
+         * Increase tot_sfb by sfb_per_win times the number of windows minus 1.
+         * The minus 1 comes from the fact that tot_sfb is already pointing
+         * to the first sfb in the 2nd window of the group.
+         */
+        tot_sfb += sfb_per_win * wins_in_group;
+
+        window_start = partition;
+
+    }
+    while (partition < pFrameInfo->num_win);
+
+    /* pFrameInfo->num_win = 1 for long windows, 8 for short_windows */
+
+    return;
+
+} /* apply_ms_synt() */
+
+
diff --git a/media/libstagefright/codecs/aacdec/apply_ms_synt.h b/media/libstagefright/codecs/aacdec/apply_ms_synt.h
new file mode 100644
index 0000000..ed7fb7a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/apply_ms_synt.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/apply_ms_synt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes the function declaration for apply_ms_synt().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef APPLY_MS_SYNT_H
+#define APPLY_MS_SYNT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_frameinfo.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
+----------------------------------------------------------------------------*/
+
+void apply_ms_synt(
+    const FrameInfo * const pFrameInfo,
+    const Int        group[],
+    const Bool       mask_map[],
+    const Int        codebook_map[],
+    Int32      coefLeft[],
+    Int32      coefRight[],
+    Int        q_formatLeft[MAXBANDS],
+    Int        q_formatRight[MAXBANDS]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/apply_tns.cpp b/media/libstagefright/codecs/aacdec/apply_tns.cpp
new file mode 100644
index 0000000..96ecd27
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/apply_tns.cpp
@@ -0,0 +1,424 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: apply_tns.c
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    coef =       Array of input coefficients.
+                 [Int32 *, length 1024]
+
+    q_format   = Array of q-formats, one per scalefactor band, for the
+                 entire frame.  In the case of tns_inv_filter, only the
+                 first element is used, since the input to tns_inv_filter
+                 is all of the same q-format.
+                 [Int * const, length MAX_SFB]
+
+    pFrameInfo = Pointer to structure that holds information about each group.
+                 (long block flag, number of windows, scalefactor bands
+                  per group, etc.)
+                 [const FrameInfo * const]
+
+    pTNS_frame_info = pointer to structure containing the details on each
+                      TNS filter (order, filter coefficients,
+                      coefficient res., etc.)
+                      [TNS_frame_info * const]
+
+    inverse_flag   = TRUE  if inverse filter is to be applied.
+                     FALSE if forward filter is to be applied.
+                     [Bool]
+
+    scratch_Int_buffer = Pointer to scratch memory to store the
+                           filter's state memory.  Used by both
+                           tns_inv_filter.
+                           [Int *, length TNS_MAX_ORDER]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coef[]   = TNS altered data.
+    q_format = q-formats in TNS scalefactor bands may be modified.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    This function applies either the TNS forward or TNS inverse filter, based
+    on inverse_flag being FALSE or TRUE, respectively.
+
+    For the TNS forward filter, the data fed into tns_ar_filter is normalized
+    all to the same q-format.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    The input, coef, should use all 32-bits, else the scaling by tns_ar_filter
+    may eliminate the data.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.8 (Temporal Noise Shaping)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    NO PSEUDO-CODE
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor
+     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 "pv_audio_type_defs.h"
+#include "s_tns_frame_info.h"
+#include "s_tnsfilt.h"
+#include "s_frameinfo.h"
+#include "tns_inv_filter.h"
+#include "tns_ar_filter.h"
+#include "apply_tns.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 apply_tns(
+    Int32                  coef[],
+    Int                    q_format[],
+    const FrameInfo      * const pFrameInfo,
+    TNS_frame_info * const pTNS_frame_info,
+    const Bool                   inverse_flag,
+    Int32                  scratch_Int_buffer[])
+{
+    Int num_tns_bands;
+    Int num_TNS_coef;
+
+    Int f;
+
+    Int tempInt;
+    Int tempInt2;
+
+    Int sfb_per_win;
+    Int sfbWidth;
+
+    Int coef_per_win;
+    Int min_q;
+    Int win;
+
+    Int32 *pCoef = coef;
+    Int32 *pTempCoef;
+
+    Int   *pStartQformat = q_format;
+
+    Int   *pQformat;
+    Int32 *pLpcCoef;
+
+    Int sfb_offset;
+
+    const Int16 *pWinSfbTop;
+
+    TNSfilt *pFilt;
+
+    coef_per_win = pFrameInfo->coef_per_win[0];
+    sfb_per_win  = pFrameInfo->sfb_per_win[0];
+
+    win = 0;
+
+    pLpcCoef = pTNS_frame_info->lpc_coef;
+
+    pFilt = pTNS_frame_info->filt;
+
+    do
+    {
+        for (f = pTNS_frame_info->n_filt[win]; f > 0; f--)
+        {
+            /* Skip to the next filter if the order is 0 */
+            tempInt = pFilt->order;
+
+            if (tempInt > 0)
+            {
+                /*
+                 * Do not call tns_ar_filter or tns_inv_filter
+                 * if the difference
+                 * between start_coef and stop_stop is <= 0.
+                 *
+                 */
+                num_TNS_coef = (pFilt->stop_coef - pFilt->start_coef);
+
+                if (num_TNS_coef > 0)
+                {
+                    if (inverse_flag != FALSE)
+                    {
+                        tns_inv_filter(
+                            &(pCoef[pFilt->start_coef]),
+                            num_TNS_coef,
+                            pFilt->direction,
+                            pLpcCoef,
+                            pFilt->q_lpc,
+                            pFilt->order,
+                            scratch_Int_buffer);
+                    }
+                    else
+                    {
+                        num_tns_bands = (pFilt->stop_band - pFilt->start_band);
+
+                        /*
+                         * pQformat is initialized only once.
+                         *
+                         * Here is how TNS is applied on scalefactor bands
+                         *
+                         * [0][1][2][3][4][5][6][7][8]
+                         *  |                        \
+                         * start_band               stop_band
+                         *
+                         * In this example, TNS would be applied to 8
+                         * scalefactor bands, 0-7.
+                         *
+                         * pQformat is initially set to &(pStartQformat[8])
+                         *
+                         * 1st LOOP
+                         *      Entry: pQformat = &(pStartQformat[8])
+                         *
+                         *      pQformat is pre-decremented 8 times in the
+                         *      search for min_q
+                         *
+                         *      Exit:  pQformat = &(pStartQformat[0])
+                         *
+                         * 2nd LOOP
+                         *      Entry: pQformat = &(pStartQformat[0])
+                         *
+                         *      pQformat is post-incremented 8 times in the
+                         *      normalization of the data loop.
+                         *
+                         *      Exit:  pQformat = &(pStartQformat[8]
+                         *
+                         *
+                         * shift_amt = tns_ar_filter(...)
+                         *
+                         * 3rd LOOP
+                         *      Entry: pQformat = &(pStartQformat[8])
+                         *
+                         *      pQformat is pre-decremented 8 times in the
+                         *      adjustment of the q-format to min_q - shift_amt
+                         *
+                         *      Exit:  pQformat = &(pStartQformat[0])
+                         *
+                         */
+
+                        pQformat =
+                            &(pStartQformat[pFilt->stop_band]);
+
+                        /*
+                         * Scan the array of q-formats and find the minimum over
+                         * the range where the filter is to be applied.
+                         *
+                         * At the end of this scan,
+                         * pQformat = &(q-format[pFilt->start_band]);
+                         *
+                         */
+
+                        min_q = INT16_MAX;
+
+                        for (tempInt = num_tns_bands; tempInt > 0; tempInt--)
+                        {
+                            tempInt2 = *(--pQformat);
+
+                            if (tempInt2 < min_q)
+                            {
+                                min_q = tempInt2;
+                            }
+                        } /* for(tempInt = num_bands; tempInt > 0; tempInt--)*/
+
+                        /*
+                         * Set up the pointers so we can index into coef[]
+                         * on a scalefactor band basis.
+                         */
+                        tempInt = pFilt->start_band;
+
+                        tempInt--;
+
+                        /* Initialize sfb_offset and pWinSfbTop */
+                        if (tempInt >= 0)
+                        {
+                            pWinSfbTop =
+                                &(pFrameInfo->win_sfb_top[win][tempInt]);
+
+                            sfb_offset = *(pWinSfbTop++);
+                        }
+                        else
+                        {
+                            pWinSfbTop = pFrameInfo->win_sfb_top[win];
+                            sfb_offset = 0;
+                        }
+
+                        pTempCoef = pCoef + pFilt->start_coef;
+
+                        /* Scale the data in the TNS bands to min_q q-format */
+                        for (tempInt = num_tns_bands; tempInt > 0; tempInt--)
+                        {
+                            sfbWidth  = *(pWinSfbTop++) - sfb_offset;
+
+                            sfb_offset += sfbWidth;
+
+                            tempInt2 = *(pQformat++) - min_q;
+
+                            /*
+                             * This should zero out the data in one scalefactor
+                             * band if it is so much less than the neighboring
+                             * scalefactor bands.
+                             *
+                             * The only way this "should" happen is if one
+                             * scalefactor band contains zero data.
+                             *
+                             * Zero data can be of any q-format, but we always
+                             * set it very high to avoid the zero-data band being
+                             * picked as the one to normalize to in the scan for
+                             * min_q.
+                             *
+                             */
+                            if (tempInt2 > 31)
+                            {
+                                tempInt2 = 31;
+                            }
+
+                            for (sfbWidth >>= 2; sfbWidth > 0; sfbWidth--)
+                            {
+                                *(pTempCoef++) >>= tempInt2;
+                                *(pTempCoef++) >>= tempInt2;
+                                *(pTempCoef++) >>= tempInt2;
+                                *(pTempCoef++) >>= tempInt2;
+                            }
+
+                        } /* for(tempInt = num_bands; tempInt > 0; tempInt--)*/
+
+                        tempInt2 =
+                            tns_ar_filter(
+                                &(pCoef[pFilt->start_coef]),
+                                num_TNS_coef,
+                                pFilt->direction,
+                                pLpcCoef,
+                                pFilt->q_lpc,
+                                pFilt->order);
+
+                        /*
+                         * Update the q-format for all the scalefactor bands
+                         * taking into account the adjustment caused by
+                         * tns_ar_filter
+                         */
+
+                        min_q -= tempInt2;
+
+                        for (tempInt = num_tns_bands; tempInt > 0; tempInt--)
+                        {
+                            *(--pQformat) = min_q;
+                        }
+
+                    } /* if (inverse_flag != FALSE) */
+
+                } /* if (num_TNS_coef > 0) */
+
+                pLpcCoef += pFilt->order;
+
+            } /* if (tempInt > 0) */
+
+            pFilt++;
+
+        } /* for (f = pTNSinfo->n_filt; f > 0; f--) */
+
+        pCoef += coef_per_win;
+        pStartQformat += sfb_per_win;
+
+        win++;
+
+    }
+    while (win < pFrameInfo->num_win);
+
+    return;
+
+} /* apply_tns() */
diff --git a/media/libstagefright/codecs/aacdec/apply_tns.h b/media/libstagefright/codecs/aacdec/apply_tns.h
new file mode 100644
index 0000000..85fb851
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/apply_tns.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/apply_tns.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated per review comments.
+
+ Description: Changed function prototype to mirror changes made in apply_tns.c
+
+ Description: The scratch memory was mistakenly declared here as type "Int32"
+ It should have been "Int"
+
+ Who:                       Date:
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the function declaration for
+ apply_tns.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef APPLY_TNS_H
+#define APPLY_TNS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_tns_frame_info.h"
+#include "s_frameinfo.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void apply_tns(
+        Int32                  coef[],
+        Int                    q_format[],
+        const FrameInfo      * const pFrameInfo,
+        TNS_frame_info * const pTNS_frame_info,
+        const Bool                   inverse_flag,
+        Int32                  scratch_Int_buffer[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/bit_reversal_swap.h b/media/libstagefright/codecs/aacdec/bit_reversal_swap.h
new file mode 100644
index 0000000..2669f87
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/bit_reversal_swap.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.
+ * -------------------------------------------------------------------
+ */
+/*
+ Pathname: ./include/bit_reversal_swap.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Changed definitions from Int to Int32 for Data[]
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function bit_reversal_swap()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BIT_REVERSAL_SWAP_H
+#define BIT_REVERSAL_SWAP_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+extern const Int Index_64_a[];
+extern const Int Index_64_b[];
+
+extern const Int Index_512_a[];
+extern const Int Index_512_b[];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+void bit_reversal_swap(
+    Int32        Data[],
+    const Int *pIndex_a,
+    const Int *pIndex_b);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* BIT_REVERSAL_SWAP_H */
diff --git a/media/libstagefright/codecs/aacdec/buf_getbits.cpp b/media/libstagefright/codecs/aacdec/buf_getbits.cpp
new file mode 100644
index 0000000..34f4f60
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/buf_getbits.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: buf_getbits.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:   hBitBuf Handle to Bitbuffer
+              n       Number of bits to read
+
+ Return:      bits
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+            Reads n bits from Bitbuffer
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include    "buf_getbits.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
+----------------------------------------------------------------------------*/
+
+UInt32 buf_getbits(BIT_BUFFER * hBitBuf, Int32 n)
+{
+
+    /* read bits from MSB side */
+    if (hBitBuf->buffered_bits <= 16)
+    {
+        hBitBuf->buffer_word    = (hBitBuf->buffer_word << 16) | (*(hBitBuf->char_ptr++) << 8);
+        hBitBuf->buffer_word   |= *(hBitBuf->char_ptr++);
+        hBitBuf->buffered_bits += 16;
+    }
+
+    hBitBuf->buffered_bits -= n;
+    hBitBuf->nrBitsRead    += n;
+
+    return ((hBitBuf->buffer_word >> hBitBuf->buffered_bits) & ((1 << n) - 1));
+
+}
+
+
+UInt32 buf_get_1bit(BIT_BUFFER * hBitBuf)
+{
+
+    /* read bits from MSB side */
+    if (hBitBuf->buffered_bits <= 16)
+    {
+        hBitBuf->buffer_word    = (hBitBuf->buffer_word << 16) | (*(hBitBuf->char_ptr++) << 8);
+        hBitBuf->buffer_word   |= *(hBitBuf->char_ptr++);
+        hBitBuf->buffered_bits += 16;
+    }
+
+    hBitBuf->buffered_bits--;
+    hBitBuf->nrBitsRead++;
+
+    return ((hBitBuf->buffer_word >> hBitBuf->buffered_bits) & 1);
+
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/buf_getbits.h b/media/libstagefright/codecs/aacdec/buf_getbits.h
new file mode 100644
index 0000000..1b5d252
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/buf_getbits.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Filename: buf_getbits.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BUF_GETBITS_H
+#define BUF_GETBITS_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_bit_buffer.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+
+    UInt32 buf_getbits(BIT_BUFFER * hBitBuf, Int32 n);
+
+    UInt32 buf_get_1bit(BIT_BUFFER * hBitBuf);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/buffer_normalization.h b/media/libstagefright/codecs/aacdec/buffer_normalization.h
new file mode 100644
index 0000000..031216a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/buffer_normalization.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/buffer_normalization.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Changed definitions from Int to Int32 for IO_buffer[]
+
+ Description:  Added copyrigth notice, added 'const' definitions to function
+
+ Who:                          Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function buffer_normalization()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef BUFFER_NORMALIZATION_H
+#define BUFFER_NORMALIZATION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define     ALL_ZEROS_BUFFER     -100
+
+/*----------------------------------------------------------------------------
+; 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 buffer_normalization(
+    Int     q_format,
+    Int32   IO_buffer[],
+    const Int     buffer_size,
+    Int   * const pExp);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* BUFFER_NORMALIZATION_H */
diff --git a/media/libstagefright/codecs/aacdec/byte_align.cpp b/media/libstagefright/codecs/aacdec/byte_align.cpp
new file mode 100644
index 0000000..e75c79e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/byte_align.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pInputStream = pointer to a BITS structure that holds information
+                   regarding the input stream.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    pInputStream->usedBits is rounded up to a number that represents the next
+    byte boundary.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Makes the input stream structure pointed to align to the next byte boundary.
+ If it is already at a byte boundary it is left alone.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+  This function shall not use global or static variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void byte_align(
+    BITS  *pInputStream)
+
+    MODIFYING(pInputStream->usedBits = pInputStream->usedBits +
+                (pInputStream->usedBits + 7) % 8)
+
+    RETURN(nothing)
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+
+ STACK USAGE:
+
+     where:
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+
+#include "pv_audio_type_defs.h"
+#include "s_bits.h"
+#include "ibstream.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*
+ * A negative number was used for this mask so that it works on both
+ * 16-bit or 32-bit machines. The mask must be cast to unsigned int to
+ * work with TI compiler, ver 1.80.
+ */
+#define BYTE_ALIGN_MASK    ((UInt)(-8))
+
+#define BYTE_ALIGN_ROUNDUP  7
+
+/*----------------------------------------------------------------------------
+; 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 CODE
+----------------------------------------------------------------------------*/
+void byte_align(
+    BITS  *pInputStream)
+{
+    /*
+     * Round up to the next byte by adding 7 and masking off with
+     * FFF8 or FFFFFFF8. The masking operation is a faster way to
+     * perform modulo arithmetic if the number is a power of 2.
+     *
+     * This code is the same as
+     * pInputStream->usedBits += (pInputStream->usedBits + 7) % 8
+     */
+    pInputStream->usedBits += BYTE_ALIGN_ROUNDUP;
+    pInputStream->usedBits &= BYTE_ALIGN_MASK;
+
+    return;
+}
+
diff --git a/media/libstagefright/codecs/aacdec/calc_auto_corr.cpp b/media/libstagefright/codecs/aacdec/calc_auto_corr.cpp
new file mode 100644
index 0000000..ee32398
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_auto_corr.cpp
@@ -0,0 +1,416 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: calc_auto_corr.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+#include    "calc_auto_corr.h"
+#include    "aac_mem_funcs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#include    "fxp_mul32.h"
+#include    "pv_normalize.h"
+
+#define N   2
+
+/*----------------------------------------------------------------------------
+; 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 calc_auto_corr_LC(struct ACORR_COEFS *ac,
+                       Int32  realBuf[][32],
+                       Int32  bd,
+                       Int32  len)
+{
+    Int32 j;
+    Int32 temp1;
+    Int32 temp3;
+    Int32 temp5;
+
+    int64_t temp_r01r;
+    int64_t temp_r02r;
+    int64_t temp_r11r;
+    int64_t temp_r12r;
+    int64_t temp_r22r;
+    int64_t max = 0;
+
+
+    temp1 = (realBuf[ 0][bd]) >> N;
+    temp3 = (realBuf[-1][bd]) >> N;
+    temp5 = (realBuf[-2][bd]) >> N;
+
+
+    temp_r11r = fxp_mac64_Q31(0, temp3, temp3);   /* [j-1]*[j-1]  */
+    temp_r12r = fxp_mac64_Q31(0, temp3, temp5);   /* [j-1]*[j-2]  */
+    temp_r22r = fxp_mac64_Q31(0, temp5, temp5);   /* [j-2]*[j-2]  */
+
+    temp_r01r = 0;
+    temp_r02r = 0;
+
+    for (j = 1; j < len; j++)
+    {
+        temp_r01r = fxp_mac64_Q31(temp_r01r, temp1, temp3);    /* [j  ]*[j-1]  */
+        temp_r02r = fxp_mac64_Q31(temp_r02r, temp1, temp5);    /* [j  ]*[j-2]  */
+        temp_r11r = fxp_mac64_Q31(temp_r11r, temp1, temp1);    /* [j-1]*[j-1]  */
+
+        temp5 = temp3;
+        temp3 = temp1;
+        temp1 = (realBuf[j][bd]) >> N;
+    }
+
+
+    temp_r22r += temp_r11r;
+    temp_r12r += temp_r01r;          /* [j-1]*[j-2]  */
+
+    temp_r22r  = fxp_mac64_Q31(temp_r22r, -temp3, temp3);
+
+    temp_r01r = fxp_mac64_Q31(temp_r01r, temp1, temp3);
+    temp_r02r = fxp_mac64_Q31(temp_r02r, temp1, temp5);
+
+    max  |= temp_r01r ^(temp_r01r >> 63);
+    max  |= temp_r02r ^(temp_r02r >> 63);
+    max  |= temp_r11r;
+    max  |= temp_r12r ^(temp_r12r >> 63);
+    max  |= temp_r22r;
+
+    if (max)
+    {
+        temp1 = (UInt32)(max >> 32);
+        if (temp1)
+        {
+            temp3 = 33 - pv_normalize(temp1);
+            ac->r01r = (Int32)(temp_r01r >> temp3);
+            ac->r02r = (Int32)(temp_r02r >> temp3);
+            ac->r11r = (Int32)(temp_r11r >> temp3);
+            ac->r12r = (Int32)(temp_r12r >> temp3);
+            ac->r22r = (Int32)(temp_r22r >> temp3);
+
+        }
+        else
+        {
+            temp3 = pv_normalize(((UInt32)max) >> 1) - 2;
+
+            if (temp3 > 0)
+            {
+                ac->r01r = (Int32)(temp_r01r << temp3);
+                ac->r02r = (Int32)(temp_r02r << temp3);
+                ac->r11r = (Int32)(temp_r11r << temp3);
+                ac->r12r = (Int32)(temp_r12r << temp3);
+                ac->r22r = (Int32)(temp_r22r << temp3);
+            }
+            else
+            {
+                temp3 = -temp3;
+                ac->r01r = (Int32)(temp_r01r >> temp3);
+                ac->r02r = (Int32)(temp_r02r >> temp3);
+                ac->r11r = (Int32)(temp_r11r >> temp3);
+                ac->r12r = (Int32)(temp_r12r >> temp3);
+                ac->r22r = (Int32)(temp_r22r >> temp3);
+            }
+
+        }
+
+        /*
+         *  ac->det = ac->r11r*ac->r22r - rel*(ac->r12r*ac->r12r);
+         */
+        /* 1/(1 + 1e-6) == 1 - 1e-6 */
+        /* 2^-20 == 1e-6 */
+        ac->det  = fxp_mul32_Q30(ac->r12r, ac->r12r);
+
+        ac->det -= ac->det >> 20;
+
+        ac->det  = fxp_mul32_Q30(ac->r11r, ac->r22r) - ac->det;
+    }
+    else
+    {
+        pv_memset((void *)ac, 0, sizeof(struct ACORR_COEFS));
+    }
+
+
+}
+
+
+#ifdef HQ_SBR
+
+
+void calc_auto_corr(struct ACORR_COEFS *ac,
+                    Int32  realBuf[][32],
+                    Int32  imagBuf[][32],
+                    Int32  bd,
+                    Int32  len)
+{
+
+
+    Int32 j;
+    Int32 temp1;
+    Int32 temp2;
+    Int32 temp3;
+    Int32 temp4;
+    Int32 temp5;
+    Int32 temp6;
+
+    int64_t accu1 = 0;
+    int64_t accu2 = 0;
+    int64_t accu3 = 0;
+    int64_t accu4 = 0;
+    int64_t accu5 = 0;
+
+
+    int64_t temp_r12r;
+    int64_t temp_r12i;
+    int64_t temp_r22r;
+    int64_t max = 0;
+
+
+    temp1 = realBuf[0  ][bd] >> N;
+    temp2 = imagBuf[0  ][bd] >> N;
+    temp3 = realBuf[0-1][bd] >> N;
+    temp4 = imagBuf[0-1][bd] >> N;
+    temp5 = realBuf[0-2][bd] >> N;
+    temp6 = imagBuf[0-2][bd] >> N;
+
+    temp_r22r =  fxp_mac64_Q31(0, temp5, temp5);
+    temp_r22r =  fxp_mac64_Q31(temp_r22r, temp6, temp6);
+    temp_r12r =  fxp_mac64_Q31(0, temp3, temp5);
+    temp_r12r =  fxp_mac64_Q31(temp_r12r, temp4, temp6);
+    temp_r12i = -fxp_mac64_Q31(0, temp3, temp6);
+    temp_r12i =  fxp_mac64_Q31(temp_r12i, temp4, temp5);
+
+    for (j = 1; j < len; j++)
+    {
+        accu1  = fxp_mac64_Q31(accu1, temp3, temp3);
+        accu1  = fxp_mac64_Q31(accu1, temp4, temp4);
+        accu2  = fxp_mac64_Q31(accu2, temp1, temp3);
+        accu2  = fxp_mac64_Q31(accu2, temp2, temp4);
+        accu3  = fxp_mac64_Q31(accu3, temp2, temp3);
+        accu3  = fxp_mac64_Q31(accu3, -temp1, temp4);
+        accu4  = fxp_mac64_Q31(accu4, temp1, temp5);
+        accu4  = fxp_mac64_Q31(accu4, temp2, temp6);
+        accu5  = fxp_mac64_Q31(accu5, temp2, temp5);
+        accu5  = fxp_mac64_Q31(accu5, -temp1, temp6);
+
+        temp5 = temp3;
+        temp6 = temp4;
+        temp3 = temp1;
+        temp4 = temp2;
+        temp1 = realBuf[j][bd] >> N;
+        temp2 = imagBuf[j][bd] >> N;
+    }
+
+
+    temp_r22r += accu1;
+    temp_r12r += accu2;
+    temp_r12i += accu3;
+
+
+    accu1  = fxp_mac64_Q31(accu1, temp3, temp3);
+    accu1  = fxp_mac64_Q31(accu1, temp4, temp4);
+    accu2  = fxp_mac64_Q31(accu2, temp1, temp3);
+    accu2  = fxp_mac64_Q31(accu2, temp2, temp4);
+    accu3  = fxp_mac64_Q31(accu3, temp2, temp3);
+    accu3  = fxp_mac64_Q31(accu3, -temp1, temp4);
+    accu4  = fxp_mac64_Q31(accu4, temp1, temp5);
+    accu4  = fxp_mac64_Q31(accu4, temp2, temp6);
+    accu5  = fxp_mac64_Q31(accu5, temp2, temp5);
+    accu5  = fxp_mac64_Q31(accu5, -temp1, temp6);
+
+
+    max  |= accu5 ^(accu5 >> 63);
+    max  |= accu4 ^(accu4 >> 63);
+    max  |= accu3 ^(accu3 >> 63);
+    max  |= accu2 ^(accu2 >> 63);
+    max  |= accu1;
+    max  |= temp_r12r ^(temp_r12r >> 63);
+    max  |= temp_r12i ^(temp_r12i >> 63);
+    max  |= temp_r22r;
+
+    if (max)
+    {
+
+        temp1 = (UInt32)(max >> 32);
+        if (temp1)
+        {
+            temp1 = 34 - pv_normalize(temp1);
+            ac->r11r = (Int32)(accu1 >> temp1);
+            ac->r01r = (Int32)(accu2 >> temp1);
+            ac->r01i = (Int32)(accu3 >> temp1);
+            ac->r02r = (Int32)(accu4 >> temp1);
+            ac->r02i = (Int32)(accu5 >> temp1);
+            ac->r12r = (Int32)(temp_r12r >> temp1);
+            ac->r12i = (Int32)(temp_r12i >> temp1);
+            ac->r22r = (Int32)(temp_r22r >> temp1);
+        }
+        else
+        {
+            temp1 = pv_normalize(((UInt32)max) >> 1) - 3;
+
+            if (temp1 > 0)
+            {
+                ac->r11r = (Int32)(accu1 << temp1);
+                ac->r01r = (Int32)(accu2 << temp1);
+                ac->r01i = (Int32)(accu3 << temp1);
+                ac->r02r = (Int32)(accu4 << temp1);
+                ac->r02i = (Int32)(accu5 << temp1);
+                ac->r12r = (Int32)(temp_r12r << temp1);
+                ac->r12i = (Int32)(temp_r12i << temp1);
+                ac->r22r = (Int32)(temp_r22r << temp1);
+            }
+            else
+            {
+                temp1 = -temp1;
+                ac->r11r = (Int32)(accu1 >> temp1);
+                ac->r01r = (Int32)(accu2 >> temp1);
+                ac->r01i = (Int32)(accu3 >> temp1);
+                ac->r02r = (Int32)(accu4 >> temp1);
+                ac->r02i = (Int32)(accu5 >> temp1);
+                ac->r12r = (Int32)(temp_r12r >> temp1);
+                ac->r12i = (Int32)(temp_r12i >> temp1);
+                ac->r22r = (Int32)(temp_r22r >> temp1);
+            }
+
+        }
+
+        /*
+         *  ac->det = ac->r11r*ac->r22r - rel*(ac->r12r*ac->r12r);
+         */
+        /* 1/(1 + 1e-6) == 1 - 1e-6 */
+        /* 2^-20 == 1e-6 */
+
+        ac->det =   fxp_mul32_Q29(ac->r12i, ac->r12i);
+        ac->det =   fxp_mac32_Q29(ac->r12r, ac->r12r, ac->det);
+
+        ac->det -= ac->det >> 20;
+
+        ac->det =  -fxp_msu32_Q29(ac->r11r, ac->r22r, ac->det);
+
+    }
+    else
+    {
+        pv_memset((void *)ac, 0, sizeof(struct ACORR_COEFS));
+    }
+
+}
+
+#endif
+
+
+
+
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/calc_auto_corr.h b/media/libstagefright/codecs/aacdec/calc_auto_corr.h
new file mode 100644
index 0000000..0f0dae2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_auto_corr.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: calc_auto_corr.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CALC_AUTO_CORR_H
+#define CALC_AUTO_CORR_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+
+struct ACORR_COEFS
+{
+    Int32  r11r;
+    Int32  r01r;
+    Int32  r02r;
+    Int32  r12r;
+    Int32  r22r;
+#ifdef HQ_SBR
+    Int32  r01i;
+    Int32  r02i;
+    Int32  r12i;
+#endif
+    Int32  det;
+};
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void calc_auto_corr_LC(struct ACORR_COEFS *ac,
+    Int32  realBuf[][32],
+    Int32  bd,
+    Int32  len);
+
+
+#ifdef HQ_SBR
+
+    void calc_auto_corr(struct ACORR_COEFS *ac,
+                        Int32  realBuf[][32],
+                        Int32  imagBuf[][32],
+                        Int32  bd,
+                        Int32  len);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/calc_gsfb_table.cpp b/media/libstagefright/codecs/aacdec/calc_gsfb_table.cpp
new file mode 100644
index 0000000..4047502
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_gsfb_table.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/calc_gsfb_table.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description: (1) Modified to bring in-line with PV standards
+              (2) Removed if(pFrameInfo->islong), only short windows will
+                  call this routine from getics.c
+
+ Description: Modified per review comments
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pFrameInfo  = pointer to structure that holds information for current
+                  frame. Data type FrameInfo
+
+    group[]     = array that contains the grouping information of short
+                  windows (stop index of windows in each group).
+                  Data type Int
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    pFrameInfo -> frame_sfb_top   contains the cumulative bandwidth of
+                                    scalefactor bands in each group
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function is only invoked when short windows are present. It calculates
+ the number of groups in one frame, and the scalefactor bandwidth of each
+ scalefactor band in each group.
+ All windows within one group share the same scalefactors and are interleaved
+ on a scalefactor band basis. Within each group, the actual length of one
+ scalefactor band equals to the number of windows times the number of
+ coefficients in a regular scalefactor band.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall replace the contents of pFrameInfo->frame_sfb_top
+ with the cumulative bandwidth of each scalefactor band in each group
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4       p54.    4.5.2.3.2   decoding process
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    offset      = 0;
+    group_idx   = 0;
+
+    DO
+        pFrameInfo->group_len[group_idx] = group[group_idx] - offset;
+        offset = group[group_idx];
+        group_idx++;
+
+    WHILE (offset < NUM_SHORT_WINDOWS);
+
+
+    pFrameInfo->num_groups = group_idx;
+
+    pFrameSfbTop = pFrameInfo->frame_sfb_top;
+    offset = 0;
+
+    FOR (group_idx = 0; group_idx < pFrameInfo->num_groups; group_idx++)
+
+        len = pFrameInfo->group_len[group_idx];
+
+        FOR (sfb = 0; sfb < pFrameInfo->sfb_per_win[group_idx]; sfb++)
+
+            offset += pFrameInfo->sfb_width_128[sfb] * len;
+            *pFrameSfbTop++ = offset;
+
+        ENDFOR
+
+    ENDFOR
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "huffman.h"
+#include    "aac_mem_funcs.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  calc_gsfb_table(
+    FrameInfo   *pFrameInfo,
+    Int         group[])
+{
+
+    Int      group_idx;
+    Int      offset;
+    Int     *pFrameSfbTop;
+    Int     *pSfbWidth128;
+    Int      sfb;
+    Int      nsfb;
+    Int      len;
+    Int      ngroups;
+
+    /* clear out the default values set by infoinit */
+    /* */
+    pv_memset(pFrameInfo->frame_sfb_top,
+              0,
+              MAXBANDS*sizeof(pFrameInfo->frame_sfb_top[0]));
+    /* */
+    /* first calculate the group length*/
+    offset      = 0;
+    ngroups     = 0;
+    do
+    {
+        pFrameInfo->group_len[ngroups] = group[ngroups] - offset;
+        offset = group[ngroups];
+        ngroups++;
+
+    }
+    while (offset < NUM_SHORT_WINDOWS);
+
+
+    /* calculate the cumulative scalefactor bandwidth for one frame */
+    pFrameInfo->num_groups = ngroups;
+
+    pFrameSfbTop = pFrameInfo->frame_sfb_top;
+    offset = 0;
+
+
+    for (group_idx = 0; group_idx < ngroups; group_idx++)
+    {
+        len  = pFrameInfo->group_len[  group_idx];
+        nsfb = pFrameInfo->sfb_per_win[group_idx];
+
+        pSfbWidth128 = pFrameInfo->sfb_width_128;
+
+        for (sfb = nsfb; sfb > 0; sfb--)
+        {
+            offset += *pSfbWidth128++ * len;
+            *pFrameSfbTop++ = offset;
+        }
+    }
+
+
+} /* calc_gsfb_table */
+
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.cpp b/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.cpp
new file mode 100644
index 0000000..5ec3f69
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.cpp
@@ -0,0 +1,360 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: calc_sbr_anafilterbank.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "calc_sbr_anafilterbank.h"
+#include    "qmf_filterbank_coeff.h"
+#include    "analysis_sub_band.h"
+
+#include    "aac_mem_funcs.h"
+#include    "fxp_mul32.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 calc_sbr_anafilterbank_LC(Int32 * Sr,
+                               Int16 * X,
+                               Int32 scratch_mem[][64],
+                               Int32 maxBand)
+{
+
+    Int i;
+    Int32   *p_Y_1;
+    Int32   *p_Y_2;
+
+    Int16 * pt_X_1;
+    Int16 * pt_X_2;
+    Int32 realAccu1;
+    Int32 realAccu2;
+
+    Int32 tmp1;
+    Int32 tmp2;
+
+
+    const Int32 * pt_C;
+
+    p_Y_1 = scratch_mem[0];
+
+
+    p_Y_2 = p_Y_1 + 63;
+    pt_C   = &sbrDecoderFilterbankCoefficients_an_filt_LC[0];
+
+    pt_X_1 = X;
+
+
+    realAccu1  =  fxp_mul32_by_16(Qfmt27(-0.51075594183097F),   pt_X_1[-192]);
+
+    realAccu1  =  fxp_mac32_by_16(Qfmt27(-0.51075594183097F), -pt_X_1[-128], realAccu1);
+    realAccu1  =  fxp_mac32_by_16(Qfmt27(-0.01876919066980F),  pt_X_1[-256], realAccu1);
+    *(p_Y_1++) =  fxp_mac32_by_16(Qfmt27(-0.01876919066980F), -pt_X_1[ -64], realAccu1);
+
+
+    /* create array Y */
+
+    pt_X_1 = &X[-1];
+    pt_X_2 = &X[-319];
+
+
+    for (i = 15; i != 0; i--)
+    {
+        tmp1 = *(pt_X_1--);
+        tmp2 = *(pt_X_2++);
+
+        realAccu1  = fxp_mul32_by_16(*(pt_C), tmp1);
+        realAccu2  = fxp_mul32_by_16(*(pt_C++), tmp2);
+        tmp1 = pt_X_1[ -63];
+        tmp2 = pt_X_2[ +63];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -127];
+        tmp2 = pt_X_2[ +127];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -191];
+        tmp2 = pt_X_2[ +191];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -255];
+        tmp2 = pt_X_2[ +255];
+        *(p_Y_1++) = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        *(p_Y_2--) = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+
+        tmp1 = *(pt_X_1--);
+        tmp2 = *(pt_X_2++);
+        realAccu1  = fxp_mul32_by_16(*(pt_C), tmp1);
+        realAccu2  = fxp_mul32_by_16(*(pt_C++), tmp2);
+
+        tmp1 = pt_X_1[ -63];
+        tmp2 = pt_X_2[ +63];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -127];
+        tmp2 = pt_X_2[ +127];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -191];
+        tmp2 = pt_X_2[ +191];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -255];
+        tmp2 = pt_X_2[ +255];
+        *(p_Y_1++) = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        *(p_Y_2--) = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+
+    }
+
+
+    tmp1 = *(pt_X_1--);
+    tmp2 = *(pt_X_2++);
+    realAccu1  = fxp_mul32_by_16(*(pt_C), tmp1);
+    realAccu2  = fxp_mul32_by_16(*(pt_C++), tmp2);
+
+    tmp1 = pt_X_1[ -63];
+    tmp2 = pt_X_2[ +63];
+    realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+    realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+    tmp1 = pt_X_1[ -127];
+    tmp2 = pt_X_2[ +127];
+    realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+    realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+    tmp1 = pt_X_1[ -191];
+    tmp2 = pt_X_2[ +191];
+    realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+    realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+    tmp1 = pt_X_1[ -255];
+    tmp2 = pt_X_2[ +255];
+    *(p_Y_1++) = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+    *(p_Y_2--) = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+
+
+    pt_X_1 = X;
+
+    realAccu2  = fxp_mul32_by_16(Qfmt27(0.00370548843500F), X[ -32]);
+
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.00370548843500F), pt_X_1[-288], realAccu2);
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.09949460091720F), pt_X_1[ -96], realAccu2);
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.09949460091720F), pt_X_1[-224], realAccu2);
+    *(p_Y_1++) = fxp_mac32_by_16(Qfmt27(1.20736865027288F), pt_X_1[-160], realAccu2);
+
+
+    analysis_sub_band_LC(scratch_mem[0],
+                         Sr,
+                         maxBand,
+                         (Int32(*)[64])scratch_mem[1]);
+
+}
+
+
+
+#ifdef HQ_SBR
+
+void calc_sbr_anafilterbank(Int32 * Sr,
+                            Int32 * Si,
+                            Int16 * X,
+                            Int32 scratch_mem[][64],
+                            Int32   maxBand)
+{
+    Int i;
+    Int32   *p_Y_1;
+    Int32   *p_Y_2;
+
+
+
+
+    const Int32 * pt_C;
+    Int16 * pt_X_1;
+    Int16 * pt_X_2;
+    Int32 realAccu1;
+    Int32 realAccu2;
+
+    Int32 tmp1;
+    Int32 tmp2;
+
+
+    p_Y_1 = scratch_mem[0];
+
+
+    p_Y_2 = p_Y_1 + 63;
+    pt_C   = &sbrDecoderFilterbankCoefficients_an_filt[0];
+
+    realAccu1  =  fxp_mul32_by_16(Qfmt27(-0.36115899F),   X[-192]);
+
+
+    realAccu1  =  fxp_mac32_by_16(Qfmt27(-0.36115899F),  -X[-128], realAccu1);
+    realAccu1  =  fxp_mac32_by_16(Qfmt27(-0.013271822F),  X[-256], realAccu1);
+    *(p_Y_1++) =  fxp_mac32_by_16(Qfmt27(-0.013271822F), -X[ -64], realAccu1);
+
+    /* create array Y */
+
+    pt_X_1 = &X[-1];
+    pt_X_2 = &X[-319];
+
+
+    for (i = 31; i != 0; i--)
+    {
+        tmp1 = *(pt_X_1--);
+        tmp2 = *(pt_X_2++);
+        realAccu1  = fxp_mul32_by_16(*(pt_C), tmp1);
+        realAccu2  = fxp_mul32_by_16(*(pt_C++), tmp2);
+        tmp1 = pt_X_1[ -63];
+        tmp2 = pt_X_2[  63];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -127];
+        tmp2 = pt_X_2[  127];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -191];
+        tmp2 = pt_X_2[  191];
+        realAccu1  = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        realAccu2  = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+        tmp1 = pt_X_1[ -255];
+        tmp2 = pt_X_2[  255];
+        *(p_Y_1++) = fxp_mac32_by_16(*(pt_C), tmp1, realAccu1);
+        *(p_Y_2--) = fxp_mac32_by_16(*(pt_C++), tmp2, realAccu2);
+    }
+
+
+    realAccu2  = fxp_mul32_by_16(Qfmt27(0.002620176F), X[ -32]);
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.002620176F), X[-288], realAccu2);
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.070353307F), X[ -96], realAccu2);
+    realAccu2  = fxp_mac32_by_16(Qfmt27(0.070353307F), X[-224], realAccu2);
+
+
+    *(p_Y_1++) = fxp_mac32_by_16(Qfmt27(0.85373856F), (X[-160]), realAccu2);
+
+
+    analysis_sub_band(scratch_mem[0],
+                      Sr,
+                      Si,
+                      maxBand,
+                      (Int32(*)[64])scratch_mem[1]);
+
+}
+
+
+#endif
+
+
+
+#endif   /*  AAC_PLUS */
+
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.h b/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.h
new file mode 100644
index 0000000..c93848e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_anafilterbank.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: calc_sbr_anafilterbank.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CALC_SBR_ANAFILTERBANK_H
+#define CALC_SBR_ANAFILTERBANK_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+#define ROUND_ANAFIL     0
+//#define ROUND_ANAFIL     0
+#define ROUND_ANAFIL_LC  (0)
+
+    /*----------------------------------------------------------------------------
+    ; 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 calc_sbr_anafilterbank_LC(Int32 * Sr,
+    Int16 * X,
+    Int32 scratch_mem[][64],
+    Int32 maxBand);
+
+
+#ifdef HQ_SBR
+
+    void calc_sbr_anafilterbank(Int32 * Sr,
+                                Int32 * Si,
+                                Int16 * X,
+                                Int32 scratch_mem[][64],
+                                Int32 maxBand);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /*  CALC_SBR_ANAFILTERBANK_H */
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_envelope.cpp b/media/libstagefright/codecs/aacdec/calc_sbr_envelope.cpp
new file mode 100644
index 0000000..4fb35351
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_envelope.cpp
@@ -0,0 +1,2203 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+ Filename: calc_sbr_envelope.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "calc_sbr_envelope.h"
+#include    "sbr_envelope_calc_tbl.h"
+#include    "sbr_create_limiter_bands.h"
+#include    "aac_mem_funcs.h"
+
+#include    "fxp_mul32.h"
+#include    "pv_normalize.h"
+
+#include    "sbr_aliasing_reduction.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#include    "pv_sqrt.h"
+
+#include    "pv_div.h"
+#include    "fxp_mul32.h"
+#include    "pv_normalize.h"
+
+#define Q30fmt(x)   (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F))
+#define Q28fmt(x)   (Int32)(x*((Int32)1<<28) + (x>=0?0.5F:-0.5F))
+#define Q15fmt(x)   (Int32)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void envelope_application_LC(Int32  *aBufR,
+    Int32  *nrg_gain_man,
+    Int32  *nrg_gain_exp,
+    Int32  *noise_level_man,
+    Int32  *noise_level_exp,
+    Int32  *nrg_tone_man,
+    Int32  *nrg_tone_exp,
+    Int32  band_nrg_tone_detector,
+    const Int32 *frame_info,
+    Int32  *harm_index,
+    Int32  *phase_index,
+    Int32  i,
+    Int32  lowSubband,
+    Int32  noSubbands,
+    Int32  noNoiseFlag);
+
+
+    void energy_estimation_LC(Int32 *aBufR,
+                              Int32 *nrg_est_man,
+                              Int32 *nrg_est_exp,
+                              const Int32 *frame_info,
+                              Int32 i,
+                              Int32 k,
+                              Int32 c,
+                              Int32 ui2);
+
+#ifdef HQ_SBR
+
+
+    void envelope_application(Int32  *aBufR,
+                              Int32  *aBufI,
+                              Int32  *nrg_gain_man,
+                              Int32  *nrg_gain_exp,
+                              Int32  *noise_level_man,
+                              Int32  *noise_level_exp,
+                              Int32  *nrg_tone_man,
+                              Int32  *nrg_tone_exp,
+                              Int32 *fBuf_man[64],
+                              Int32 *fBuf_exp[64],
+                              Int32 *fBufN_man[64],
+                              Int32 *fBufN_exp[64],
+                              const Int32 *frame_info,
+                              Int32  *harm_index,
+                              Int32  *phase_index,
+                              Int32  i,
+                              Int32  lowSubband,
+                              Int32  noSubbands,
+                              Int32  noNoiseFlag,
+                              Int32  band_nrg_tone_detector,
+                              Int32  maxSmoothLength,
+                              Int32  smooth_length);
+
+
+    void energy_estimation(Int32 *aBufR,
+                           Int32 *aBufI,
+                           Int32 *nrg_est_man,
+                           Int32 *nrg_est_exp,
+                           const Int32 *frame_info,
+                           Int32 i,
+                           Int32 k,
+                           Int32 c,
+                           Int32 ui2);
+
+#endif
+
+#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 calc_sbr_envelope(SBR_FRAME_DATA *frameData,
+                       Int32 *aBufR,
+                       Int32 *aBufI,
+                       Int freqBandTable1[2][MAX_FREQ_COEFFS + 1],
+                       const Int32 *nSfb,
+                       Int32 freqBandTable2[MAX_NOISE_COEFFS + 1],
+                       Int32 nNBands,
+                       Int32 reset,
+                       Int32 *degreeAlias,
+                       Int32 *harm_index,
+                       Int32 *phase_index,
+                       Int32 hFp[64],
+                       Int32 *sUp,
+                       Int32 limSbc[][13],
+                       Int32 *gateMode,
+#ifdef HQ_SBR
+                       Int32 *fBuf_man[64],
+                       Int32 *fBuf_exp[64],
+                       Int32 *fBufN_man[64],
+                       Int32 *fBufN_exp[64],
+#endif
+                       Int32 scratch_mem[][64],
+                       struct PATCH Patch,
+                       Int32  sqrt_cache[][4],
+                       Int32  LC_flag)
+{
+
+    Int32 c;
+    Int32 li;
+    Int32 ui;
+    Int32 i;
+    Int32 j;
+    Int32 k = 0;
+    Int32 l;
+    Int m = 0;
+    Int kk = 0;
+    Int o;
+    Int next = -1;
+    Int32 ui2;
+    Int flag;
+    Int noNoiseFlag;
+    Int *ptr;
+
+
+    UInt32 nrg = 0;
+    Int32 nrg_exp = 0;
+    struct intg_div   quotient;
+    struct intg_sqrt  root_sq;
+
+    Int32 aux1;
+
+    Int32 *nL_man       = frameData->sbrNoiseFloorLevel_man;
+    Int32 *nL_exp       = frameData->sbrNoiseFloorLevel_exp;
+
+    Int32 *sfb_nrg_man  = frameData->iEnvelope_man;
+    Int32 *sfb_nrg_exp  = frameData->iEnvelope_exp;
+
+    Int32 tmp_q1;
+    Int32 tmp_q2;
+
+    Int32 g_max_man;
+    Int32 g_max_exp;
+
+    Int32 p_ref_man;
+    Int32 p_ref_exp;
+
+    Int32 p_est_man;
+    Int32 p_est_exp;
+
+    Int32 p_adj_man;
+    Int32 p_adj_exp;
+    Int32 avg_gain;
+
+    Int32 boost_gain_q;
+
+    Int32 band_nrg_tone_detector;
+
+    Int32 *nrg_est_man     = scratch_mem[0];
+    Int32 *nrg_est_exp     = scratch_mem[1];
+    Int32 *nrg_ref_man     = scratch_mem[2];
+    Int32 *nrg_ref_exp     = scratch_mem[3];
+    Int32 *nrg_gain_man    = scratch_mem[4];
+    Int32 *nrg_gain_exp    = scratch_mem[5];
+    Int32 *noise_level_man = scratch_mem[6];
+    Int32 *noise_level_exp = scratch_mem[7];
+    Int32 *nrg_tone_man    = scratch_mem[8];
+    Int32 *nrg_tone_exp    = scratch_mem[9];
+    Int32 *hF              = scratch_mem[10];
+
+
+
+    const Int32 *frame_info = frameData->frameInfo;
+    Int32 int_mode          = frameData->sbr_header.interpolFreq;
+
+
+
+
+
+    Int32 dontUseTheseGainValues[64];
+
+#ifdef HQ_SBR
+
+    Int32 n;
+    Int32 smooth_length;
+    Int32 smoothingLength   = frameData->sbr_header.smoothingLength;
+    Int32 maxSmoothLength   = smoothLengths[0];
+
+#endif
+
+    Int32 limiterBand       = frameData->sbr_header.limiterBands;
+    Int32 limiterGains      = frameData->sbr_header.limiterGains;
+    Int32 *addHarmonics     = frameData->addHarmonics;
+
+    Int32 lowSubband        = freqBandTable1[LOW_RES][0];
+    Int32 noSubbands        = freqBandTable1[LOW_RES][nSfb[LOW_RES]] - lowSubband;
+    Int32 nEnv              = frame_info[0];
+    Int32 sEnv              = frame_info[(nEnv + 1)<<1];
+
+    /* ensure that noSubbands in the range [0,64] */
+    noSubbands = (noSubbands >> 31) ^ noSubbands;
+    if (noSubbands > 64)
+    {
+        noSubbands = 64;
+    }
+
+    if (reset)
+    {
+        *sUp = 1;
+        *phase_index = 0;
+        sbr_create_limiter_bands(limSbc,
+                                 gateMode,
+                                 freqBandTable1[LOW_RES],
+                                 Patch,
+                                 nSfb[LOW_RES]);
+    }
+
+    /* Mapping. */
+    pv_memset((void*)hF, 0, (sizeof(*hF) << 6));
+
+    ptr  = freqBandTable1[HI];
+    l = *(ptr++);
+
+    for (i = nSfb[HI]; i != 0; i--)
+    {
+        k     = *(ptr++);
+        j     = ((k + l) >> 1) - lowSubband;
+        l   = k;
+        hF[j] = *(addHarmonics++);
+    }
+
+
+    /* Envelope adjustment. */
+
+    for (i = 0; i < nEnv; i++)
+    {
+
+        if (frame_info[1+i] == frame_info[(nEnv<<1)+4+kk])
+        {
+            kk++, next++;
+        }
+
+        noNoiseFlag = (i == sEnv || i == frameData->prevEnvIsShort) ? 1 : 0;
+
+#ifdef HQ_SBR
+        smooth_length = (noNoiseFlag ? 0 : smoothLengths[smoothingLength]);
+#endif
+
+
+        /* Estimate levels. */
+        c = 0;
+        o = 0;
+
+        band_nrg_tone_detector = 0;
+
+        Int kkkk = freqBandTable1[ frame_info[nEnv+2+i] ][0];
+
+        for (j = 0; j <  nSfb[frame_info[nEnv+2+i]]; j++)
+        {
+            li = freqBandTable1[ frame_info[nEnv+2+i] ][j    ];
+            ui = freqBandTable1[ frame_info[nEnv+2+i] ][j + 1];
+            flag = 0;
+
+            for (k = li; k < ui; k++)
+            {                               /* Calculate the average energy over the current envelope, */
+                ui2   = (frame_info[1+i] << 1);
+
+                if (LC_flag == ON)
+                {
+                    energy_estimation_LC((Int32 *)aBufR,
+                                         nrg_est_man,
+                                         nrg_est_exp,
+                                         frame_info,
+                                         i,
+                                         k - kkkk,
+                                         c,
+                                         ui2);
+                }
+#ifdef HQ_SBR
+                else
+                {
+
+                    energy_estimation((Int32 *)aBufR,
+                                      (Int32 *)aBufI,
+                                      nrg_est_man,
+                                      nrg_est_exp,
+                                      frame_info,
+                                      i,
+                                      k - kkkk,
+                                      c,
+                                      ui2);
+                }
+#endif
+
+                flag = (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ? 1 : flag;
+                c++;
+            }
+
+
+            ui2 = freqBandTable2[o+1];
+
+            if (!int_mode)
+            {                                /* If no interpolation is used,   */
+
+                tmp_q1 = -100;
+
+                for (k = c - (ui - li); k < c; k++)
+                {
+                    if (tmp_q1 < nrg_est_exp[k])
+                    {
+                        tmp_q1 = nrg_est_exp[k];
+                    }
+                }
+
+                nrg = 0;
+                for (k = c - (ui - li); k < c; k++)
+                {    /* average the energy in all the QMF bands, */
+                    nrg += nrg_est_man[k] >> (tmp_q1 - nrg_est_exp[k]); /* for the whole scalefactor band.  */
+                }
+                nrg /= (ui - li);
+                nrg_exp = tmp_q1;
+
+            }
+
+            c -= (ui - li);
+
+            for (k = 0; k < ui - li; k++)
+            {
+                o = (k + li >= ui2) ? o + 1 : o;
+                ui2 = freqBandTable2[o+1];
+                /*
+                 *  If no interpolation is used, use the averaged energy from above,
+                 *  otherwise do nothing.
+                 */
+
+
+                if (!int_mode)
+                {
+                    nrg_est_man[c] = nrg;
+                    nrg_est_exp[c] = nrg_exp;
+                }
+
+                if (LC_flag == ON)
+                {
+                    nrg_est_exp[c] += 1;
+
+                    if (flag)
+                    {
+                        dontUseTheseGainValues[k + li - lowSubband] = 1;
+                    }
+                    else
+                    {
+                        dontUseTheseGainValues[k + li - lowSubband] = 0;
+                    }
+                }
+
+                nrg_ref_man[c] = sfb_nrg_man[m];
+                nrg_ref_exp[c] = sfb_nrg_exp[m];
+
+                /*
+                 *  compute nL/(1 + nL);   where nL = nL_man*2^nL_exp
+                 */
+                aux1 = next * nNBands + o;
+
+                tmp_q1 = nL_exp[aux1];
+
+                if (tmp_q1 >= 0)
+                {
+                    pv_div(nL_man[aux1], nL_man[aux1] + (0x3FFFFFFF >> tmp_q1), &quotient);
+                }
+                else
+                {
+                    tmp_q1 = nL_man[aux1] >> (-tmp_q1);
+                    pv_div(tmp_q1, tmp_q1 + 0x3FFFFFFF, &quotient);
+                }
+
+                /*
+                 *  tmp_q1 = nL/(1 + nL)*nrg_ref[c];
+                 */
+
+                tmp_q1 = fxp_mul32_Q30(quotient.quotient >> quotient.shift_factor,  nrg_ref_man[c]);
+
+                if (flag)
+                {
+                    /*
+                     *  Calculate levels and gain, dependent on whether a synthetic, a sine is present or not.
+                     *
+                     *  nrg_gain[c]=(float)pv_sqrt( tmp/(nrg_est[c] + 1), sqrt_cache[1] );
+                     */
+
+
+                    pv_div(tmp_q1, nrg_est_man[c] + 1, &quotient);
+                    /*
+                     *  nrg_est_man[c] is an integer number, while tmp_q1 and quotient.quotient
+                     *  are fractions in Q30
+                     */
+
+                    tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30;
+
+                    pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[1]);
+                    nrg_gain_man[c] = root_sq.root;     /*  in Q28 format */
+                    nrg_gain_exp[c] = root_sq.shift_factor;
+
+
+                    /*
+                     *  nrg_tone[c]=(float)( (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ?
+                     *                          pv_sqrt(nrg_ref[c]/(1+tmp_nL), sqrt_cache[2]) : 0);
+                     */
+                    if (hF[c] && (i >= sEnv || hFp[c+lowSubband]))
+                    {
+                        /*
+                         *  nrg_ref[c] and  nL, as well as quotient.quotient
+                         *  are fractions in Q30
+                         */
+
+                        /*  aux1 == next*nNBands + o */
+
+                        tmp_q2 = nL_exp[aux1];
+                        /*
+                         *  nrg_ref[c]/(1+tmp_nL)
+                         */
+
+                        if (tmp_q2 >= 0)
+                        {
+                            pv_div(nrg_ref_man[c], nL_man[aux1] + (0x3FFFFFFF >> tmp_q2), &quotient);
+                        }
+                        else
+                        {
+                            tmp_q2 = nL_man[aux1] >> (-tmp_q2);
+                            pv_div(nrg_ref_man[c], tmp_q2 + 0x3FFFFFFF, &quotient);
+                            tmp_q2 = 0;     /* exponent has been applied to the sum ((man>>exp) + 1)  */
+                        }
+
+                        tmp_q2 = nrg_ref_exp[c] - tmp_q2 - quotient.shift_factor;
+
+                        pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[2]);
+                        nrg_tone_man[c]    = root_sq.root;
+                        nrg_tone_exp[c]    = root_sq.shift_factor;
+
+                    }
+                    else
+                    {
+                        nrg_tone_man[c]    = 0;
+                        nrg_tone_exp[c]    = 0;
+                    }
+
+                }
+                else
+                {
+                    if (noNoiseFlag)
+                    {
+                        /*
+                         * nrg_gain[c] = (float) pv_sqrt(nrg_ref[c] /(nrg_est[c] + 1), sqrt_cache[3]);
+                         */
+
+                        pv_div(nrg_ref_man[c], nrg_est_man[c] + 1, &quotient);
+
+                        /*
+                         *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
+                         *  quotient.quotient are fractions in Q30
+                         */
+
+                        tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30;
+
+                        pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[3]);
+                        nrg_gain_man[c] = root_sq.root;
+                        nrg_gain_exp[c] = root_sq.shift_factor;
+
+                    }
+                    else
+                    {
+                        /*
+                         *  nrg_gain[c] = (float) pv_sqrt(nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL)), sqrt_cache[4]);
+                         */
+                        /*  aux1 == next*nNBands + o */
+
+                        tmp_q2 = nL_exp[aux1];
+                        /*
+                         *  nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL))
+                         */
+
+                        if (nrg_est_man[c] == 0)
+                        {
+                            tmp_q2 = 0;     /*  avoid division by 0 in next if-else, this could be due to
+                                                rounding noise */
+                        }
+
+
+                        if (tmp_q2 >= 0)
+                        {
+
+                            tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, nL_man[aux1] + (0x3FFFFFFF >> tmp_q2));
+                            pv_div(nrg_ref_man[c], tmp_q2, &quotient);
+                            /*
+                             *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
+                             *  quotient.quotient are fractions in Q30
+                             */
+                            tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1];
+                            if (nrg_est_man[c])
+                            {
+                                tmp_q2 -=  nrg_est_exp[c];
+                            }
+
+                            tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1];
+                        }
+                        else
+                        {
+                            if (tmp_q2 > - 10)
+                            {
+                                tmp_q2 = nL_man[aux1] >> (-tmp_q2);
+
+                                tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, tmp_q2 + 0x3FFFFFFF);
+                            }
+                            else
+                            {
+                                tmp_q2 = nrg_est_man[c] + 1;
+                            }
+
+
+                            pv_div(nrg_ref_man[c], tmp_q2, &quotient);
+                            /*
+                             *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
+                             *  quotient.quotient are fractions in Q30
+                             */
+
+                            tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30;
+                            if (nrg_est_man[c])
+                            {
+                                tmp_q2 -=  nrg_est_exp[c];
+                            }
+
+                        }
+
+                        pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[4]);
+                        nrg_gain_man[c] = root_sq.root;
+                        nrg_gain_exp[c] = root_sq.shift_factor;
+
+                    }
+
+                    nrg_tone_man[c]    = 0;
+                    nrg_tone_exp[c]    = -100;
+
+                }
+
+                band_nrg_tone_detector |= nrg_tone_man[c];   /*  detect any tone activity  */
+
+                pv_sqrt(tmp_q1, nrg_ref_exp[c], &root_sq, sqrt_cache[5]);
+                noise_level_man[c] = root_sq.root;
+                noise_level_exp[c] = root_sq.shift_factor;
+
+                c++;
+
+            }   /* ---- end-for-loop (k) ------ */
+            m++;
+
+        }   /* -------- Estimate levels end-for-loop (j) ----- */
+
+
+
+        /*
+         *      Limiter
+         */
+
+
+        for (c = 0; c < gateMode[limiterBand]; c++)
+        {
+
+            p_ref_man = 0;
+            p_est_man = 0;
+
+            /*
+             *  get max exponent for the reference and estimated energy
+             */
+            p_ref_exp = -100;
+            p_est_exp = -100;
+
+            for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+            {
+                if (p_ref_exp < nrg_ref_exp[k])
+                {
+                    p_ref_exp = nrg_ref_exp[k];    /* max */
+                }
+                if (p_est_exp < nrg_est_exp[k])
+                {
+                    p_est_exp = nrg_est_exp[k];    /* max */
+                }
+            }
+
+            k -= limSbc[limiterBand][c];     /*  number of element used in the addition */
+
+            while (k != 0)      /*  bit guard protection depends on log2(k)  */
+            {
+                k >>= 1;
+                p_ref_exp++;       /*  add extra bit-overflow-guard, nrg_ref_exp is in Q30 format */
+            }
+
+
+            for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+            {   /*Calculate the average gain for the current limiter band.*/
+                p_ref_man += (nrg_ref_man[k] >> (p_ref_exp - nrg_ref_exp[k]));
+                p_est_man += (nrg_est_man[k] >> (p_est_exp - nrg_est_exp[k]));
+
+            }
+
+            if (p_est_man)
+            {
+                /*
+                 *  "average gain" (not equal to average of nrg_gain)
+                 */
+                pv_div(p_ref_man, p_est_man, &quotient);
+
+                tmp_q2 = p_ref_exp - 30 - p_est_exp - quotient.shift_factor;
+
+                /*
+                 *  avg_gain = sqrt(p_ref/p_est)
+                 */
+                pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[6]);
+                avg_gain  = root_sq.root;
+                g_max_exp = root_sq.shift_factor;
+
+                /*
+                 *  maximum gain allowed is calculated from table.
+                 */
+
+                /*
+                 *  g_max = avg_gain * limGains[limiterGains];
+                 */
+
+                g_max_man = fxp_mul32_Q30(avg_gain, limGains[limiterGains]);   /*  table is in Q30 */
+
+                if (limiterGains == 3)
+                {
+                    g_max_exp = limGains[4];
+                }
+
+                tmp_q1 = g_max_exp >= 16 ? g_max_exp : 16;
+
+                tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp);
+                tmp_q1 = Q28fmt(1.52587890625F) >> (tmp_q1 - 16);
+
+                if (tmp_q2 > tmp_q1)
+                {
+                    /* upper limit, +100 dB */
+                    g_max_man = Q28fmt(1.52587890625F);
+                    g_max_exp = 16;
+                }
+            }
+            else
+            {
+                /*  Qfmt(1.52587890625F)    exp = 16 */
+                g_max_man = Q28fmt(1.52587890625F);
+                g_max_exp = 16;
+            }
+
+            /*
+             *  Compute Adjusted power p_adj
+             */
+            for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+            {
+
+                tmp_q1 = g_max_exp >= nrg_gain_exp[k] ? g_max_exp : nrg_gain_exp[k];
+
+                tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp);
+                tmp_q1 = nrg_gain_man[k] >> (tmp_q1 - nrg_gain_exp[k]);
+                /*
+                 *  if(g_max <= nrg_gain[k])
+                 */
+                if (tmp_q2 <= tmp_q1)
+                {
+                    tmp_q1 = fxp_mul32_Q28(noise_level_man[k], g_max_man);
+                    pv_div(tmp_q1, nrg_gain_man[k], &quotient);
+                    noise_level_man[k] = quotient.quotient >> 2;   /* in Q28 */
+                    noise_level_exp[k] = noise_level_exp[k] + g_max_exp - quotient.shift_factor - nrg_gain_exp[k];
+
+                    nrg_gain_man[k] =  g_max_man;       /* gains with noise supression */
+                    nrg_gain_exp[k] =  g_max_exp;
+                }
+            }
+
+            p_adj_exp = -100;
+
+            for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+            {
+                tmp_q1 = nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28;  /* 28 to match shift down by mult32_Q28  */
+
+                if (p_adj_exp < tmp_q1)
+                {
+                    p_adj_exp = tmp_q1;
+                }
+                if (nrg_tone_man[k])
+                {
+                    tmp_q1 = (nrg_tone_exp[k] << 1);
+                    if (p_adj_exp < tmp_q1)
+                    {
+                        p_adj_exp = tmp_q1;
+                    }
+                }
+                else if (!noNoiseFlag)
+                {
+                    tmp_q1 = (noise_level_exp[k] << 1);
+
+                    if (p_adj_exp < tmp_q1)
+                    {
+                        p_adj_exp = tmp_q1;
+                    }
+                }
+            }
+
+            p_adj_exp += 1; /* overflow bit-guard*/
+
+            p_adj_man = 0;
+
+            for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+            {
+                /*
+                 *  p_adj += nrg_gain[k]*nrg_gain[k]*nrg_est[k];
+                 */
+
+                if (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1)) < 59)
+                {
+                    tmp_q1 = fxp_mul32_Q28(nrg_gain_man[k], nrg_gain_man[k]);
+                    tmp_q1 = fxp_mul32_Q28(tmp_q1, nrg_est_man[k]);
+                    p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28)));
+                }
+
+                if (nrg_tone_man[k])
+                {
+                    /*
+                     *  p_adj += nrg_tone[k]*nrg_tone[k];
+                     */
+                    if (p_adj_exp - (nrg_tone_exp[k] << 1) < 31)
+                    {
+                        tmp_q1 = fxp_mul32_Q28(nrg_tone_man[k], nrg_tone_man[k]);
+                        p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_tone_exp[k] << 1)));
+                    }
+                }
+                else if (!noNoiseFlag)
+                {
+                    /*
+                     *  p_adj += noise_level[k]*noise_level[k];
+                     */
+
+                    if (p_adj_exp - (noise_level_exp[k] << 1) < 31)
+                    {
+                        tmp_q1 = fxp_mul32_Q28(noise_level_man[k], noise_level_man[k]);
+                        p_adj_man += (tmp_q1 >> (p_adj_exp - (noise_level_exp[k] << 1)));
+                    }
+
+                }
+            }
+
+
+            if (p_adj_man)
+            {
+                pv_div(p_ref_man, p_adj_man, &quotient);
+                tmp_q2 = p_ref_exp - p_adj_exp - 58 - quotient.shift_factor;   /*  58 <> Q30 + Q28 */
+
+                pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[7]);
+
+                if (root_sq.shift_factor > -28)
+                {
+                    boost_gain_q = root_sq.root << (root_sq.shift_factor + 28);
+                }
+                else
+                {
+                    boost_gain_q = root_sq.root >> (-28 - root_sq.shift_factor);
+                }
+
+                tmp_q1 = root_sq.shift_factor >= -28 ? root_sq.shift_factor : -28;
+
+                tmp_q2 = root_sq.root >> (tmp_q1 - root_sq.shift_factor);
+                tmp_q1 = Q28fmt(1.584893192f) >> (tmp_q1 + 28);
+
+
+                if (tmp_q2 > tmp_q1)
+                {
+                    boost_gain_q = Q28fmt(1.584893192f);
+                }
+            }
+            else
+            {
+                boost_gain_q = Q28fmt(1.584893192f);
+            }
+
+            if (band_nrg_tone_detector)
+            {
+                for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+                {
+                    nrg_gain_man[k]    = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q);
+                    noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q);
+                    nrg_tone_man[k]    = fxp_mul32_Q28(nrg_tone_man[k], boost_gain_q);
+                }
+            }
+            else
+            {
+
+                for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
+                {
+                    nrg_gain_man[k]    = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q);
+                    noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q);
+                }
+
+
+            }
+
+        }   /* Limiter  End for loop (c) */
+
+
+        if (LC_flag == ON)
+        {
+
+            /*
+             *          Aliasing correction
+             */
+
+            sbr_aliasing_reduction(degreeAlias,
+                                   nrg_gain_man,
+                                   nrg_gain_exp,
+                                   nrg_est_man,
+                                   nrg_est_exp,
+                                   dontUseTheseGainValues,
+                                   noSubbands,
+                                   lowSubband,
+                                   sqrt_cache,
+                                   scratch_mem[3]);
+
+            if (*sUp)     /* Init only done once upon reset */
+            {
+                *sUp = 0;
+            }
+
+            envelope_application_LC((Int32 *)aBufR,
+                                    nrg_gain_man,
+                                    nrg_gain_exp,
+                                    noise_level_man,
+                                    noise_level_exp,
+                                    nrg_tone_man,
+                                    nrg_tone_exp,
+                                    band_nrg_tone_detector,
+                                    frame_info,
+                                    harm_index,
+                                    phase_index,
+                                    i,
+                                    lowSubband,
+                                    noSubbands,
+                                    noNoiseFlag);
+        }
+#ifdef HQ_SBR
+        else
+        {
+
+            if (*sUp)     /* Init only done once upon reset */
+            {
+                for (n = 0; n < maxSmoothLength; n++)
+                {
+                    pv_memcpy(fBuf_man[n],     nrg_gain_man, noSubbands*sizeof(*fBuf_man[n]));
+                    pv_memcpy(fBufN_man[n], noise_level_man, noSubbands*sizeof(*fBufN_man[n]));
+                    pv_memcpy(fBuf_exp[n],     nrg_gain_exp, noSubbands*sizeof(*fBuf_exp[n]));
+                    pv_memcpy(fBufN_exp[n], noise_level_exp, noSubbands*sizeof(*fBufN_exp[n]));
+                }
+                *sUp = 0;
+            }
+
+
+            envelope_application((Int32 *)aBufR,
+                                 (Int32 *)aBufI,
+                                 nrg_gain_man,
+                                 nrg_gain_exp,
+                                 noise_level_man,
+                                 noise_level_exp,
+                                 nrg_tone_man,
+                                 nrg_tone_exp,
+                                 fBuf_man,
+                                 fBuf_exp,
+                                 fBufN_man,
+                                 fBufN_exp,
+                                 frame_info,
+                                 harm_index,
+                                 phase_index,
+                                 i,
+                                 lowSubband,
+                                 noSubbands,
+                                 noNoiseFlag,
+                                 band_nrg_tone_detector,
+                                 maxSmoothLength,
+                                 smooth_length);
+
+        }
+#endif
+
+    }   /* -----  Envelope adjustment end for-loop (i) ---- */
+
+
+    pv_memcpy(&hFp[0] + lowSubband,
+              hF,
+              (64 - lowSubband)*sizeof(*hF));
+
+    if (sEnv == nEnv)
+    {
+        frameData->prevEnvIsShort = 0;
+    }
+    else
+    {
+        frameData->prevEnvIsShort = -1;
+    }
+
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void envelope_application_LC(Int32  *aBufR,
+                             Int32  *nrg_gain_man,
+                             Int32  *nrg_gain_exp,
+                             Int32  *noise_level_man,
+                             Int32  *noise_level_exp,
+                             Int32  *nrg_tone_man,
+                             Int32  *nrg_tone_exp,
+                             Int32  band_nrg_tone_detector,
+                             const Int32 *frame_info,
+                             Int32  *harm_index,
+                             Int32  *phase_index,
+                             Int32  i,
+                             Int32  lowSubband,
+                             Int32  noSubbands,
+                             Int32  noNoiseFlag)
+{
+
+    Int32 *ptrReal;
+    Int32 sb_gain_man;
+    Int32 sb_noise_man;
+    Int32 sb_noise_exp;
+    Int32 l;
+    Int32 k;
+    Int32 tmp_q1;
+    Int32 tmp_q2;
+    Int32 tone_count;
+    Int16 tmp_16;
+    Int32 indexMinus1;
+    Int32 indexPlus1;
+
+
+    /*
+     *          Application
+     */
+
+    if (band_nrg_tone_detector)     /* Add tone energy only if energy is detected  */
+    {
+
+        /*
+         *  pre-calculate tone application
+         */
+        for (k = 0; k < noSubbands; k++)
+        {
+            tmp_q2 = (-nrg_tone_exp[k]);
+            tmp_q1 = nrg_tone_man[k];
+            tmp_q2 = tmp_q1 >> tmp_q2;
+            tmp_q1 = fxp_mul32_by_16(tmp_q2, Q15fmt(0.0163f));
+            nrg_tone_man[k] = tmp_q2;
+            nrg_tone_exp[k] = tmp_q1;
+            noise_level_exp[k] += 1;
+            nrg_gain_exp[k] += 28;
+        }
+
+        for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
+        {
+            ptrReal = (aBufR + l * SBR_NUM_BANDS);
+
+            tone_count = 0;
+
+            indexPlus1  = (*harm_index + 1) & 3;
+
+            if (indexPlus1 & 1)    /*  if indexPlus1 is odd */
+            {
+                for (k = 0; k < noSubbands; k++)
+                {
+
+                    sb_gain_man = nrg_gain_man[k];
+                    tmp_q1 = *ptrReal;
+                    tmp_q2 = nrg_gain_exp[k];
+                    tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
+
+                    if (tmp_q2 < 0)
+                    {
+                        if (tmp_q2 > -32)
+                        {
+                            *ptrReal = tmp_q1 >> (-tmp_q2);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal = tmp_q1 << tmp_q2;
+                    }
+
+                    *phase_index = (*phase_index + 1) & 511;
+
+                    if (!nrg_tone_man[k] && !noNoiseFlag)
+
+                    {
+                        tmp_16 = rP_LCx[*phase_index];
+                        sb_noise_man = noise_level_man[k];
+                        sb_noise_exp = noise_level_exp[k];
+
+                        tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
+
+                        if (sb_noise_exp < 0)
+                        {
+                            if (sb_noise_exp > -32)
+                            {
+                                *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                            }
+                        }
+                        else
+                        {
+                            *ptrReal += tmp_q1 << sb_noise_exp;
+                        }
+                    }
+
+                    tmp_q1 = nrg_tone_man[k];
+
+                    if (*harm_index)
+                    {
+                        *ptrReal -= tmp_q1;
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1;
+                    }
+
+                    if (tmp_q1)
+                    {
+                        tone_count++;
+                    }
+
+                    ptrReal++;
+
+                }   /*  for-loop (k) */
+
+            }
+            else        /*  if indexPlus1 is even */
+            {
+                indexMinus1 = (*harm_index - 1) & 3;
+
+                /*  ---  k = 0  ----- */
+
+                sb_gain_man = nrg_gain_man[0];
+                tmp_q1 = *ptrReal;
+                tmp_q2 = nrg_gain_exp[0];
+                tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
+
+                if (tmp_q2 < 0)
+                {
+                    if (tmp_q2 > -32)
+                    {
+                        *ptrReal = tmp_q1 >> (-tmp_q2);
+                    }
+                }
+                else
+                {
+                    *ptrReal = tmp_q1 << tmp_q2;
+                }
+
+                *phase_index = (*phase_index + 1) & 511;
+
+                tmp_q1 = nrg_tone_exp[0];
+                tmp_q2 = nrg_tone_exp[1];
+
+                if ((indexPlus1 != 0) ^((lowSubband & 1) != 0))
+                {
+                    *(ptrReal - 1) -= tmp_q1;
+                    *(ptrReal)   += tmp_q2;
+                }
+                else
+                {
+                    *(ptrReal - 1) += tmp_q1;
+                    *(ptrReal)   -= tmp_q2;
+                }
+
+                if (!nrg_tone_man[0] && !noNoiseFlag)
+                {
+                    tmp_16 = rP_LCx[*phase_index];
+                    sb_noise_man = noise_level_man[0];
+                    sb_noise_exp = noise_level_exp[0];
+
+                    tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
+
+                    if (sb_noise_exp < 0)
+                    {
+                        if (sb_noise_exp > -32)
+                        {
+                            *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1 << sb_noise_exp;
+                    }
+                }
+                else
+                {
+                    tone_count++;
+                }
+
+                ptrReal++;
+
+                /* ----  */
+
+                for (k = 1; k < noSubbands - 1; k++)
+                {
+
+                    sb_gain_man = nrg_gain_man[k];
+                    tmp_q1 = *ptrReal;
+                    tmp_q2 = nrg_gain_exp[k];
+                    tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
+
+                    if (tmp_q2 < 0)
+                    {
+                        if (tmp_q2 > -32)
+                        {
+                            *ptrReal = tmp_q1 >> (-tmp_q2);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal = tmp_q1 << tmp_q2;
+                    }
+
+                    *phase_index = (*phase_index + 1) & 511;
+
+
+                    if (tone_count < 16)
+                    {
+                        tmp_q1 = nrg_tone_exp[k - 1];
+                        tmp_q2 = nrg_tone_exp[k + 1];
+
+                        tmp_q1 -= tmp_q2;
+
+
+                        if ((indexPlus1 != 0) ^(((k + lowSubband) & 1) != 0))
+                        {
+                            *(ptrReal) -= tmp_q1;
+                        }
+                        else
+                        {
+                            *(ptrReal) += tmp_q1;
+                        }
+                    }   /*   if (tone_count < 16)  */
+
+
+                    if (!nrg_tone_man[k] && !noNoiseFlag)
+                    {
+                        tmp_16 = rP_LCx[*phase_index];
+                        sb_noise_man = noise_level_man[k];
+                        sb_noise_exp = noise_level_exp[k];
+
+                        tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
+
+                        if (sb_noise_exp < 0)
+                        {
+                            if (sb_noise_exp > -32)
+                            {
+                                *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                            }
+                        }
+                        else
+                        {
+                            *ptrReal += tmp_q1 << sb_noise_exp;
+                        }
+                    }
+                    else
+                    {
+                        tone_count++;
+                    }
+
+                    ptrReal++;
+
+                }   /*  for-loop (k) */
+
+                sb_gain_man = nrg_gain_man[k];
+                tmp_q1 = *ptrReal;
+                tmp_q2 = nrg_gain_exp[k];
+                tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
+
+                if (tmp_q2 < 0)
+                {
+                    if (tmp_q2 > -31)
+                    {
+                        *ptrReal = tmp_q1 >> (-tmp_q2);
+                    }
+                }
+                else
+                {
+                    *ptrReal = tmp_q1 << tmp_q2;
+                }
+
+                *phase_index = (*phase_index + 1) & 511;
+
+
+                if ((tone_count < 16) && !(indexMinus1 &1))
+                {
+                    tmp_q1 = nrg_tone_exp[k - 1];
+                    tmp_q2 = nrg_tone_exp[k    ];
+
+                    if ((indexMinus1 != 0) ^(((k + lowSubband) & 1) != 0))
+                    {
+                        *(ptrReal)   += tmp_q1;
+
+                        if (k + lowSubband < 62)
+                        {
+                            *(ptrReal + 1) -= tmp_q2;
+                        }
+                    }
+                    else
+                    {
+                        *(ptrReal)   -= tmp_q1;
+
+                        if (k + lowSubband < 62)
+                        {
+                            *(ptrReal + 1) += tmp_q2;
+                        }
+                    }
+                }   /*   if (tone_count < 16)  */
+
+
+                if (!nrg_tone_man[k] && !noNoiseFlag)
+                {
+                    tmp_16 = rP_LCx[*phase_index];
+                    sb_noise_man = noise_level_man[k];
+                    sb_noise_exp = noise_level_exp[k];
+
+                    tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
+
+                    if (sb_noise_exp < 0)
+                    {
+                        if (sb_noise_exp > -31)
+                        {
+                            *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1 << sb_noise_exp;
+                    }
+                }
+
+            }   /*  if indexPlus1 is odd */
+
+            *harm_index = indexPlus1;
+
+
+        }        /*  for-loop (l) */
+
+    }
+    else        /*   if ( band_nrg_tone_detector)   */
+    {
+
+        for (k = 0; k < noSubbands; k++)
+        {
+            tmp_q1 = noise_level_exp[k];
+            tmp_q2 = nrg_gain_exp[k];
+            noise_level_exp[k] =  tmp_q1 + 1;
+            nrg_gain_exp[k] = tmp_q2 + 28;
+        }
+
+        for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
+        {
+            ptrReal = (aBufR + l * SBR_NUM_BANDS);
+
+            for (k = 0; k < noSubbands; k++)
+            {
+
+                tmp_q1 = *ptrReal;
+                sb_gain_man = nrg_gain_man[k];
+
+                tmp_q2 = nrg_gain_exp[k];
+
+                tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
+
+                if (tmp_q2 < 0)
+                {
+                    if (tmp_q2 > -31)
+                    {
+                        *ptrReal = tmp_q1 >> (-tmp_q2);
+                    }
+                }
+                else
+                {
+                    *ptrReal = tmp_q1 << tmp_q2;
+                }
+
+                *phase_index = (*phase_index + 1) & 511;
+
+                if (! noNoiseFlag)
+                {
+                    tmp_16 = rP_LCx[*phase_index];
+                    sb_noise_man = noise_level_man[k];
+                    sb_noise_exp = noise_level_exp[k];
+
+                    tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
+
+                    if (sb_noise_exp < 0)
+                    {
+                        if (sb_noise_exp > -31)
+                        {
+                            *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1 << sb_noise_exp;
+                    }
+                }
+
+                ptrReal++;
+
+            }   /*  for-loop (k) */
+
+            *harm_index  = (*harm_index + 1) & 3;
+
+
+        }   /*  for-loop (l) */
+
+    }
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+#define Qfmt15(a)   (Int32)(a*((Int32)1<<15) + (a>=0?0.5F:-0.5F))
+
+
+const Int16 pow2[39] = { 0, 0, 1, 0, 2,
+                         0, Qfmt15(2 / 6.0f), 0, 3, 0, Qfmt15(2 / 10.0f), 0, Qfmt15(2 / 12.0f), 0, Qfmt15(2 / 14.0f), 0, 4,
+                         0, Qfmt15(2 / 18.0f),    0, Qfmt15(2 / 20.0f), 0, Qfmt15(2 / 22.0f), 0, Qfmt15(2 / 24.0f),
+                         0, Qfmt15(2 / 26.0f), 0, Qfmt15(2 / 28.0f), 0, Qfmt15(2 / 30.0f), 0, 5, 0, Qfmt15(2 / 34.0f),
+                         0, Qfmt15(2 / 36.0f), 0, Qfmt15(2 / 38.0f)
+                       };
+
+void energy_estimation_LC(Int32 *aBufR,
+                          Int32 *nrg_est_man,
+                          Int32 *nrg_est_exp,
+                          const Int32 *frame_info,
+                          Int32 i,
+                          Int32 k,
+                          Int32 c,
+                          Int32 ui2)
+{
+
+
+    Int32  aux1;
+    Int32  aux2;
+    Int32  l;
+
+
+    int64_t nrg_h = 0;
+    Int32 tmp1;
+    UInt32 tmp2;
+
+    for (l = ui2; l < (frame_info[2+i] << 1); l++)
+    {
+
+        aux1 = aBufR[l++*SBR_NUM_BANDS + k ];
+        aux2 = aBufR[l  *SBR_NUM_BANDS + k ];
+
+        nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
+        nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
+    }
+
+    /*
+     *  Check for overflow and saturate if needed
+     */
+    if (nrg_h < 0)
+    {
+        nrg_h = 0x7fffffff;
+    }
+
+
+    if (nrg_h)
+    {
+        tmp2 = (UInt32)(nrg_h >> 32);
+        if (tmp2)
+        {
+            aux2 = pv_normalize(tmp2);
+            aux2 -= 1;                  /*  ensure Q30 */
+            nrg_h = (nrg_h << aux2) >> 33;
+            tmp2 = (UInt32)(nrg_h);
+            nrg_est_exp[c] = 33 - aux2;
+        }
+        else
+        {
+            tmp2 = (UInt32)(nrg_h >> 2);
+            aux2 = pv_normalize(tmp2);
+            aux2 -= 1;                  /*  ensure Q30 */
+
+            tmp2 = (tmp2 << aux2);
+            nrg_est_exp[c] =  -aux2 + 2;
+        }
+
+        tmp1 = (l - ui2);
+
+        aux2 = pow2[tmp1];
+        if (tmp1 == (tmp1 & (-tmp1)))
+        {
+            nrg_est_man[c] = tmp2 >> aux2;
+        }
+        else
+        {
+            nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2);
+        }
+
+    }
+    else
+    {
+        nrg_est_man[c] = 0;
+        nrg_est_exp[c] = -100;
+    }
+
+
+
+
+
+}
+
+
+
+
+
+
+#if HQ_SBR
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void envelope_application(Int32  *aBufR,
+                          Int32  *aBufI,
+                          Int32  *nrg_gain_man,
+                          Int32  *nrg_gain_exp,
+                          Int32  *noise_level_man,
+                          Int32  *noise_level_exp,
+                          Int32  *nrg_tone_man,
+                          Int32  *nrg_tone_exp,
+                          Int32  *fBuf_man[64],
+                          Int32  *fBuf_exp[64],
+                          Int32  *fBufN_man[64],
+                          Int32  *fBufN_exp[64],
+                          const  Int32 *frame_info,
+                          Int32  *harm_index,
+                          Int32  *phase_index,
+                          Int32  i,
+                          Int32  lowSubband,
+                          Int32  noSubbands,
+                          Int32  noNoiseFlag,
+                          Int32  band_nrg_tone_detector,
+                          Int32  maxSmoothLength,
+                          Int32  smooth_length)
+{
+
+    Int32 *ptrReal;
+    Int32 *ptrImag;
+    Int32 sb_gain_man;
+    Int32 sb_gain_exp;
+    Int32 sb_noise_man;
+    Int32 sb_noise_exp;
+    Int32 l;
+    Int32 k;
+    Int32 n;
+    Int32 tmp_q1;
+    Int32 tmp_q2;
+    Int32  aux1;
+    Int32  aux2;
+    Int32  filter_history = 0;
+
+
+    if (band_nrg_tone_detector)     /* Add tone energy only if energy is detected  */
+    {
+
+        /*
+         *  pre-calculate tone application
+         */
+
+        ptrReal = nrg_tone_exp;
+        ptrImag = nrg_tone_man;
+        tmp_q1 = - *(ptrReal++);
+        aux1   =   *(ptrImag);
+        for (k = 0; k < noSubbands; k++)
+        {
+            *(ptrImag++) = aux1 >> tmp_q1;
+            tmp_q1 = - *(ptrReal++);
+            aux1   =   *(ptrImag);
+        }
+
+        /*
+         *          Application
+         */
+
+        for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
+        {
+            ptrReal = (aBufR + l * SBR_NUM_BANDS);
+            ptrImag = (aBufI + l * SBR_NUM_BANDS);
+
+            if (filter_history <= maxSmoothLength)     /* no more update is needed as buffer will have same info */
+            {
+                pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man));
+                pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp));
+                pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man));
+                pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp));
+            }
+
+            /*
+             *  nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation
+             */
+            for (k = 0; k < noSubbands; k++)
+            {
+                if (smooth_length == 0)     /* no filter-smooth needed */
+                {
+                    sb_gain_man = nrg_gain_man[k];
+                    sb_gain_exp = nrg_gain_exp[k];
+
+                    sb_noise_man = noise_level_man[k];
+                    sb_noise_exp = noise_level_exp[k];
+
+                }
+                else
+                {   /* else  smooth_length == 4  and fir_4 filter is being used */
+
+                    sb_gain_exp = fBuf_exp[maxSmoothLength][k];
+
+                    sb_noise_exp = fBufN_exp[maxSmoothLength][k];
+
+                    for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++)
+                    {
+                        if (sb_gain_exp  < fBuf_exp[n][k])
+                        {
+                            sb_gain_exp = fBuf_exp[n][k];
+                        }
+
+                        if (sb_noise_exp  < fBufN_exp[n][k])
+                        {
+                            sb_noise_exp = fBufN_exp[n][k];
+                        }
+                    }
+
+                    sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
+                    sb_gain_man  = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]);
+
+                    sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
+                    sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]);
+
+                    n = maxSmoothLength - smooth_length;
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]);
+
+                }
+
+
+
+                /*
+                 *    *ptrReal  = *ptrReal * sb_gain ;
+                 *    *ptrImag  = *ptrImag * sb_gain;
+                 */
+                aux1 = *ptrReal;
+                aux2 = *ptrImag;
+                sb_gain_exp += 32;
+                aux1 = fxp_mul32_Q31(aux1, sb_gain_man);
+                aux2 = fxp_mul32_Q31(aux2, sb_gain_man);
+
+
+                if (sb_gain_exp < 0)
+                {
+                    sb_gain_exp = -sb_gain_exp;
+                    if (sb_gain_exp < 32)
+                    {
+                        *ptrReal = (aux1 >> sb_gain_exp);
+                        *ptrImag = (aux2 >> sb_gain_exp);
+                    }
+                }
+                else
+                {
+                    *ptrReal = (aux1 << sb_gain_exp);
+                    *ptrImag = (aux2 << sb_gain_exp);
+                }
+
+
+
+                /*
+                 *     if ( sb_noise != 0)
+                 *     {
+                 *         *ptrReal += sb_noise * rP[*phase_index][0];
+                 *         *ptrImag += sb_noise * rP[*phase_index][1];
+                 *     }
+                 */
+                *phase_index = (*phase_index + 1) & 511;
+
+                if (nrg_tone_man[k] || noNoiseFlag)
+                {
+                    sb_noise_man = 0;
+                    sb_noise_exp = 0;
+                }
+                else
+                {
+
+                    Int32 tmp = rPxx[*phase_index];
+                    sb_noise_exp += 1;
+                    tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp);
+                    tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp);
+
+
+                    if (sb_noise_exp < 0)
+                    {
+                        if (sb_noise_exp > -32)
+                        {
+                            *ptrReal += tmp_q1 >> (-sb_noise_exp);
+                            *ptrImag += tmp_q2 >> (-sb_noise_exp);
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1 << sb_noise_exp;
+                        *ptrImag += tmp_q2 << sb_noise_exp;
+                    }
+                }
+
+                /*
+                 *      tmp_q1 = nrg_tone[k]
+                 */
+
+                tmp_q1 = nrg_tone_man[k];
+
+                if (*harm_index & 1)
+                {
+                    if ((((k + lowSubband) & 1) != 0) ^(*harm_index != 1))
+                    {
+                        *ptrImag  -=  tmp_q1;
+                    }
+                    else
+                    {
+                        *ptrImag  +=  tmp_q1;
+                    }
+                }
+                else
+                {
+                    *ptrReal += (*harm_index) ? -tmp_q1 : tmp_q1;
+                }
+
+                *ptrReal++ <<= 10;
+                *ptrImag++ <<= 10;
+
+
+            }    /*  for-loop (k) */
+
+
+            *harm_index = (*harm_index + 1) & 3;
+
+            /*
+             *  Update smoothing filter history
+             */
+
+            if (filter_history++ < maxSmoothLength)     /* no more update is needed as buffer will have same info */
+            {
+                /*
+                 *  mantissas
+                 */
+
+                ptrReal = (Int32 *)fBuf_man[0];
+                ptrImag = (Int32 *)fBufN_man[0];
+
+                for (n = 0; n < maxSmoothLength; n++)
+                {
+                    fBuf_man[n]  = fBuf_man[n+1];
+                    fBufN_man[n] = fBufN_man[n+1];
+                }
+
+                fBuf_man[maxSmoothLength]  = ptrReal;
+                fBufN_man[maxSmoothLength] = ptrImag;
+
+                /*
+                 *  exponents
+                 */
+                ptrReal = (Int32 *)fBuf_exp[0];
+                ptrImag = (Int32 *)fBufN_exp[0];
+
+                for (n = 0; n < maxSmoothLength; n++)
+                {
+                    fBuf_exp[n]  = fBuf_exp[n+1];
+                    fBufN_exp[n] = fBufN_exp[n+1];
+                }
+
+                fBuf_exp[maxSmoothLength]  = ptrReal;
+                fBufN_exp[maxSmoothLength] = ptrImag;
+            }
+
+        }   /*  for-loop (l) */
+
+
+    }
+    else        /*   ----  if ( band_nrg_tone_detector) ---- */
+    {
+
+        /*
+         *          Application
+         */
+
+        for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
+        {
+            ptrReal = (aBufR + l * SBR_NUM_BANDS);
+            ptrImag = (aBufI + l * SBR_NUM_BANDS);
+
+            if (filter_history <= maxSmoothLength)     /* no more update is needed as buffer will have same info */
+            {
+                pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man));
+                pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp));
+                pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man));
+                pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp));
+            }
+
+            /*
+             *  nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation
+             */
+            for (k = 0; k < noSubbands; k++)
+            {
+                if (smooth_length == 0)     /* no filter-smooth needed */
+                {
+                    sb_gain_man = nrg_gain_man[k];
+                    sb_gain_exp = nrg_gain_exp[k];
+
+                    sb_noise_man = noise_level_man[k];
+                    sb_noise_exp = noise_level_exp[k];
+
+                }
+                else
+                {   /* else  smooth_length == 4  and fir_4 filter is being used */
+
+                    sb_gain_exp = fBuf_exp[maxSmoothLength][k];
+
+                    sb_noise_exp = fBufN_exp[maxSmoothLength][k];
+
+                    for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++)
+                    {
+                        if (sb_gain_exp  < fBuf_exp[n][k])
+                        {
+                            sb_gain_exp = fBuf_exp[n][k];
+                        }
+
+                        if (sb_noise_exp  < fBufN_exp[n][k])
+                        {
+                            sb_noise_exp = fBufN_exp[n][k];
+                        }
+                    }
+
+                    sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
+                    sb_gain_man  = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]);
+
+                    sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
+                    sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]);
+
+                    n = maxSmoothLength - smooth_length;
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f));
+                    sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
+
+                    tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f));
+                    sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]);
+
+                }
+
+
+
+                /*
+                 *    *ptrReal  = *ptrReal * sb_gain ;
+                 *    *ptrImag  = *ptrImag * sb_gain;
+                 */
+                aux1 = *ptrReal;
+                aux2 = *ptrImag;
+                sb_gain_exp += 32;
+                aux1 = fxp_mul32_Q31(aux1, sb_gain_man);
+                aux2 = fxp_mul32_Q31(aux2, sb_gain_man);
+
+
+
+                /*
+                 *     if ( sb_noise != 0)
+                 *     {
+                 *         *ptrReal += sb_noise * rP[*phase_index][0];
+                 *         *ptrImag += sb_noise * rP[*phase_index][1];
+                 *     }
+                 */
+
+
+                if (sb_gain_exp < 0)
+                {
+                    if (sb_gain_exp > -32)
+                    {
+                        if (sb_gain_exp > -10)
+                        {
+                            *ptrReal = aux1 << (10 + sb_gain_exp);
+                            *ptrImag = aux2 << (10 + sb_gain_exp);
+                        }
+                        else
+                        {
+                            *ptrReal = aux1 >> (-sb_gain_exp - 10);
+                            *ptrImag = aux2 >> (-sb_gain_exp - 10);
+                        }
+                    }
+                }
+                else
+                {
+                    *ptrReal = aux1 << (sb_gain_exp + 10);
+                    *ptrImag = aux2 << (sb_gain_exp + 10);
+                }
+
+
+
+
+                /*
+                 *     if ( sb_noise != 0)
+                 *     {
+                 *         *ptrReal += sb_noise * rP[*phase_index][0];
+                 *         *ptrImag += sb_noise * rP[*phase_index][1];
+                 *     }
+                 */
+                *phase_index = (*phase_index + 1) & 511;
+
+                if (!noNoiseFlag)
+                {
+
+                    Int32 tmp = rPxx[*phase_index];
+                    sb_noise_exp += 1;
+                    tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp);
+                    tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp);
+
+                    if (sb_noise_exp < 0)
+                    {
+                        if (sb_noise_exp > -32)
+                        {
+                            if (sb_noise_exp > -10)
+                            {
+                                *ptrReal += tmp_q1 << (10 + sb_noise_exp);
+                                *ptrImag += tmp_q2 << (10 + sb_noise_exp);
+                            }
+                            else
+                            {
+                                *ptrReal += tmp_q1 >> (-sb_noise_exp - 10);
+                                *ptrImag += tmp_q2 >> (-sb_noise_exp - 10);
+                            }
+                        }
+                    }
+                    else
+                    {
+                        *ptrReal += tmp_q1 << (sb_noise_exp + 10);
+                        *ptrImag += tmp_q2 << (sb_noise_exp + 10);
+                    }
+                }
+
+                ptrReal++;
+                ptrImag++;
+
+
+            }    /*  for-loop (k) */
+
+
+            *harm_index = (*harm_index + 1) & 3;
+
+            /*
+             *  Update smoothing filter history
+             */
+
+            if (filter_history++ < maxSmoothLength)     /* no more update is needed as buffer will have same info */
+            {
+                /*
+                 *  mantissas
+                 */
+
+                ptrReal = (Int32 *)fBuf_man[0];
+                ptrImag = (Int32 *)fBufN_man[0];
+
+                for (n = 0; n < maxSmoothLength; n++)
+                {
+                    fBuf_man[n]  = fBuf_man[n+1];
+                    fBufN_man[n] = fBufN_man[n+1];
+                }
+
+                fBuf_man[maxSmoothLength]  = ptrReal;
+                fBufN_man[maxSmoothLength] = ptrImag;
+
+                /*
+                 *  exponents
+                 */
+                ptrReal = (Int32 *)fBuf_exp[0];
+                ptrImag = (Int32 *)fBufN_exp[0];
+
+                for (n = 0; n < maxSmoothLength; n++)
+                {
+                    fBuf_exp[n]  = fBuf_exp[n+1];
+                    fBufN_exp[n] = fBufN_exp[n+1];
+                }
+
+                fBuf_exp[maxSmoothLength]  = ptrReal;
+                fBufN_exp[maxSmoothLength] = ptrImag;
+            }
+
+        }   /*  for-loop (l) */
+
+    }       /*  if ( band_nrg_tone_detector) */
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void energy_estimation(Int32 *aBufR,
+                       Int32 *aBufI,
+                       Int32 *nrg_est_man,
+                       Int32 *nrg_est_exp,
+                       const Int32 *frame_info,
+                       Int32 i,
+                       Int32 k,
+                       Int32 c,
+                       Int32 ui2)
+{
+
+    Int32  aux1;
+    Int32  aux2;
+    Int32  l;
+
+
+
+    int64_t nrg_h = 0;
+    Int32 tmp1;
+    Int32 tmp2;
+
+    aux1 = aBufR[ui2*SBR_NUM_BANDS + k];
+    aux2 = aBufI[ui2*SBR_NUM_BANDS + k];
+    for (l = ui2 + 1; l < (frame_info[2+i] << 1);  l++)
+    {
+        nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
+        nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
+        aux1 = aBufR[l*SBR_NUM_BANDS + k];
+        aux2 = aBufI[l*SBR_NUM_BANDS + k];
+    }
+    nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
+    nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
+
+
+    /*
+     *  Check for overflow and saturate if needed
+     */
+    if (nrg_h < 0)
+    {
+        nrg_h = 0x7fffffff;
+    }
+
+    if (nrg_h)
+    {
+
+        aux1 = (UInt32)(nrg_h >> 32);
+        if (aux1)
+        {
+            aux2 = pv_normalize(aux1);
+            if (aux2)
+            {
+                aux2 -= 1;                  /*  ensure Q30 */
+                nrg_h = (nrg_h << aux2) >> 33;
+                tmp2 = (UInt32)(nrg_h);
+                nrg_est_exp[c] = 33 - aux2;
+            }
+            else
+            {
+                tmp2 = (UInt32)(aux1 >> 1);
+                nrg_est_exp[c] = 33 ;
+
+
+            }
+        }
+        else
+        {
+            aux1 = (UInt32)(nrg_h >> 1);
+            aux2 = pv_normalize(aux1);
+
+            tmp2 = (aux1 << aux2);
+            nrg_est_exp[c] =  -aux2 + 1;
+
+
+        }
+
+
+
+        tmp1 = (l - ui2);
+        aux2 = pow2[tmp1];
+        if (tmp1 == (tmp1 & (-tmp1)))
+        {
+            nrg_est_man[c] = tmp2 >> aux2;
+        }
+        else
+        {
+            nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2);
+        }
+    }
+    else
+    {
+        nrg_est_man[c] = 0;
+        nrg_est_exp[c] = -100;
+    }
+
+
+}
+
+
+
+
+
+#endif
+
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_envelope.h b/media/libstagefright/codecs/aacdec/calc_sbr_envelope.h
new file mode 100644
index 0000000..2a6ae57
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_envelope.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: calc_sbr_envelope.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CALCULATE_SBR_ENVELOPE_H
+#define CALCULATE_SBR_ENVELOPE_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "s_sbr_frame_data.h"
+#include    "sbr_generate_high_freq.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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 calc_sbr_envelope(SBR_FRAME_DATA *frameData,
+    Int32 *aBufR,
+    Int32 *aBufI,
+    Int    freqBandTable1[2][MAX_FREQ_COEFFS + 1],
+    const Int32 *nSfb,
+    Int32   freqBandTable2[MAX_NOISE_COEFFS + 1],
+    Int32   nNBands,
+    Int32   reset,
+    Int32 *degreeAlias,
+    Int32 *harm_index,
+    Int32 *phase_index,
+    Int32 hFp[64],
+    Int32 *sUp,
+    Int32 limSbc[][13],
+    Int32 *gateMode,
+#ifdef HQ_SBR
+    Int32 *fBuf_man[64],
+    Int32 *fBuf_exp[64],
+    Int32 *fBufN_man[64],
+    Int32 *fBufN_exp[64],
+#endif
+    Int32 scratch_mem[][64],
+    struct PATCH Patch,
+    Int32  sqrt_cache[][4],
+    Int32  LC_flag);
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif   /*  CALCULATE_SBR_ENVELOPE_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.cpp b/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.cpp
new file mode 100644
index 0000000..e557aa1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.cpp
@@ -0,0 +1,639 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Filename: calc_sbr_synfilterbank.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#ifdef AAC_PLUS
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "calc_sbr_synfilterbank.h"
+#include    "qmf_filterbank_coeff.h"
+#include    "synthesis_sub_band.h"
+#include    "fxp_mul32.h"
+#include    "aac_mem_funcs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+#if defined (PV_ARM_V5)
+
+
+__inline Int16 sat(Int32 y)
+{
+    Int32 x;
+    __asm
+    {
+        qdadd y, y, y
+        mov y, y, asr #16
+    }
+
+    return((Int16)y);
+}
+
+#define saturate2( a, b, c, d)      *c = sat( a);   \
+                                    *d = sat( b);   \
+                                    c += 2;         \
+                                    d -= 2;
+
+
+#elif defined (PV_ARM_V4)
+
+
+__inline Int16 sat(Int32 y)
+{
+    Int32 x;
+    Int32 z = 31; /* rvct compiler problem */
+    __asm
+    {
+        sub y, y, y, asr 2
+        mov y, y, asr N
+        mov x, y, asr #15
+        teq x, y, asr z
+        eorne  y, INT16_MAX, y, asr #31
+    }
+
+    return((Int16)y);
+}
+
+#define saturate2( a, b, c, d)      *c = sat( a);   \
+                                    *d = sat( b);   \
+                                    c += 2;         \
+                                    d -= 2;
+
+#elif defined(PV_ARM_GCC_V5)
+
+__inline Int16 sat(Int32 y)
+{
+    register Int32 x;
+    register Int32 ra = y;
+
+
+    asm volatile(
+        "qdadd %0, %1, %1\n\t"
+        "mov %0, %0, asr #16"
+    : "=&r*i"(x)
+                : "r"(ra));
+
+    return ((Int16)x);
+}
+
+
+#define saturate2( a, b, c, d)      *c = sat( a);   \
+                                    *d = sat( b);   \
+                                    c += 2;         \
+                                    d -= 2;
+
+
+#elif defined(PV_ARM_MSC_EVC_V5)
+
+#include "armintr.h"
+
+#define saturate2( a, b, c, d)      *c = _DAddSatInt( a, a)>>16;   \
+                                    *d = _DAddSatInt( b, b)>>16;   \
+                                    c += 2;         \
+                                    d -= 2;
+
+#else
+
+
+#define   saturate2( a, b, c, d)    a -= (a>>2);                             \
+                                    a  = (a>>N);                     \
+                                    if((a>>15) != (a>>31))                   \
+                                    {                                        \
+                                        a = ((a >> 31) ^ INT16_MAX); \
+                                    }                                        \
+                                    *c = (Int16)a;                           \
+                                    c += 2;                                  \
+                                    b -= (b>>2);                             \
+                                    b =  (b>>N);                      \
+                                    if((b>>15) != (b>>31))                   \
+                                    {                                        \
+                                        b = ((b >> 31) ^ INT16_MAX); \
+                                    }                                        \
+                                    *d = (Int16)b;                           \
+                                    d -= 2;
+
+
+#endif
+
+/*----------------------------------------------------------------------------
+; 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 calc_sbr_synfilterbank_LC(Int32 * Sr,
+                               Int16 * timeSig,
+                               Int16   V[1280],
+                               bool bDownSampleSBR)
+{
+    Int32 i;
+
+    Int32   realAccu1;
+    Int32   realAccu2;
+    const Int32 *pt_C2;
+
+    Int16 *pt_V1;
+    Int16 *pt_V2;
+
+
+    Int16 *pt_timeSig;
+
+    Int16 *pt_timeSig_2;
+    Int32  test1;
+    Int16  tmp1;
+    Int16  tmp2;
+
+    /* shift filterstates */
+
+    Int32 * pt_Sr = Sr;
+
+
+    if (bDownSampleSBR == false)
+    {
+
+        synthesis_sub_band_LC(pt_Sr, V);
+
+        /* content of V[] is at most 16 bits */
+
+        pt_timeSig   = &timeSig[0];
+        pt_timeSig_2 = &timeSig[64];
+
+
+        tmp1 = V[ 704];
+        tmp2 = V[ 768];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
+        tmp1 = -V[ 512];
+        tmp2 =  V[ 960];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
+        tmp1 =  V[ 448];
+        tmp2 =  V[1024];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
+        tmp1 =  -V[ 256];
+        tmp2 =   V[ 192];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
+
+        tmp1 = V[  32];
+        tmp2 = V[1248];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
+        tmp1 = V[ 224];
+        tmp2 = V[1056];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
+        tmp1 = V[ 992];
+        tmp2 = V[ 288];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
+        tmp1 = V[ 480];
+        tmp2 = V[ 800];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
+        tmp1 = V[ 736];
+        tmp2 = V[ 544];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
+
+
+
+        saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
+
+        pt_timeSig_2 = &timeSig[126];
+
+        pt_V1 = &V[1];
+        pt_V2 = &V[1279];
+
+        pt_C2 = &sbrDecoderFilterbankCoefficients[0];
+
+        for (i = 31; i != 0; i--)
+        {
+            test1 = *(pt_C2++);
+            tmp1 = *(pt_V1++);
+            tmp2 = *(pt_V2--);
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
+            tmp1 = pt_V1[  191];
+            tmp2 = pt_V2[ -191];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  255];
+            tmp2 = pt_V2[ -255];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  447];
+            tmp2 = pt_V2[ -447];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  511];
+            tmp2 = pt_V2[ -511];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  703];
+            tmp2 = pt_V2[ -703];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  767];
+            tmp2 = pt_V2[ -767];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  959];
+            tmp2 = pt_V2[ -959];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  1023];
+            tmp2 = pt_V2[ -1023];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  1215];
+            tmp2 = pt_V2[ -1215];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
+
+        }
+    }
+    else
+    {
+
+        synthesis_sub_band_LC_down_sampled(Sr, V);
+
+        /*
+         *    window signal
+         *    calculate output samples
+         */
+
+
+        pt_V1 = &V[0];
+        pt_V2 = &V[96];
+
+
+        Int32 * pt_out = Sr;
+
+        for (i = 0; i < 8; i++)
+        {
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+        }
+
+        const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
+        pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
+
+        for (int k = 0; k < 5; k++)
+        {
+            pt_out -= 32;
+            for (i = 0; i < 16; i++)
+            {
+                realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
+                realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
+                realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
+                realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
+                *(pt_out++) += realAccu1 >> 5;
+                *(pt_out++) += realAccu2 >> 5;
+
+            }
+            pt_V1 += 96;
+            pt_V2 += 96;
+            pt_C1 += 16;
+            pt_C2 += 16;
+        }
+        pt_out -= 32;
+
+        for (i = 0; i < 32; i++)
+        {
+            timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
+        }
+
+    }
+
+}
+
+
+
+#ifdef HQ_SBR
+
+void calc_sbr_synfilterbank(Int32 * Sr,
+                            Int32 * Si,
+                            Int16 * timeSig,
+                            Int16   V[1280],
+                            bool bDownSampleSBR)
+{
+    Int32 i;
+
+    const Int32 *pt_C2;
+
+    Int32   realAccu1;
+    Int32   realAccu2;
+
+    Int16 *pt_V1;
+    Int16 *pt_V2;
+
+    Int16 *pt_timeSig;
+
+    Int16 *pt_timeSig_2;
+    Int32  test1;
+    Int16  tmp1;
+    Int16  tmp2;
+
+
+    if (bDownSampleSBR == false)
+    {
+        synthesis_sub_band(Sr, Si, V);
+
+        /* content of V[] is at most 16 bits */
+        pt_timeSig   = &timeSig[0];
+        pt_timeSig_2 = &timeSig[64];
+
+        tmp1 = V[ 704];
+        tmp2 = V[ 768];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
+        tmp1 = -V[ 512];
+        tmp2 =  V[ 960];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
+        tmp1 =  V[ 448];
+        tmp2 =  V[1024];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
+        tmp1 =  -V[ 256];
+        tmp2 =   V[ 192];
+        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
+        realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
+
+        tmp1 = V[  32];
+        tmp2 = V[1248];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
+        tmp1 = V[ 224];
+        tmp2 = V[1056];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
+        tmp1 = V[ 992];
+        tmp2 = V[ 288];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
+        tmp1 = V[ 480];
+        tmp2 = V[ 800];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
+        tmp1 = V[ 736];
+        tmp2 = V[ 544];
+        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
+        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
+
+
+        saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
+
+        pt_timeSig_2 = &timeSig[126];
+
+        pt_V1 = &V[1];
+        pt_V2 = &V[1279];
+
+        pt_C2 = &sbrDecoderFilterbankCoefficients[0];
+
+        for (i = 31; i != 0; i--)
+        {
+            test1 = *(pt_C2++);
+            tmp1 = *(pt_V1++);
+            tmp2 = *(pt_V2--);
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
+            tmp1 = pt_V1[  191];
+            tmp2 = pt_V2[ -191];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  255];
+            tmp2 = pt_V2[ -255];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  447];
+            tmp2 = pt_V2[ -447];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  511];
+            tmp2 = pt_V2[ -511];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  703];
+            tmp2 = pt_V2[ -703];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  767];
+            tmp2 = pt_V2[ -767];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  959];
+            tmp2 = pt_V2[ -959];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            test1 = *(pt_C2++);
+            tmp1 = pt_V1[  1023];
+            tmp2 = pt_V2[ -1023];
+            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
+            tmp1 = pt_V1[  1215];
+            tmp2 = pt_V2[ -1215];
+            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
+            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
+
+            saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
+        }
+
+    }
+    else
+    {
+
+        synthesis_sub_band_down_sampled(Sr,  Si,  V);
+
+
+        Int32 * pt_out = Sr;
+
+        for (i = 0; i < 8; i++)
+        {
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+            *(pt_out++) = 0;
+        }
+
+
+        /*
+         *    window signal
+         *    calculate output samples
+         */
+
+        pt_V1 = &V[0];
+        pt_V2 = &V[96];
+
+
+        const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
+        pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
+
+        for (Int k = 0; k < 5; k++)
+        {
+            pt_out -= 32;
+            for (i = 0; i < 16; i++)
+            {
+                realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
+                realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
+                realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
+                realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
+                *(pt_out++) += realAccu1 >> 5;
+                *(pt_out++) += realAccu2 >> 5;
+            }
+            pt_V1 += 96;
+            pt_V2 += 96;
+            pt_C1 += 16;
+            pt_C2 += 16;
+        }
+        pt_out -= 32;
+
+        for (i = 0; i < 32; i++)
+        {
+            timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
+        }
+
+    }
+}
+
+
+#endif      /* --- HQ_SBR --- */
+
+
+#endif      /* --- AAC_PLUS --- */
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.h b/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.h
new file mode 100644
index 0000000..28bd6de
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/calc_sbr_synfilterbank.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CALC_SBR_SYNFILTERBANK_H
+#define CALC_SBR_SYNFILTERBANK_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define N  14
+
+#define ROUND_SYNFIL  (32768 + 4096)
+
+    /*----------------------------------------------------------------------------
+    ; 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 calc_sbr_synfilterbank_LC(Int32 * Sr,
+    Int16 * timeSig,
+    Int16   V[1280],
+    bool bDownSampleSBR);
+
+#ifdef HQ_SBR
+
+
+    void calc_sbr_synfilterbank(Int32 * Sr,
+                                Int32 * Si,
+                                Int16 * timeSig,
+                                Int16   V[1280],
+                                bool bDownSampleSBR);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/chans.h b/media/libstagefright/codecs/aacdec/chans.h
new file mode 100644
index 0000000..325b5cd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/chans.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname:   chans.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Placed file in the correct template format.
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CHANS_H
+#define CHANS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+    /* #define is required in order to use these args in #if () directive */
+#define ICChans 0
+#define DCChans 0
+#define XCChans 0
+#define CChans  0
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    enum
+    {
+        /*
+         * channels for 5.1 main profile configuration
+         * (modify for any desired decoder configuration)
+         */
+        FChans  = 2,    /* front channels: left, center, right */
+        FCenter = 0,    /* 1 if decoder has front center channel */
+        SChans  = 0,    /* side channels: */
+        BChans  = 0,    /* back channels: left surround, right surround */
+        BCenter = 0,    /* 1 if decoder has back center channel */
+        LChans  = 0,    /* LFE channels */
+        XChans  = 0,    /* scratch space for parsing unused channels */
+
+        Chans   = FChans + SChans + BChans + LChans + XChans
+    };
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CHANS_H */
+
diff --git a/media/libstagefright/codecs/aacdec/check_crc.cpp b/media/libstagefright/codecs/aacdec/check_crc.cpp
new file mode 100644
index 0000000..17f3b87
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/check_crc.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: check_crc.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    INPUT
+
+
+    OUTPUT
+
+    errorCode, noError if successful
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "check_crc.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 check_crc(HANDLE_CRC hCrcBuf, UInt32 bValue, Int32 nBits)
+{
+    Int32 i;
+    UInt32 bMask = (1UL << (nBits - 1));
+
+    for (i = 0; i < nBits; i++, bMask >>= 1)
+    {
+        UInt16 flag  = (UInt16)((hCrcBuf->crcState & hCrcBuf->crcMask) ? 1 : 0);
+        UInt16 flag1 = (UInt16)((bMask & bValue) ? 1 : 0);
+
+        flag ^= flag1;
+        hCrcBuf->crcState <<= 1;
+        if (flag)
+            hCrcBuf->crcState ^= hCrcBuf->crcPoly;
+    }
+
+}
+
diff --git a/media/libstagefright/codecs/aacdec/check_crc.h b/media/libstagefright/codecs/aacdec/check_crc.h
new file mode 100644
index 0000000..9293d47
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/check_crc.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.
+ * -------------------------------------------------------------------
+ */
+/*
+ Filename: check_crc.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef CHECK_CRC_H
+#define CHECK_CRC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_crc_buffer.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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 check_crc(HANDLE_CRC hCrcBuf,
+    UInt32 bValue,
+    Int32 nBits);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/dct16.cpp b/media/libstagefright/codecs/aacdec/dct16.cpp
new file mode 100644
index 0000000..75bd4ba
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dct16.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.
+ * -------------------------------------------------------------------
+ */
+/*
+ Filename: dct16.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 16
+
+    Int32 flag           1  forward dct16, 0 modified dct-16
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement dct of lenght 16
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include "dct16.h"
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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 dct_16(Int32 vec[], Int flag)
+{
+    Int32 tmp0;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 tmp3;
+    Int32 tmp4;
+    Int32 tmp5;
+    Int32 tmp6;
+    Int32 tmp7;
+    Int32 tmp_o0;
+    Int32 tmp_o1;
+    Int32 tmp_o2;
+    Int32 tmp_o3;
+    Int32 tmp_o4;
+    Int32 tmp_o5;
+    Int32 tmp_o6;
+    Int32 tmp_o7;
+    Int32 itmp_e0;
+    Int32 itmp_e1;
+    Int32 itmp_e2;
+
+    /*  split input vector */
+
+
+    tmp_o0 = fxp_mul32_by_16((vec[ 0] - vec[15]), Qfmt15(0.50241928618816F));
+    tmp0   =  vec[ 0] + vec[15];
+
+    tmp_o7 = fxp_mul32_Q31((vec[ 7] - vec[ 8]) << 3, Qfmt_31(0.63764357733614F));
+    tmp7   =  vec[ 7] + vec[ 8];
+
+    itmp_e0 = (tmp0 + tmp7);
+    tmp7    = fxp_mul32_by_16((tmp0 - tmp7), Qfmt15(0.50979557910416F));
+
+    tmp_o1 = fxp_mul32_by_16((vec[ 1] - vec[14]), Qfmt15(0.52249861493969F));
+    tmp1   =  vec[ 1] + vec[14];
+    tmp_o6 = fxp_mul32_by_16((vec[ 6] - vec[ 9]) << 1, Qfmt15(0.86122354911916F));
+    tmp6   =  vec[ 6] + vec[ 9];
+
+    itmp_e1 = (tmp1 + tmp6);
+    tmp6    = fxp_mul32_by_16((tmp1 - tmp6), Qfmt15(0.60134488693505F));
+
+    tmp_o2 = fxp_mul32_by_16((vec[ 2] - vec[13]), Qfmt15(0.56694403481636F));
+    tmp2   =  vec[ 2] + vec[13];
+    tmp_o5 = fxp_mul32_by_16((vec[ 5] - vec[10]) << 1, Qfmt15(0.53033884299517F));
+    tmp5   =  vec[ 5] + vec[10];
+
+    itmp_e2 = (tmp2 + tmp5);
+    tmp5    = fxp_mul32_by_16((tmp2 - tmp5), Qfmt15(0.89997622313642F));
+
+    tmp_o3 = fxp_mul32_by_16((vec[ 3] - vec[12]), Qfmt15(0.64682178335999F));
+    tmp3   =  vec[ 3] + vec[12];
+    tmp_o4 = fxp_mul32_by_16((vec[ 4] - vec[11]), Qfmt15(0.78815462345125F));
+    tmp4   =  vec[ 4] + vec[11];
+
+    tmp1   = (tmp3 + tmp4);
+    tmp4   =  fxp_mul32_Q31((tmp3 - tmp4) << 2, Qfmt_31(0.64072886193538F));
+
+    /*  split even part of tmp_e */
+
+    tmp0 = (itmp_e0 + tmp1);
+    tmp1 = fxp_mul32_by_16((itmp_e0 - tmp1), Qfmt15(0.54119610014620F));
+
+
+    tmp3 = fxp_mul32_by_16((itmp_e1 - itmp_e2) << 1, Qfmt15(0.65328148243819F));
+    tmp2 = (itmp_e1 + itmp_e2);
+
+    vec[ 0]  = (tmp0 + tmp2) >> 1;
+    vec[ 8]  = fxp_mul32_by_16((tmp0 - tmp2), Qfmt15(0.70710678118655F));
+    vec[12]  = fxp_mul32_by_16((tmp1 - tmp3) << 1, Qfmt15(0.70710678118655F));
+    vec[ 4]  =  tmp1 + tmp3;
+    vec[ 4] +=  vec[12];
+
+    /*  split odd part of tmp_e */
+
+    tmp1 = fxp_mul32_by_16((tmp7 - tmp4) << 1, Qfmt15(0.54119610014620F));
+    tmp7 += tmp4;
+    tmp3 = fxp_mul32_Q31((tmp6 - tmp5) << 2, Qfmt_31(0.65328148243819F));
+
+    tmp6 += tmp5;
+
+    vec[10]  = fxp_mul32_by_16((tmp7 - tmp6) << 1, Qfmt15(0.70710678118655F));
+    vec[ 2]  =  tmp7 + tmp6;
+    vec[14]  = fxp_mul32_by_16((tmp1 - tmp3) << 1, Qfmt15(0.70710678118655F));
+
+    tmp1    +=  tmp3 + vec[14];
+    vec[ 2] +=  tmp1;
+    vec[ 6]  =  tmp1 + vec[10];
+
+    vec[10] += vec[14];
+
+
+    // dct8;
+
+    tmp7 = tmp_o0 + tmp_o7;
+    tmp_o7 = fxp_mul32_by_16((tmp_o0 - tmp_o7) << 1, Qfmt15(0.50979557910416F));
+
+    tmp6 = tmp_o1 + tmp_o6;
+    tmp_o1 = fxp_mul32_by_16((tmp_o1 - tmp_o6) << 1, Qfmt15(0.60134488693505F));
+
+    tmp5 = tmp_o2 + tmp_o5;
+    tmp_o5 = fxp_mul32_by_16((tmp_o2 - tmp_o5) << 1, Qfmt15(0.89997622313642F));
+
+    tmp4 = tmp_o3 + tmp_o4;
+
+    tmp_o3 = fxp_mul32_Q31((tmp_o3 - tmp_o4) << 3, Qfmt_31(0.6407288619354F));
+
+    if (!flag)
+    {
+        tmp7   = -tmp7;
+        tmp_o7 = -tmp_o7;
+        tmp6   = -tmp6;
+        tmp_o1 = -tmp_o1;
+        tmp5   = -tmp5;
+        tmp_o5 = -tmp_o5;
+        tmp4   = -tmp4;
+        tmp_o3 = -tmp_o3;
+    }
+
+    // even part
+
+    tmp1 = fxp_mul32_by_16((tmp7 - tmp4) << 1, Qfmt15(0.54119610014620F));
+    tmp0 =  tmp7 + tmp4;
+    tmp3 = fxp_mul32_Q31((tmp6 - tmp5) << 2, Qfmt_31(0.65328148243819F));
+    tmp2 =  tmp6 + tmp5;
+
+    vec[ 9]  = fxp_mul32_Q31((tmp0 - tmp2) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 1]  =  tmp0 + tmp2;
+    vec[13]  = fxp_mul32_Q31((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
+
+    vec[ 5]  =  tmp1 + tmp3 + vec[13];
+
+    // odd part
+
+    tmp0 =  tmp_o7 + tmp_o3;
+    tmp1 = fxp_mul32_by_16((tmp_o7 - tmp_o3) << 1, Qfmt15(0.54119610014620F));
+    tmp2 =  tmp_o1 + tmp_o5;
+    tmp3 = fxp_mul32_Q31((tmp_o1 - tmp_o5) << 2, Qfmt_31(0.65328148243819F));
+
+    vec[11]  = fxp_mul32_Q31((tmp0 - tmp2) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 3]  =  tmp0 + tmp2;
+    vec[15]  = fxp_mul32_Q31((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 7]  =  tmp1 + tmp3 + vec[15];
+
+
+    vec[ 3] += vec[ 7];
+    vec[ 7] += vec[11];
+    vec[11] += vec[15];
+
+    vec[ 1] += vec[ 3];
+    vec[ 3] += vec[ 5];
+    vec[ 5] += vec[ 7];
+    vec[ 7] += vec[ 9];
+    vec[ 9] += vec[11];
+    vec[11] += vec[13];
+    vec[13] += vec[15];
+
+
+}
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/dct16.h b/media/libstagefright/codecs/aacdec/dct16.h
new file mode 100644
index 0000000..6f8fcb2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dct16.h
@@ -0,0 +1,68 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/dct16.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef DCT16_H
+#define DCT16_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void dct_16(Int32 vec[], Int flag);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* DCT16_H */
diff --git a/media/libstagefright/codecs/aacdec/dct64.cpp b/media/libstagefright/codecs/aacdec/dct64.cpp
new file mode 100644
index 0000000..a21a814
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dct64.cpp
@@ -0,0 +1,569 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: dct64.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 64
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement dct of lenght 64
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "dct16.h"
+#include "dct64.h"
+
+#include "pv_audio_type_defs.h"
+#include "synthesis_sub_band.h"
+
+#include "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Qfmt(a)   (Int32)(a*((Int32)1<<26) + (a>=0?0.5F:-0.5F))
+#define Qfmt31(a)   (Int32)(a*0x7FFFFFFF)
+
+const Int32 CosTable_48[48] =
+{
+    Qfmt31(0.50015063602065F) ,  Qfmt31(0.50135845244641F) ,
+    Qfmt31(0.50378872568104F) ,  Qfmt31(0.50747117207256F) ,
+    Qfmt31(0.51245147940822F) ,  Qfmt31(0.51879271310533F) ,
+    Qfmt31(0.52657731515427F) ,  Qfmt31(0.53590981690799F) ,
+    Qfmt31(0.54692043798551F) ,  Qfmt31(0.55976981294708F) ,
+    Qfmt31(0.57465518403266F) ,  Qfmt31(0.59181853585742F) ,
+    Qfmt31(0.61155734788251F) ,  Qfmt31(0.63423893668840F) ,
+    Qfmt31(0.66031980781371F) ,  Qfmt31(0.69037212820021F) ,
+    Qfmt31(0.72512052237720F) ,  Qfmt31(0.76549416497309F) ,
+    Qfmt31(0.81270209081449F) ,  Qfmt31(0.86834471522335F) ,
+    Qfmt(0.93458359703641F) ,  Qfmt(1.01440826499705F) ,
+    Qfmt(1.11207162057972F) ,  Qfmt(1.23383273797657F) ,
+    Qfmt(1.38929395863283F) ,  Qfmt(1.59397228338563F) ,
+    Qfmt(1.87467598000841F) ,  Qfmt(2.28205006800516F) ,
+    Qfmt(2.92462842815822F) ,  Qfmt(4.08461107812925F) ,
+    Qfmt(6.79675071167363F) ,  Qfmt(20.37387816723145F) , /* 32 */
+    Qfmt(0.50060299823520F) ,  Qfmt(0.50547095989754F) ,
+    Qfmt(0.51544730992262F) ,  Qfmt(0.53104259108978F) ,
+    Qfmt(0.55310389603444F) ,  Qfmt(0.58293496820613F) ,
+    Qfmt(0.62250412303566F) ,  Qfmt(0.67480834145501F) ,
+    Qfmt(0.74453627100230F) ,  Qfmt(0.83934964541553F) ,
+    Qfmt(0.97256823786196F) ,  Qfmt(1.16943993343288F) ,
+    Qfmt(1.48416461631417F) ,  Qfmt(2.05778100995341F) ,
+    Qfmt(3.40760841846872F) ,  Qfmt(10.19000812354803F)
+};
+
+
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; dct_64
+----------------------------------------------------------------------------*/
+
+void pv_split_LC(Int32 *vector,
+                 Int32 *temp_o)
+{
+
+    Int32 i;
+    Int32 *pt_vector     = &vector[0];
+    Int32 *pt_vector_N_1 = &vector[31];
+    const Int32 *pt_cosTerms = &CosTable_48[32];
+    Int32 *pt_temp_o = temp_o;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 tmp3;
+
+
+    tmp1 = *(pt_vector);
+    tmp2 = *(pt_vector_N_1--);
+    for (i = 16; i != 0; i--)
+    {
+        tmp3 = *(pt_cosTerms++);
+        *(pt_vector++) =   tmp1  + tmp2;
+        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), tmp3);
+        tmp1 = *(pt_vector);
+        tmp2 = *(pt_vector_N_1--);
+    }
+
+}
+
+
+#ifdef HQ_SBR
+
+
+void dct_64(Int32 vec[], Int32 *scratch_mem)
+{
+    Int32 *temp_e1;
+    Int32 *temp_o1;
+
+    Int32 *pt_vec;
+
+    Int   i;
+
+    Int32 aux1;
+    Int32 aux2;
+    Int32 aux3;
+    Int32 aux4;
+
+    const Int32 *cosTerms = &CosTable_48[31];
+
+    temp_o1 = &vec[32];
+    temp_e1 = temp_o1 - 1;
+
+
+    for (i = 6; i != 0; i--)
+    {
+        aux1 = *(temp_e1);
+        aux2 = *(temp_o1);
+        aux3 = *(cosTerms--);
+        *(temp_e1--) =   aux1  + aux2;
+        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
+        aux1 = *(temp_e1);
+        aux2 = *(temp_o1);
+        aux3 = *(cosTerms--);
+        *(temp_e1--) =   aux1  + aux2;
+        *(temp_o1++) = fxp_mul32_Q26((aux1 - aux2), aux3);
+    }
+
+
+    for (i = 10; i != 0; i--)
+    {
+        aux1 = *(temp_e1);
+        aux2 = *(temp_o1);
+        aux3 = *(cosTerms--);
+        *(temp_e1--) =   aux1  + aux2;
+        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
+        aux1 = *(temp_e1);
+        aux2 = *(temp_o1);
+        aux3 = *(cosTerms--);
+        *(temp_e1--) =   aux1  + aux2;
+        *(temp_o1++) = fxp_mul32_Q31((aux1 - aux2), aux3) << 1;
+    }
+
+
+    pv_split(&vec[16]);
+
+    dct_16(&vec[16], 0);
+    dct_16(vec,     1);      // Even terms
+
+    pv_merge_in_place_N32(vec);
+
+    pv_split_z(&vec[32]);
+
+    dct_16(&vec[32], 1);     // Even terms
+    dct_16(&vec[48], 0);
+
+    pv_merge_in_place_N32(&vec[32]);
+
+
+
+    aux1   = vec[32];
+    aux3   = vec[33];
+    aux4   = vec[ 1];  /* vec[ 1] */
+
+    /* -----------------------------------*/
+    aux1     = vec[32] + vec[33];
+    vec[ 0] +=  aux1;
+    vec[ 1] +=  aux1;
+
+    aux1        = vec[34];
+    aux2        = vec[ 2];   /* vec[ 2] */
+    aux3        += aux1;
+    vec[ 2] = aux4 + aux3;
+    aux4        = vec[ 3];  /* vec[ 3] */
+    vec[ 3] = aux2 + aux3;
+
+    aux3        = vec[35];
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[32] = vec[ 4];
+    vec[33] = vec[ 5];
+    vec[ 4] = aux2 + aux1;
+    vec[ 5] = aux4 + aux1;
+
+    aux1        = vec[36];
+    aux2        = vec[32];  /* vec[ 4] */
+    aux3        += aux1;
+    vec[34] = vec[ 6];
+    vec[35] = vec[ 7];
+    vec[ 6] = aux4 + aux3;
+    vec[ 7] = aux2 + aux3;
+
+    aux3        = vec[37];
+    aux4        = vec[33];  /* vec[ 5] */
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[32] = vec[ 8];
+    vec[33] = vec[ 9];
+    vec[ 8] = aux2 + aux1;
+    vec[ 9] = aux4 + aux1;
+
+    aux1        = vec[38];
+    aux2        = vec[34];  /* vec[ 6] */
+    aux3        += aux1;
+    vec[34] = vec[10];
+    vec[10] = aux4 + aux3;
+    aux4        = vec[35];  /* vec[ 7] */
+    vec[35] = vec[11];
+    vec[11] = aux2 + aux3;
+
+    aux3        = vec[39];
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[36] = vec[12];
+    vec[37] = vec[13];
+    vec[12] = aux2 + aux1;
+    vec[13] = aux4 + aux1;
+
+    aux1        = vec[40];
+    aux2        = vec[32];  /* vec[ 8] */
+    aux3        += aux1;
+    vec[32] = vec[14];
+    vec[14] = aux4 + aux3;
+    aux4        = vec[33];  /* vec[ 9] */
+    vec[33] = vec[15];
+    vec[15] = aux2 + aux3;
+
+    aux3        = vec[41];
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[38] = vec[16];
+    vec[39] = vec[17];
+    vec[16] = aux2 + aux1;
+    vec[17] = aux4 + aux1;
+
+    aux1        = vec[42];
+    aux2        = vec[34];  /* vec[10] */
+    aux3        += aux1;
+    vec[34] = vec[18];
+    vec[18] = aux4 + aux3;
+    aux4        = vec[35];  /* vec[11] */
+    vec[35] = vec[19];
+    vec[19] = aux2 + aux3;
+
+    aux3        = vec[43];
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[40] = vec[20];
+    vec[41] = vec[21];
+    vec[20] = aux2 + aux1;
+    vec[21] = aux4 + aux1;
+
+    aux1        = vec[44];
+    aux2        = vec[36];  /* vec[12] */
+    aux3        += aux1;
+    vec[42] = vec[22];
+    vec[43] = vec[23];
+    vec[22] = aux4 + aux3;
+    vec[23] = aux2 + aux3;
+
+    aux3        = vec[45];
+    aux4        = vec[37];  /* vec[13] */
+
+    /* -----------------------------------*/
+
+
+    scratch_mem[0] = vec[24];
+    scratch_mem[1] = vec[25];
+    aux1        += aux3;
+    vec[24] = aux2 + aux1;
+    vec[25] = aux4 + aux1;
+
+    aux1        = vec[46];
+    aux2        = vec[32];  /* vec[14] */
+    scratch_mem[2] = vec[26];
+    scratch_mem[3] = vec[27];
+    aux3        += aux1;
+    vec[26] = aux4 + aux3;
+    vec[27] = aux2 + aux3;
+
+    aux3        = vec[47];
+    aux4        = vec[33];  /* vec[15] */
+
+    /* -----------------------------------*/
+    scratch_mem[4] = vec[28];
+    scratch_mem[5] = vec[29];
+    aux1        += aux3;
+    vec[28] = aux2 + aux1;
+    vec[29] = aux4 + aux1;
+
+    aux1        = vec[48];
+    aux2        = vec[38];  /* vec[16] */
+    scratch_mem[6] = vec[30];
+    scratch_mem[7] = vec[31];
+    aux3        += aux1;
+    vec[30] = aux4 + aux3;
+    vec[31] = aux2 + aux3;
+
+    aux3        = vec[49];
+    aux4        = vec[39];  /* vec[17] */
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[32] = aux2 + aux1;
+    vec[33] = aux4 + aux1;
+
+    aux1        = vec[50];
+    aux2        = vec[34];  /* vec[18] */
+    aux3        += aux1;
+    vec[34] = aux4 + aux3;
+    aux4        = vec[35];  /* vec[19] */
+    vec[35] = aux2 + aux3;
+
+    aux3        = vec[51];
+
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[36] = aux2 + aux1;
+    vec[37] = aux4 + aux1;
+
+    aux1        = vec[52];
+    aux2        = vec[40];  /* vec[20] */
+    aux3        += aux1;
+    vec[38] = aux4 + aux3;
+    vec[39] = aux2 + aux3;
+
+    aux3        = vec[53];
+    aux4        = vec[41];  /* vec[21] */
+
+    /* -----------------------------------*/
+    aux1        += aux3;
+    vec[40] = aux2 + aux1;
+    vec[41] = aux4 + aux1;
+
+    aux1        = vec[54];
+    aux2        = vec[42];  /* vec[22] */
+    aux3        += aux1;
+    vec[42] = aux4 + aux3;
+    aux4        = vec[43];  /* vec[23] */
+    vec[43] = aux2 + aux3;
+
+    aux3        = vec[55];
+
+    /* -----------------------------------*/
+
+    pt_vec = &vec[44];
+    temp_o1 = &vec[56];
+    temp_e1 = &scratch_mem[0];
+
+    for (i = 4; i != 0; i--)
+    {
+        aux1        += aux3;
+        *(pt_vec++) = aux2 + aux1;
+        *(pt_vec++) = aux4 + aux1;
+
+        aux1        = *(temp_o1++);
+        aux3        += aux1;
+        aux2        = *(temp_e1++);
+        *(pt_vec++) = aux4 + aux3;
+        *(pt_vec++) = aux2 + aux3;
+
+        aux3        = *(temp_o1++);
+        aux4        = *(temp_e1++);
+    }
+
+    aux1       += aux3;
+    vec[60] = aux2 + aux1;
+    vec[61] = aux4 + aux1;
+    vec[62] = aux4 + aux3;
+
+}
+
+
+#endif
+
+/*----------------------------------------------------------------------------
+; pv_split
+----------------------------------------------------------------------------*/
+
+
+void pv_split(Int32 *temp_o)
+{
+
+    Int32 i;
+    const Int32 *pt_cosTerms = &CosTable_48[47];
+    Int32 *pt_temp_o = temp_o;
+    Int32 *pt_temp_e = pt_temp_o - 1;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 cosx;
+
+    for (i = 8; i != 0; i--)
+    {
+        tmp2 = *(pt_temp_o);
+        tmp1 = *(pt_temp_e);
+        cosx = *(pt_cosTerms--);
+        *(pt_temp_e--) =   tmp1  + tmp2;
+        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
+        tmp1 = *(pt_temp_e);
+        tmp2 = *(pt_temp_o);
+        cosx = *(pt_cosTerms--);
+        *(pt_temp_e--) =   tmp1  + tmp2;
+        *(pt_temp_o++) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
+    }
+}
+
+
+
+void pv_split_z(Int32 *vector)
+{
+    Int32 i;
+    Int32 *pt_vector     = &vector[31];
+    const Int32 *pt_cosTerms = &CosTable_48[32];
+    Int32 *pt_temp_e = vector;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 cosx;
+
+    for (i = 8; i != 0; i--)
+    {
+        tmp1 = *(pt_vector);
+        tmp2 = *(pt_temp_e);
+        cosx = *(pt_cosTerms++);
+        *(pt_temp_e++) =   tmp1  + tmp2;
+        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
+        tmp2 = *(pt_temp_e);
+        tmp1 = *(pt_vector);
+        cosx = *(pt_cosTerms++);
+        *(pt_temp_e++) =   tmp1  + tmp2;
+        *(pt_vector--) = fxp_mul32_Q26((tmp1 - tmp2), cosx);
+    }
+}
+
+
+void pv_merge_in_place_N32(Int32 vec[])
+{
+
+    Int32 temp[4];
+
+    temp[0] = vec[14];
+    vec[14] = vec[ 7];
+    temp[1] = vec[12];
+    vec[12] = vec[ 6];
+    temp[2] = vec[10];
+    vec[10] = vec[ 5];
+    temp[3] = vec[ 8];
+    vec[ 8] = vec[ 4];
+    vec[ 6] = vec[ 3];
+    vec[ 4] = vec[ 2];
+    vec[ 2] = vec[ 1];
+
+    vec[ 1] = vec[16] + vec[17];
+    vec[16] = temp[3];
+    vec[ 3] = vec[18] + vec[17];
+    vec[ 5] = vec[19] + vec[18];
+    vec[18] = vec[9];
+    temp[3] = vec[11];
+
+    vec[ 7] = vec[20] + vec[19];
+    vec[ 9] = vec[21] + vec[20];
+    vec[20] = temp[2];
+    temp[2] = vec[13];
+    vec[11] = vec[22] + vec[21];
+    vec[13] = vec[23] + vec[22];
+    vec[22] = temp[3];
+    temp[3] = vec[15];
+    vec[15] = vec[24] + vec[23];
+    vec[17] = vec[25] + vec[24];
+    vec[19] = vec[26] + vec[25];
+    vec[21] = vec[27] + vec[26];
+    vec[23] = vec[28] + vec[27];
+    vec[25] = vec[29] + vec[28];
+    vec[27] = vec[30] + vec[29];
+    vec[29] = vec[30] + vec[31];
+    vec[24] = temp[1];
+    vec[26] = temp[2];
+    vec[28] = temp[0];
+    vec[30] = temp[3];
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/dct64.h b/media/libstagefright/codecs/aacdec/dct64.h
new file mode 100644
index 0000000..3d5e82b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dct64.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/dct64.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef DCT64_H
+#define DCT64_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+    extern const Int32 CosTable_48[48];
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void pv_split_LC(Int32 *vector,
+                     Int32 *temp_o);
+
+
+#ifdef HQ_SBR
+
+    void dct_64(Int32 vec[], Int32 *scratch_mem);
+
+#endif
+
+    void pv_split(Int32 *temp_o);
+
+    void pv_split_z(Int32 *vector);
+
+    void pv_merge_in_place_N32(Int32 vec[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* DCT64_H */
diff --git a/media/libstagefright/codecs/aacdec/decode_huff_cw_binary.cpp b/media/libstagefright/codecs/aacdec/decode_huff_cw_binary.cpp
new file mode 100644
index 0000000..0d1561b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/decode_huff_cw_binary.cpp
@@ -0,0 +1,708 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/decode_huff_cw_binary.c
+ Funtions:
+    decode_huff_cw_tab1
+    decode_huff_cw_tab2
+    decode_huff_cw_tab3
+    decode_huff_cw_tab4
+    decode_huff_cw_tab5
+    decode_huff_cw_tab6
+    decode_huff_cw_tab7
+    decode_huff_cw_tab8
+    decode_huff_cw_tab9
+    decode_huff_cw_tab10
+    decode_huff_cw_tab11
+    decode_huff_cw_scl
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Updated per review comments
+              (1) make cw sgined and change "if(cw&0x80000000)" to if(cw<0)
+              (2)
+
+ Description: Create specific functions for different huffman tables.
+
+
+ Description: Added ( Int16) castings to eliminate several compiler warnings
+
+
+ Description: Modified huffman tables to allocate int32 variables instead of
+              int16, which lead to data missaligned for some compiler.
+              Eliminated casting and unused variables
+
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    BITS          *pInputStream = pointer to input bit stream
+
+ Local Stores/Buffers/Pointers Needed:
+
+
+ Global Stores/Buffers/Pointers Needed:
+
+
+ Outputs:
+    idx = bit field extracted from a leaf entry of packed Huffman Tables
+
+ Pointers and Buffers Modified:
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   These functions are used to decode huffman codewords from the input
+   bitstream using combined binary search and look-up table approach.
+
+   First the codewords are grouped and the input symbol is determined
+   which group it belongs. Then within that group, a look-up table is
+   used to determine which codeword the symbol is.
+   The table is created by ordering the codeword in the table according to their
+   normalized shifted binary value, i.e., all the codewords are left
+   shifted to meet the maximum codelength. Example, max codelength is
+   10, the codeword with lenth 3 will left shift by 7.
+   The binary values of after the shift are sorted.
+   Then the sorted table is divided into several partition.
+   At the VLC decoding period, input is read in at max codelenght.
+   The partition is decided using if-else logic.
+   Inside each partition, a look-up table is used to map the input value
+   to a correct symbol. Table entries can appear to be repeated according
+   to the humming distance between adjacent codewords.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) Introduction to Algorithms,
+     Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest.
+     The MIT press, 1990
+
+ (3) "Selecting an Optimal Huffman Decoder for AAC",
+     Vladimir Z. Mesarovic, et al.
+     AES 111th Convention, September 21-24, 2001, New York, USA
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE:
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES:
+
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "huffman.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define    MAX_CW_LEN  (19)
+#define    MASK_IDX    (0x1FF)
+#define    MASK_RIGHT  (0xFE00)
+
+#define    UPPER16      (16)
+#define    MASK_LOW16   (0xFFFF)
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int decode_huff_cw_tab1(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              11,
+              pInputStream);
+    if ((cw >> 10) == 0)
+    {
+        pInputStream->usedBits -= (11 - 1);
+        return 40; /* idx is 40 */
+    }
+    else if ((cw >> 6) <= 23)
+    {
+        tab = (cw >> 6) - 16;
+    }
+    else if ((cw >> 4) <= 119)
+    {
+        tab = (cw >> 4) - 96 + 8;
+    }
+    else if ((cw >> 2) <= 503)
+    {
+        tab = (cw >> 2) - 480 + 32;
+    }
+    else
+    {
+        tab = cw - 2016 + 56;
+    }
+
+    tab = *(huff_tab1 + tab);
+
+    pInputStream->usedBits -= (11 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab2(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get9_n_lessbits(
+              9,
+              pInputStream);
+    if ((cw >> 6) == 0)
+    {
+        pInputStream->usedBits -= (9 - 3); /* used 3 bits */
+        return 40; /* idx is 40 */
+    }
+    else if ((cw >> 3) <= 49)
+    {
+        tab = (cw >> 3) - 8;
+    }
+    else if ((cw >> 2) <= 114)
+    {
+        tab = (cw >> 2) - 100 + 42;
+    }
+    else if ((cw >> 1) <= 248)
+    {
+        tab = (cw >> 1) - 230 + 57;
+    }
+    else
+    {
+        tab = cw - 498 + 76;
+    }
+
+    tab = *(huff_tab2 + tab);
+
+    pInputStream->usedBits -= (9 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab3(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              16,
+              pInputStream);
+    if ((cw >> 15) == 0)
+    {
+        pInputStream->usedBits -= (16 - 1); /* used 1 bits */
+        return 0; /* idx is 0 */
+    }
+    else if ((cw >> 10) <= 57)
+    {
+        tab = (cw >> 10) - 32;
+    }
+    else if ((cw >> 7) <= 500)
+    {
+        tab = (cw >> 7) - 464 + 26;
+    }
+    else if ((cw >> 6) <= 1016)
+    {
+        tab = (cw >> 6) - 1002 + 63;
+    }
+    else if ((cw >> 4) <= 4092)
+    {
+        tab = (cw >> 4) - 4068 + 78;
+    }
+    else
+    {
+        tab = cw - 65488 + 103;
+    }
+
+    tab = *(huff_tab3 + tab);
+
+    pInputStream->usedBits -= (16 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab4(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              12,
+              pInputStream);
+
+    if ((cw >> 7) <= 25)
+    {
+        tab = (cw >> 7);
+    }
+    else if ((cw >> 4) <= 246)
+    {
+        tab = (cw >> 4) - 208 + 26;
+    }
+    else if ((cw >> 2) <= 1017)
+    {
+        tab = (cw >> 2) - 988 + 65;
+    }
+    else
+    {
+        tab = cw - 4072 + 95;
+    }
+
+    tab = *(huff_tab4 + tab);
+
+    pInputStream->usedBits -= (12 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+
+Int decode_huff_cw_tab5(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              13,
+              pInputStream);
+
+    if ((cw >> 12) == 0)
+    {
+        pInputStream->usedBits -= (13 - 1); /* used 1 bits */
+        return 40; /* idx is 40 */
+    }
+    else if ((cw >> 8) <= 27)
+    {
+        tab = (cw >> 8) - 16;
+    }
+    else if ((cw >> 5) <= 243)
+    {
+        tab = (cw >> 5) - 224 + 12;
+    }
+    else if ((cw >> 3) <= 1011)
+    {
+        tab = (cw >> 3) - 976 + 32;
+    }
+    else if ((cw >> 2) <= 2041)
+    {
+        tab = (cw >> 2) - 2024 + 68;
+    }
+    else
+    {
+        tab = cw - 8168 + 86;
+    }
+
+    tab = *(huff_tab5 + tab);
+
+    pInputStream->usedBits -= (13 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+
+Int decode_huff_cw_tab6(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              11,
+              pInputStream);
+
+    if ((cw >> 7) <= 8)
+    {
+        tab = (cw >> 7);
+    }
+    else if ((cw >> 4) <= 116)
+    {
+        tab = (cw >> 4) - 72 + 9;
+    }
+    else if ((cw >> 2) <= 506)
+    {
+        tab = (cw >> 2) - 468 + 54;
+    }
+    else
+    {
+        tab = cw - 2028 + 93;
+    }
+
+    tab = *(huff_tab6 + tab);
+
+    pInputStream->usedBits -= (11 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+
+Int decode_huff_cw_tab7(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              12,
+              pInputStream);
+
+    if ((cw >> 11) == 0)
+    {
+        pInputStream->usedBits -= (12 - 1); /* used 1 bits */
+        return 0; /* idx is 0 */
+    }
+    else if ((cw >> 6) <= 55)
+    {
+        tab = (cw >> 6) - 32;
+    }
+    else if ((cw >> 4) <= 243)
+    {
+        tab = (cw >> 4) - 224 + 24;
+    }
+    else if ((cw >> 2) <= 1018)
+    {
+        tab = (cw >> 2) - 976 + 44;
+    }
+    else
+    {
+        tab = cw - 4076 + 87;
+    }
+
+    tab = *(huff_tab7 + tab);
+
+    pInputStream->usedBits -= (12 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+
+Int decode_huff_cw_tab8(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              10,
+              pInputStream);
+
+    if ((cw >> 5) <= 20)
+    {
+        tab = (cw >> 5);
+    }
+    else if ((cw >> 3) <= 117)
+    {
+        tab = (cw >> 3) - 84 + 21;
+    }
+    else if ((cw >> 2) <= 250)
+    {
+        tab = (cw >> 2) - 236 + 55;
+    }
+    else
+    {
+        tab = cw - 1004 + 70;
+    }
+
+    tab = *(huff_tab8 + tab);
+
+    pInputStream->usedBits -= (10 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab9(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              15,
+              pInputStream);
+
+    if ((cw >> 11) <= 12)
+    {
+        tab = (cw >> 11);
+    }
+    else if ((cw >> 8) <= 114)
+    {
+        tab = (cw >> 8) - 104 + 13;
+    }
+    else if ((cw >> 6) <= 486)
+    {
+        tab = (cw >> 6) - 460 + 24;
+    }
+    else if ((cw >> 5) <= 993)
+    {
+        tab = (cw >> 5) - 974 + 51;
+    }
+    else if ((cw >> 4) <= 2018)
+    {
+        tab = (cw >> 4) - 1988 + 71;
+    }
+    else if ((cw >> 3) <= 4075)
+    {
+        tab = (cw >> 3) - 4038 + 102;
+    }
+    else if ((cw >> 2) <= 8183)
+    {
+        tab = (cw >> 2) - 8152 + 140;
+    }
+    else
+    {
+        tab = cw - 32736 + 172;
+    }
+
+    tab = *(huff_tab9 + tab);
+
+    pInputStream->usedBits -= (15 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab10(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              12,
+              pInputStream);
+
+    if ((cw >> 6) <= 41)
+    {
+        tab = (cw >> 6);
+    }
+    else if ((cw >> 5) <= 100)
+    {
+        tab = (cw >> 5) - 84 + 42;
+    }
+    else if ((cw >> 4) <= 226)
+    {
+        tab = (cw >> 4) - 202 + 59;
+    }
+    else if ((cw >> 3) <= 484)
+    {
+        tab = (cw >> 3) - 454 + 84;
+    }
+    else if ((cw >> 2) <= 1010)
+    {
+        tab = (cw >> 2) - 970 + 115;
+    }
+    else if ((cw >> 1) <= 2043)
+    {
+        tab = (cw >> 1) - 2022 + 156;
+    }
+    else
+    {
+        tab = cw - 4088 + 178;
+    }
+
+    tab = *(huff_tab10 + tab);
+
+    pInputStream->usedBits -= (12 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_cw_tab11(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = get17_n_lessbits(
+              12,
+              pInputStream);
+
+    if ((cw >> 6) <= 26)
+    {
+        tab = (cw >> 6);
+    }
+    else if ((cw >> 5) <= 69)
+    {
+        tab = (cw >> 5) - 54 + 27;
+    }
+    else if ((cw >> 4) <= 198)
+    {
+        tab = (cw >> 4) - 140 + 43;
+    }
+    else if ((cw >> 3) <= 452)
+    {
+        tab = (cw >> 3) - 398 + 102;
+    }
+    else if ((cw >> 2) <= 1000)
+    {
+        tab = (cw >> 2) - 906 + 157;
+    }
+    else if ((cw >> 1) <= 2044)
+    {
+        tab = (cw >> 1) - 2002 + 252;
+    }
+    else
+    {
+        tab = cw - 4090 + 295;
+    }
+
+    tab = *(huff_tab11 + tab);
+
+    pInputStream->usedBits -= (12 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
+
+Int decode_huff_scl(
+    BITS          *pInputStream)
+{
+    Int32  tab;
+    Int32  cw;
+
+    cw  = getbits(
+              19,
+              pInputStream);
+
+    if ((cw >> 18) == 0)
+    {
+        pInputStream->usedBits -= (19 - 1); /* used 1 bits */
+        return 60; /* idx is 60 */
+    }
+    else if ((cw >> 13) <= 59)
+    {
+        tab = (cw >> 13) - 32;
+    }
+    else if ((cw >> 10) <= 505)
+    {
+        tab = (cw >> 10) - 480 + 28;
+    }
+    else if ((cw >> 7) <= 4089)
+    {
+        tab = (cw >> 7) - 4048 + 54;
+    }
+    else if ((cw >> 5) <= 16377)
+    {
+        tab = (cw >> 5) - 16360 + 96;
+    }
+    else if ((cw >> 3) <= 65526)
+    {
+        tab = (cw >> 3) - 65512 + 114;
+    }
+    else if ((cw >> 1) <= 262120)
+    {
+        tab = (cw >> 1) - 262108 + 129;
+    }
+    else
+    {
+        tab = cw - 524242 + 142;
+    }
+
+    tab = *(huff_tab_scl + tab);
+
+    pInputStream->usedBits -= (19 - (tab & MASK_LOW16));
+    return ((Int)(tab >> UPPER16));
+}
+
diff --git a/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.cpp b/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.cpp
new file mode 100644
index 0000000..41cd187
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: decode_noise_floorlevels.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#ifdef AAC_PLUS
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "decode_noise_floorlevels.h"
+#include    "sbr_constants.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 decode_noise_floorlevels(SBR_FRAME_DATA * hFrameData)
+
+{
+    Int32 env;
+    Int32 i;
+
+    Int32 * frameInfo           = hFrameData->frameInfo;
+    Int32   nNfb                = hFrameData->nNfb;
+    Int32 * domain_vec          = hFrameData->domain_vec2;
+
+    Int32 * sbrNoiseFloorLevel_man = hFrameData->sbrNoiseFloorLevel_man;
+    Int32 * prevNoiseLevel_man     = hFrameData->prevNoiseLevel_man;
+
+    Int32 nEnv = frameInfo[(frameInfo[0] << 1) + 3];
+
+    for (env = 0; env < nEnv; env++)
+    {
+        if (domain_vec[env] == 0)
+        {
+            prevNoiseLevel_man[0] = *(sbrNoiseFloorLevel_man++);
+
+            for (i = 1; i < nNfb; i++)
+            {
+                *sbrNoiseFloorLevel_man += *(sbrNoiseFloorLevel_man - 1);
+                prevNoiseLevel_man[i] = *(sbrNoiseFloorLevel_man++);
+            }
+        }
+        else
+        {
+            for (i = 0; i < nNfb; i++)
+            {
+                *sbrNoiseFloorLevel_man += prevNoiseLevel_man[i];
+                prevNoiseLevel_man[i] = *(sbrNoiseFloorLevel_man++);
+            }
+        }
+
+    }
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.h b/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.h
new file mode 100644
index 0000000..a9c3551
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/decode_noise_floorlevels.h
@@ -0,0 +1,92 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: decode_noise_floorlevels.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DECODENOISEFLOORLEVELS_H
+#define DECODENOISEFLOORLEVELS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void decode_noise_floorlevels(SBR_FRAME_DATA * hFrameData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/deinterleave.cpp b/media/libstagefright/codecs/aacdec/deinterleave.cpp
new file mode 100644
index 0000000..5298b19
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/deinterleave.cpp
@@ -0,0 +1,287 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/deinterleave.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description: (1) Modified with new template, rename variables
+              (2) Removed for-loop to calculate win_inc, win_inc = SN2 (128)
+              (3) Replaced for-loop with memcpy
+              (4) Converted Int16 -> Int
+
+ Description: Modified per review comments
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    interleaved   = input array that contains interleaved coefficients
+                    Data Type Int
+
+    deinterleaved = output array that will be updated with de-interleaved
+                    coefficients of input array. Data Type Int
+
+    pFrameInfo = pointer to structure that holds information of current
+                 frame. Data Type FrameInfo
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    deinterleaved  contents updated with de-interleaved coefficients from
+                   the input array: interleaved
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the deinterleaving across all short windows in
+ each group
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should replace the contents of pDeinterleaved with the
+ de-interleaved 1024 coefficients of one frame
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4           p78     quant_to_spec
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pInterleaved   = interleaved;
+    pDeinterleaved = deinterleaved;
+
+    pSfbPerWin  = pFrameInfo->sfb_per_win;
+    ngroups     = pFrameInfo->num_groups;
+    pGroupLen   = pFrameInfo->group_len;
+
+    pGroup = pDeinterleaved;
+
+    FOR (group = ngroups; group > 0; group--)
+
+        pSfbWidth   = pFrameInfo->sfb_width_128;
+        sfb_inc = 0;
+        pStart = pInterleaved;
+
+        FOR (sfb = pSfbPerWin[ngroups-group]; sfb > 0; sfb--)
+
+            pWin = pGroup;
+
+            FOR (win = pGroupLen[ngroups-group]; win > 0; win--)
+
+                pDeinterleaved = pWin + sfb_inc;
+
+                pv_memcpy(
+                     pDeinterleaved,
+                     pInterleaved,
+                    *pSfbWidth*sizeof(*pInterleaved));
+
+                pInterleaved += *pSfbWidth;
+
+                pWin += SN2;
+
+            ENDFOR (win)
+
+            sfb_inc += *pSfbWidth++;
+
+        ENDFOR (sfb)
+
+    pGroup += (pInterleaved - pStart);
+
+    ENDFOR (group)
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "huffman.h"
+#include    "aac_mem_funcs.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 deinterleave(
+    Int16        interleaved[],
+    Int16        deinterleaved[],
+    FrameInfo   *pFrameInfo)
+{
+
+    Int      group;  /* group index */
+    Int      sfb;    /* scalefactor band index */
+    Int      win;    /* window index */
+    Int16    *pGroup;
+    Int16    *pWin;
+    Int16    *pStart;
+    Int16    *pInterleaved;
+    Int16    *pDeinterleaved;
+    Int      sfb_inc;
+
+    Int      ngroups;
+    Int     *pGroupLen;
+    Int     *pSfbPerWin;
+    Int     *pSfbWidth;
+
+    pInterleaved   = interleaved;
+    pDeinterleaved = deinterleaved;
+
+    pSfbPerWin  = pFrameInfo->sfb_per_win;
+    ngroups     = pFrameInfo->num_groups;
+    pGroupLen   = pFrameInfo->group_len;
+
+    pGroup = pDeinterleaved;
+
+    for (group = ngroups; group > 0; group--)
+    {
+        pSfbWidth   = pFrameInfo->sfb_width_128;
+        sfb_inc = 0;
+        pStart = pInterleaved;
+
+        /* Perform the deinterleaving across all windows in a group */
+
+        for (sfb = pSfbPerWin[ngroups-group]; sfb > 0; sfb--)
+        {
+            pWin = pGroup;
+
+            for (win = pGroupLen[ngroups-group]; win > 0; win--)
+            {
+                pDeinterleaved = pWin + sfb_inc;
+
+                pv_memcpy(
+                    pDeinterleaved,
+                    pInterleaved,
+                    *pSfbWidth*sizeof(*pInterleaved));
+
+                pInterleaved += *pSfbWidth;
+
+                pWin += SN2;
+
+            } /* for (win) */
+
+            sfb_inc += *pSfbWidth++;
+
+        } /* for (sfb) */
+
+        pGroup += (pInterleaved - pStart);
+
+    } /* for (group) */
+
+} /* deinterleave */
diff --git a/media/libstagefright/codecs/aacdec/digit_reversal_tables.cpp b/media/libstagefright/codecs/aacdec/digit_reversal_tables.cpp
new file mode 100644
index 0000000..ffa980d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/digit_reversal_tables.cpp
@@ -0,0 +1,279 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/digit_reversal_tables.c
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+  ------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+  Tables for digit reverse operation
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "digit_reversal_tables.h"
+#include "imdct_fxp.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
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ Digit Reverse tables
+------------------------------------------------------------------------------
+*/
+
+const Int16 digit_reverse_64[ 64] =
+{
+    + 0,  + 32,  + 64,  + 96,
+    + 8,  + 40,  + 72, + 104,
+    + 16,  + 48,  + 80, + 112,
+    + 24,  + 56,  + 88, + 120,
+    + 2,  + 34,  + 66,  + 98,
+    + 10,  + 42,  + 74, + 106,
+    + 18,  + 50,  + 82, + 114,
+    + 26,  + 58,  + 90, + 122,
+    + 4,  + 36,  + 68, + 100,
+    + 12,  + 44,  + 76, + 108,
+    + 20,  + 52,  + 84, + 116,
+    + 28,  + 60,  + 92, + 124,
+    + 6,  + 38,  + 70, + 102,
+    + 14,  + 46,  + 78, + 110,
+    + 22,  + 54,  + 86, + 118,
+    + 30,  + 62,  + 94, + 126
+};
+
+
+const Int16 digit_reverse_256[ 256] =
+{
+    + 0, + 128, + 256, + 384,
+    + 32, + 160, + 288, + 416,
+    + 64, + 192, + 320, + 448,
+    + 96, + 224, + 352, + 480,
+    + 8, + 136, + 264, + 392,
+    + 40, + 168, + 296, + 424,
+    + 72, + 200, + 328, + 456,
+    + 104, + 232, + 360, + 488,
+    + 16, + 144, + 272, + 400,
+    + 48, + 176, + 304, + 432,
+    + 80, + 208, + 336, + 464,
+    + 112, + 240, + 368, + 496,
+    + 24, + 152, + 280, + 408,
+    + 56, + 184, + 312, + 440,
+    + 88, + 216, + 344, + 472,
+    + 120, + 248, + 376, + 504,
+    + 2, + 130, + 258, + 386,
+    + 34, + 162, + 290, + 418,
+    + 66, + 194, + 322, + 450,
+    + 98, + 226, + 354, + 482,
+    + 10, + 138, + 266, + 394,
+    + 42, + 170, + 298, + 426,
+    + 74, + 202, + 330, + 458,
+    + 106, + 234, + 362, + 490,
+    + 18, + 146, + 274, + 402,
+    + 50, + 178, + 306, + 434,
+    + 82, + 210, + 338, + 466,
+    + 114, + 242, + 370, + 498,
+    + 26, + 154, + 282, + 410,
+    + 58, + 186, + 314, + 442,
+    + 90, + 218, + 346, + 474,
+    + 122, + 250, + 378, + 506,
+    + 4, + 132, + 260, + 388,
+    + 36, + 164, + 292, + 420,
+    + 68, + 196, + 324, + 452,
+    + 100, + 228, + 356, + 484,
+    + 12, + 140, + 268, + 396,
+    + 44, + 172, + 300, + 428,
+    + 76, + 204, + 332, + 460,
+    + 108, + 236, + 364, + 492,
+    + 20, + 148, + 276, + 404,
+    + 52, + 180, + 308, + 436,
+    + 84, + 212, + 340, + 468,
+    + 116, + 244, + 372, + 500,
+    + 28, + 156, + 284, + 412,
+    + 60, + 188, + 316, + 444,
+    + 92, + 220, + 348, + 476,
+    + 124, + 252, + 380, + 508,
+    + 6, + 134, + 262, + 390,
+    + 38, + 166, + 294, + 422,
+    + 70, + 198, + 326, + 454,
+    + 102, + 230, + 358, + 486,
+    + 14, + 142, + 270, + 398,
+    + 46, + 174, + 302, + 430,
+    + 78, + 206, + 334, + 462,
+    + 110, + 238, + 366, + 494,
+    + 22, + 150, + 278, + 406,
+    + 54, + 182, + 310, + 438,
+    + 86, + 214, + 342, + 470,
+    + 118, + 246, + 374, + 502,
+    + 30, + 158, + 286, + 414,
+    + 62, + 190, + 318, + 446,
+    + 94, + 222, + 350, + 478,
+    + 126, + 254, + 382, + 510
+};
+
+
+
+
+const Int16 digit_reverse_swap_256[ 241] =
+{
+    + 2, + 128,   + 4, + 256,
+    + 6, + 384,   + 8,  + 32,
+    + 10, + 160,  + 12, + 288,
+    + 14, + 416,  + 16,  + 64,
+    + 18, + 192,  + 20, + 320,
+    + 22, + 448,  + 24,  + 96,
+    + 26, + 224,  + 28, + 352,
+    + 30, + 480,  + 34, + 136,
+    + 36, + 264,  + 38, + 392,
+    + 42, + 168,  + 44, + 296,
+    + 46, + 424,  + 48,  + 72,
+    + 50, + 200,  + 52, + 328,
+    + 54, + 456,  + 56, + 104,
+    + 58, + 232,  + 60, + 360,
+    + 62, + 488,  + 66, + 144,
+    + 68, + 272,  + 70, + 400,
+    + 74, + 176,  + 76, + 304,
+    + 78, + 432,  + 82, + 208,
+    + 84, + 336,  + 86, + 464,
+    + 88, + 112,  + 90, + 240,
+    + 92, + 368,  + 94, + 496,
+    + 98, + 152, + 100, + 280,
+    + 102, + 408, + 106, + 184,
+    + 108, + 312, + 110, + 440,
+    + 114, + 216, + 116, + 344,
+    + 118, + 472, + 122, + 248,
+    + 124, + 376, + 126, + 504,
+    + 132, + 258, + 134, + 386,
+    + 138, + 162, + 140, + 290,
+    + 142, + 418, + 146, + 194,
+    + 148, + 322, + 150, + 450,
+    + 154, + 226, + 156, + 354,
+    + 158, + 482, + 164, + 266,
+    + 166, + 394, + 172, + 298,
+    + 174, + 426, + 178, + 202,
+    + 180, + 330, + 182, + 458,
+    + 186, + 234, + 188, + 362,
+    + 190, + 490, + 196, + 274,
+    + 198, + 402, + 204, + 306,
+    + 206, + 434, + 212, + 338,
+    + 214, + 466, + 218, + 242,
+    + 220, + 370, + 222, + 498,
+    + 228, + 282, + 230, + 410,
+    + 236, + 314, + 238, + 442,
+    + 244, + 346, + 246, + 474,
+    + 252, + 378, + 254, + 506,
+    + 262, + 388, + 268, + 292,
+    + 270, + 420, + 276, + 324,
+    + 278, + 452, + 284, + 356,
+    + 286, + 484, + 294, + 396,
+    + 302, + 428, + 308, + 332,
+    + 310, + 460, + 316, + 364,
+    + 318, + 492, + 326, + 404,
+    + 334, + 436, + 342, + 468,
+    + 348, + 372, + 350, + 500,
+    + 358, + 412, + 366, + 444,
+    + 374, + 476, + 382, + 508,
+    + 398, + 422, + 406, + 454,
+    + 414, + 486, + 438, + 462,
+    + 446, + 494, + 478, + 502
+};
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void digit_reversal_swapping(Int32 *y, Int32 *x);
+
+#ifdef __cplusplus
+}
+#endif
+
+void digit_reversal_swapping(Int32 *y, Int32 *x)
+{
+    Int16 i, j;
+    Int32 tmp[2];
+    const Int16 *pTable;
+
+    pTable = digit_reverse_swap_256;
+
+    for (Int k = 120; k != 0; k--)
+    {
+        i = *pTable++;
+        j = *pTable++;
+        tmp[0] = y[i];
+        tmp[1] = y[i+1];
+        y[i]   = y[j];
+        y[i+1] = y[j+1];
+        y[j]   = tmp[0];
+        y[j+1] = tmp[1];
+
+        tmp[0] = x[j];
+        tmp[1] = x[j+1];
+        x[j]   = x[i];
+        x[j+1] = x[i+1];
+        x[i]   = tmp[0];
+        x[i+1] = tmp[1];
+
+    }
+
+}
diff --git a/media/libstagefright/codecs/aacdec/digit_reversal_tables.h b/media/libstagefright/codecs/aacdec/digit_reversal_tables.h
new file mode 100644
index 0000000..7fdaaf7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/digit_reversal_tables.h
@@ -0,0 +1,86 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/DIGIT_REVERSAL_TABLES.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions digit_reversal_tables
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef DIGIT_REVERSAL_TABLES_H
+#define DIGIT_REVERSAL_TABLES_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+extern const Int16 digit_reverse_64[];
+extern const Int16 digit_reverse_256[];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* DIGIT_REVERSAL_TABLES_H */
diff --git a/media/libstagefright/codecs/aacdec/dst16.cpp b/media/libstagefright/codecs/aacdec/dst16.cpp
new file mode 100644
index 0000000..41c9259
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst16.cpp
@@ -0,0 +1,172 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: dst16.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 16
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement discrete sine transform of lenght 16
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include "dst16.h"
+#include "dst8.h"
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+#define R_SHIFT     28
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+const Int32 CosTable_8[8] =
+{
+    Qfmt(0.50241928618816F),   Qfmt(0.52249861493969F),
+    Qfmt(0.56694403481636F),   Qfmt(0.64682178335999F),
+    Qfmt(0.78815462345125F),   Qfmt(1.06067768599035F),
+    Qfmt(1.72244709823833F),   Qfmt(5.10114861868916F)
+};
+
+/*----------------------------------------------------------------------------
+; 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 dst_16(Int32 vec[], Int32 scratch_mem[])     /* scratch_mem size 8 */
+{
+    Int32 *temp_even = scratch_mem;
+
+    Int i;
+    const Int32 *pt_cos = &CosTable_8[7];
+    Int32 tmp0 = vec[15] >> 1;
+    Int32 tmp1, tmp2;
+    Int32 *pt_even = temp_even;
+    Int32 *pt_odd  = vec;
+    Int32 *pt_vec  = vec;
+    Int32 *pt_vecN_1;
+    Int32 tmp3;
+
+
+    *(pt_even++) = *(pt_vec++);
+    tmp1         = *(pt_vec++);
+    *(pt_odd++) = tmp1;
+
+    for (i = 3; i != 0; i--)
+    {
+        *(pt_even++) = *(pt_vec++);
+        tmp2         = *(pt_vec++);
+        *(pt_even++) = *(pt_vec++);
+        tmp3         = *(pt_vec++);
+        *(pt_odd++) = tmp2 + tmp1;
+        *(pt_odd++) = tmp3 + tmp2;
+        tmp1         = tmp3;
+
+    }
+
+    *(pt_even)   = *(pt_vec++);
+    *(pt_odd++) = *(pt_vec) + tmp1;
+
+
+    dst_8(temp_even);
+    dst_8(vec);
+
+    pt_vec  = &vec[7];
+
+    pt_even = &temp_even[7];
+    pt_vecN_1  = &vec[8];
+
+    tmp1 = *(pt_even--);
+
+    for (i = 4; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q28((*(pt_vec) - tmp0), *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vec--)     = tmp3 + tmp1;
+        *(pt_vecN_1++)  = tmp3 - tmp1;
+        tmp3  = fxp_mul32_Q28((*(pt_vec) + tmp0), *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp3 - tmp2;
+        *(pt_vec--)     = tmp3 + tmp2;
+    }
+
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/dst16.h b/media/libstagefright/codecs/aacdec/dst16.h
new file mode 100644
index 0000000..bce73ba
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst16.h
@@ -0,0 +1,68 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/dst16.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef DST16_H
+#define DST16_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void dst_16(Int32 vec[], Int32 scratch_mem[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* DST16_H */
diff --git a/media/libstagefright/codecs/aacdec/dst32.cpp b/media/libstagefright/codecs/aacdec/dst32.cpp
new file mode 100644
index 0000000..5edecf1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst32.cpp
@@ -0,0 +1,200 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: dst32.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 32
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement discrete sine transform of lenght 32
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "dst32.h"
+#include "dst16.h"
+
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+#define R_SHIFT1     29
+#define Qfmt29(x)   (Int32)(x*((Int32)1<<R_SHIFT1) + (x>=0?0.5F:-0.5F))
+#define Qfmt31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+const Int32 CosTable_16[14] =
+{
+    Qfmt31(0.50060299823520F),   Qfmt31(0.50547095989754F),
+    Qfmt31(0.51544730992262F),   Qfmt31(0.53104259108978F),
+    Qfmt31(0.55310389603444F),   Qfmt31(0.58293496820613F),
+    Qfmt31(0.62250412303566F),   Qfmt31(0.67480834145501F),
+    Qfmt31(0.74453627100230F),   Qfmt31(0.83934964541553F),
+    Qfmt29(0.97256823786196F),   Qfmt29(1.16943993343288F),
+    Qfmt29(1.48416461631417F),   Qfmt29(2.05778100995341F)
+};
+
+/*----------------------------------------------------------------------------
+; 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 dst_32(Int32 vec[], Int32 scratch_mem[])   /* scratch_mem size 32 */
+{
+    Int32 *temp_even = scratch_mem;
+
+    Int32 i;
+    const Int32 *pt_cos = &CosTable_16[13];
+    Int32 tmp0 = vec[31] >> 1;
+    Int32 tmp1, tmp2;
+    Int32 *pt_even = temp_even;
+    Int32 *pt_odd  = vec;
+    Int32 *pt_vec  = vec;
+    Int32 *pt_vecN_1  = vec;
+    Int32 tmp3;
+
+
+    tmp1 = 0;
+
+    for (i = 5; i != 0; i--)
+    {
+        *(pt_even++) = *(pt_vec++);
+        tmp2         = *(pt_vec++);
+        *(pt_even++) = *(pt_vec++);
+        tmp3         = *(pt_vec++);
+        *(pt_even++) = *(pt_vec++);
+        *(pt_odd++) = tmp2 + tmp1;
+        *(pt_odd++) = tmp3 + tmp2;
+        tmp1         = *(pt_vec++);
+        *(pt_odd++) = tmp1 + tmp3;
+    }
+
+    *(pt_even) = *(pt_vec++);
+    *(pt_odd)  = *(pt_vec) + tmp1;
+
+
+    dst_16(temp_even, &scratch_mem[16]);
+    dst_16(vec, &scratch_mem[24]);
+
+
+    pt_vecN_1  = &vec[16];
+
+    tmp1 = temp_even[15];
+
+    tmp3  = fxp_mul32_Q31((vec[15] - tmp0) << 3, Qfmt31(0.63687550772175F)) << 2;
+    tmp2  = temp_even[14];
+    *(pt_vecN_1++)  = tmp3 - tmp1;
+    vec[15]         = tmp3 + tmp1;
+    tmp1  = temp_even[13];
+    tmp3  = fxp_mul32_Q31((vec[14] + tmp0) << 3, Qfmt31(0.85190210461718F));
+    *(pt_vecN_1++)  = tmp3 - tmp2;
+    vec[14]         = tmp3 + tmp2;
+
+    pt_even = &temp_even[12];
+    pt_vec  = &vec[13];
+
+    for (i = 2; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q29((*(pt_vec) - tmp0), *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vec--)     = tmp3 + tmp1;
+        *(pt_vecN_1++)  = tmp3 - tmp1;
+        tmp3  = fxp_mul32_Q29((*(pt_vec) + tmp0), *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vec--)     = tmp3 + tmp2;
+        *(pt_vecN_1++)  = tmp3 - tmp2;
+    }
+
+    for (i = 5; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q31((*(pt_vec) - tmp0) << 1, *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vec--)     = tmp3 + tmp1;
+        *(pt_vecN_1++)  = tmp3 - tmp1;
+        tmp3  = fxp_mul32_Q31((*(pt_vec) + tmp0) << 1, *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vec--)     = tmp3 + tmp2;
+        *(pt_vecN_1++)  = tmp3 - tmp2;
+    }
+
+
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/dst32.h b/media/libstagefright/codecs/aacdec/dst32.h
new file mode 100644
index 0000000..c2bf1d2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst32.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/dst32.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef DST32_H
+#define DST32_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+    extern const Int32 CosTable_16[];
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void dst_32(Int32 vec[], Int32 scratch_mem[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* DST32_H */
diff --git a/media/libstagefright/codecs/aacdec/dst8.cpp b/media/libstagefright/codecs/aacdec/dst8.cpp
new file mode 100644
index 0000000..eaf8280
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst8.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: dst8.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 8
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement discrete sine transform of lenght 8
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "dst8.h"
+
+#include "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+#define R_SHIFT     29
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt31(x)   (Int32)(x*0x7FFFFFFF + (x>=0?0.5F:-0.5F))
+
+
+void dst_8(Int32 vec[])
+{
+
+    Int32 temp1;
+    Int32 temp2;
+    Int32 temp3;
+    Int32 temp4;
+    Int32 temp5;
+    Int32 temp6;
+    Int32 temp7;
+    Int32 tmp_a;
+    Int32 tmp_aa;
+    Int32 tmp_b;
+    Int32 tmp_bb;
+    Int32 tmp_c;
+    Int32 tmp_cc;
+    Int32 tmp_d;
+    Int32 tmp_dd;
+
+    temp1 = fxp_mul32_by_16(vec[1], Qfmt15(0.50979557910416F));         /* (1/(2*cos(  phi)));*/
+    temp2 = fxp_mul32_by_16(vec[2], Qfmt15(0.54119610014620F));         /* (1/(2*cos(2*phi)));*/
+    temp3 = fxp_mul32_by_16(vec[3], Qfmt15(0.60134488693505F));         /* (1/(2*cos(3*phi)));*/
+    temp5 = fxp_mul32_by_16(vec[5], Qfmt15(0.89997622313642F));         /* (1/(2*cos(5*phi)));*/
+    temp6 = fxp_mul32_by_16(vec[6] << 1, Qfmt15(0.65328148243819F));        /* (1/(2*cos(6*phi)));*/
+    temp7 = vec[7] + fxp_mul32_Q31(vec[7], Qfmt31(0.56291544774152F));          /* (1/(2*cos(7*phi)));*/
+
+    /*  even  */
+    tmp_a = fxp_mul32_Q31((temp2 + temp6) << 1, Qfmt31(0.70710678118655F));
+    tmp_b = (temp2 - temp6) + tmp_a;
+
+    temp4 = fxp_mul32_by_16(vec[4], Qfmt15(0.70710678118655F));
+    vec[0] =   tmp_a + temp4;
+    vec[1] =   tmp_b + temp4;
+    vec[2] =   tmp_b - temp4;
+    vec[3] =   tmp_a - temp4;
+
+
+    /* odd */
+
+    tmp_a  = fxp_mul32_by_16((temp1 + temp7) << 1, Qfmt15(0.54119610014620F));  /* (1/(2*cos(2*phi)));  */
+    tmp_aa = (temp1 - temp7);
+    tmp_bb = (temp5 - temp3);
+    temp5  = fxp_mul32_Q29((temp5 + temp3), Qfmt(1.30656296487638F));   /* (1/(2*cos(6*phi)));  */
+
+
+    tmp_c  = fxp_mul32_by_16((tmp_a + temp5) << 1, Qfmt15(0.70710678118655F));
+    tmp_cc =  tmp_a - temp5;
+
+    tmp_d  = fxp_mac32_by_16((tmp_aa - tmp_bb) << 1, Qfmt15(0.70710678118655F), tmp_c);
+    tmp_dd = (tmp_aa + tmp_bb);
+
+    tmp_dd +=  tmp_c;
+    tmp_a   =  tmp_d  + tmp_cc;
+    vec[5]  =  tmp_a  - vec[2];
+    vec[2] +=  tmp_a;
+
+    temp5   =  tmp_dd + tmp_cc;
+
+    vec[4]  =  temp5  - vec[3];
+    vec[3] +=  temp5;
+    vec[7]  =  tmp_c  - vec[0];
+    vec[0] +=  tmp_c;
+    vec[6]  =  tmp_d  - vec[1];
+    vec[1] +=  tmp_d;
+
+}
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/dst8.h b/media/libstagefright/codecs/aacdec/dst8.h
new file mode 100644
index 0000000..2738e80
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/dst8.h
@@ -0,0 +1,68 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/dst8.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef DST8_H
+#define DST8_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void dst_8(Int32 vec[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* DST8_H */
diff --git a/media/libstagefright/codecs/aacdec/e_adif_const.h b/media/libstagefright/codecs/aacdec/e_adif_const.h
new file mode 100644
index 0000000..08b5415
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_adif_const.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_ADIF_Const.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for ADIF header related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_ADIF_CONST_H
+#define E_ADIF_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /*
+     * audio data interchange format header
+     */
+    LEN_ADIF_ID     = (32 / 8),
+    LEN_COPYRT_PRES = 1,
+    LEN_COPYRT_ID   = (72 / 8),
+    LEN_ORIG        = 1,
+    LEN_HOME        = 1,
+    LEN_BS_TYPE     = 1,
+    LEN_BIT_RATE    = 23,
+    LEN_NUM_PCE     = 4,
+    LEN_ADIF_BF     = 20
+
+} eADIF_Const;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_blockswitching.h b/media/libstagefright/codecs/aacdec/e_blockswitching.h
new file mode 100644
index 0000000..bf6ad15
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_blockswitching.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_BlockSwitching.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for BlockSwitching related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_BLOCK_SWITCHING_H
+#define E_BLOCK_SWITCHING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /*
+     * block switching
+     */
+    LN          = 2048,
+    SN          = 256,
+    LN2         = LN / 2,
+    SN2         = SN / 2,
+    LN4         = LN / 4,
+    SN4         = SN / 4,
+    NSHORT      = LN / SN,
+    MAX_SBK     = NSHORT,
+    MAX_WIN     = MAX_SBK,
+
+    ONLY_LONG_WINDOW    = 0,
+    LONG_START_WINDOW,
+    EIGHT_SHORT_WINDOW,
+    LONG_STOP_WINDOW,
+    NUM_WIN_SEQ,
+
+    WLONG       = ONLY_LONG_WINDOW,
+    WSTART,
+    WSHORT,
+    WSTOP,
+
+    MAXBANDS        = 16 * NSHORT,  /* max number of scale factor bands */
+    MAXFAC      = 121,      /* maximum scale factor */
+    MIDFAC      = (MAXFAC - 1) / 2,
+    SF_OFFSET       = 100       /* global gain must be positive */
+} eBlockSwitching;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_coupling_mode.h b/media/libstagefright/codecs/aacdec/e_coupling_mode.h
new file mode 100644
index 0000000..68244bb
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_coupling_mode.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_coupling_mode.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_COUPLING_MODE_H
+#define E_COUPLING_MODE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    COUPLING_OFF,
+    COUPLING_LEVEL,
+    COUPLING_BAL
+}
+COUPLING_MODE;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_elementid.h b/media/libstagefright/codecs/aacdec/e_elementid.h
new file mode 100644
index 0000000..5f84643
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_elementid.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+ Pathname: ./include/e_BLOCKTYPE.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for BlockType related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_ELEMENTID_H
+#define E_ELEMENTID_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /* sfb 40, coef 672, pred bw of 15.75 kHz at 48 kHz
+     * this is also the highest number of bins used
+     * by predictor for any sampling rate
+     */
+    MAX_PRED_SFB    = 40,   /* 48 kHz only, now obsolete */
+    MAX_PRED_BINS   = 672,
+
+    ID_SCE      = 0,
+    ID_CPE,
+    ID_CCE,
+    ID_LFE,
+    ID_DSE,
+    ID_PCE,
+    ID_FIL,
+    ID_END
+}
+ElementId;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_huffmanconst.h b/media/libstagefright/codecs/aacdec/e_huffmanconst.h
new file mode 100644
index 0000000..5d0e628
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_huffmanconst.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_HuffmanConst.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for Huffman related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_HUFFMAN_CONST_H
+#define E_HUFFMAN_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /*
+     * specify huffman tables as signed (1) or unsigned (0)
+     */
+    HUF1SGN     = 1,
+    HUF2SGN     = 1,
+    HUF3SGN     = 0,
+    HUF4SGN     = 0,
+    HUF5SGN     = 1,
+    HUF6SGN     = 1,
+    HUF7SGN     = 0,
+    HUF8SGN     = 0,
+    HUF9SGN     = 0,
+    HUF10SGN        = 0,
+    HUF11SGN        = 0,
+
+    ZERO_HCB        = 0,
+    BY4BOOKS        = 4,
+    ESCBOOK     = 11,
+    NSPECBOOKS      = ESCBOOK + 1,
+    BOOKSCL     = NSPECBOOKS,
+    NBOOKS      = NSPECBOOKS + 1,
+    INTENSITY_HCB2  = 14,
+    INTENSITY_HCB   = 15,
+    NOISE_HCB       = 13,
+    NOISE_HCB2      = 113,
+
+    NOISE_PCM_BITS      = 9,
+    NOISE_PCM_OFFSET    = (1 << (NOISE_PCM_BITS - 1)),
+
+    NOISE_OFFSET        = 90,
+
+    LONG_SECT_BITS  = 5,
+    SHORT_SECT_BITS = 3
+} eHuffmanConst;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_infoinitconst.h b/media/libstagefright/codecs/aacdec/e_infoinitconst.h
new file mode 100644
index 0000000..788b5e9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_infoinitconst.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_infoinitConst.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for Infoinit related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_INFOINIT_CONST_H
+#define E_INFOINIT_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "chans.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /* block switch windows for single channels or channel pairs */
+    Winds   = Chans,
+
+    /* average channel block length, bytes */
+    Avjframe    = 341,
+
+    TEXP    = 128,      /* size of exp cache table */
+    MAX_IQ_TBL  = 128,      /* size of inv quant table */
+    MAXFFT  = LN4
+
+} infoinitConst;
+
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_invf_mode.h b/media/libstagefright/codecs/aacdec/e_invf_mode.h
new file mode 100644
index 0000000..57b3281
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_invf_mode.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_invf_mode.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_INVF_MODE_H
+#define E_INVF_MODE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    INVF_OFF,
+    INVF_LOW_LEVEL,
+    INVF_MID_LEVEL,
+    INVF_HIGH_LEVEL,
+
+    INVF_NO_OVERRIDE
+}
+INVF_MODE;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_maskstatus.h b/media/libstagefright/codecs/aacdec/e_maskstatus.h
new file mode 100644
index 0000000..010b6f8a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_maskstatus.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+   Pathname: ./include/e_MaskStatus.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file gives the enum of mask_present value used in getmask.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_MASKSTATUS_H
+#define E_MASKSTATUS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; 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
+{
+    MASK_NOT_PRESENT,
+    MASK_FROM_BITSTREAM,
+    MASK_ALL_FRAME,
+    MASK_ERROR
+};
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_mp4ff_const.h b/media/libstagefright/codecs/aacdec/e_mp4ff_const.h
new file mode 100644
index 0000000..1006406
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_mp4ff_const.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: e_MP4FF_const.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file enums the constants used by MP4FF header
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_MP4FF_CONST_H
+#define E_MP4FF_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    LEN_OBJ_TYPE = 5,
+    LEN_SAMP_RATE_IDX = 4,
+    LEN_SAMP_RATE   = 24,
+    LEN_CHAN_CONFIG = 4,
+    LEN_SYNC_EXTENSION_TYPE = 11,
+    LEN_FRAME_LEN_FLAG = 1,
+    LEN_DEPEND_ON_CORE = 1,
+    LEN_CORE_DELAY = 14,
+    LEN_EXT_FLAG = 1,
+    LEN_EP_CONFIG = 2,
+    LEN_LAYER_NUM = 3,
+    LEN_SUB_FRAME = 5,
+    LEN_LAYER_LEN = 11,
+    LEN_SECT_RES_FLAG = 1,
+    LEN_SCF_RES_FLAG = 1,
+    LEN_SPEC_RES_FLAG = 1,
+    LEN_EXT_FLAG3 = 1
+} eMP4FF_const;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_progconfigconst.h b/media/libstagefright/codecs/aacdec/e_progconfigconst.h
new file mode 100644
index 0000000..b5fdc08
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_progconfigconst.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: e_ProgConfigConst.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for ProgConfig related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_PROG_CONFIG_CONST_H
+#define E_PROG_CONFIG_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    /*
+     * Program Configuration
+     */
+    Main_Profile    = 0,
+    LC_Profile      = 1,
+
+    Fs_48       = 3,
+    Fs_44       = 4,
+    Fs_32       = 5,
+
+    LEN_PROFILE     = 2,
+    LEN_SAMP_IDX    = 4,
+    LEN_NUM_ELE     = 4,
+    LEN_NUM_LFE     = 2,
+    LEN_NUM_DAT     = 3,
+    LEN_NUM_CCE     = 4,
+    LEN_MIX_PRES    = 1,
+    LEN_MMIX_IDX    = 2,
+    LEN_PSUR_ENAB   = 1,
+    LEN_ELE_IS_CPE  = 1,
+    LEN_IND_SW_CCE  = 1,
+    LEN_COMMENT_BYTES   = 8
+
+} eProgConfigConst;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_rawbitstreamconst.h b/media/libstagefright/codecs/aacdec/e_rawbitstreamconst.h
new file mode 100644
index 0000000..a460d13
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_rawbitstreamconst.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+   Pathname: e_RawBitstreamConst.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for the Raw Bitstream related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_RAW_BITSTREAM_CONST_H
+#define E_RAW_BITSTREAM_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    LEN_SE_ID       = 3,
+    LEN_TAG     = 4,
+    LEN_COM_WIN     = 1,
+    LEN_ICS_RESERV  = 1,
+    LEN_WIN_SEQ     = 2,
+    LEN_WIN_SH      = 1,
+    LEN_MAX_SFBL    = 6,
+    LEN_MAX_SFBS    = 4,
+    LEN_CB          = 4,
+    LEN_SCL_PCM     = 8,
+    LEN_PRED_PRES   = 1,
+    LEN_PRED_RST    = 1,
+    LEN_PRED_RSTGRP = 5,
+    LEN_PRED_ENAB   = 1,
+    LEN_MASK_PRES   = 2,
+    LEN_MASK        = 1,
+    LEN_PULSE_PRES  = 1,
+    LEN_TNS_PRES    = 1,
+    LEN_GAIN_PRES   = 1,
+
+    LEN_PULSE_NPULSE    = 2,
+    LEN_PULSE_ST_SFB    = 6,
+    LEN_PULSE_POFF      = 5,
+    LEN_PULSE_PAMP      = 4,
+    NUM_PULSE_LINES     = 4,
+    PULSE_OFFSET_AMP    = 4,
+
+    LEN_IND_CCE_FLG = 1,
+    LEN_NCC         = 3,
+    LEN_IS_CPE      = 1,
+    LEN_CC_LR       = 1,
+    LEN_CC_DOM      = 1,
+    LEN_CC_SGN      = 1,
+    LEN_CCH_GES     = 2,
+    LEN_CCH_CGP     = 1,
+
+    LEN_D_ALIGN     = 1,
+    LEN_D_CNT       = 8,
+    LEN_D_ESC       = 8,
+    LEN_F_CNT       = 4,
+    LEN_F_ESC       = 8,
+    LEN_BYTE        = 8,
+    LEN_PAD_DATA    = 8,
+
+    LEN_PC_COMM     = 9
+
+} eRawBitstreamConst;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_sbr_element_id.h b/media/libstagefright/codecs/aacdec/e_sbr_element_id.h
new file mode 100644
index 0000000..1b021ff
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sbr_element_id.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sbr_element_id.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SBR_ELEMENT_ID_H
+#define E_SBR_ELEMENT_ID_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    SBR_ID_SCE = 0,
+    SBR_ID_CPE
+}
+SBR_ELEMENT_ID;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_sbr_error.h b/media/libstagefright/codecs/aacdec/e_sbr_error.h
new file mode 100644
index 0000000..b6c8a90
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sbr_error.h
@@ -0,0 +1,106 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sbr_error.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SBR_ERROR_H
+#define E_SBR_ERROR_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define HANDLE_ERROR_INFO Int32
+#define noError 0
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+typedef enum
+{
+    SBRDEC_OK = 0,
+    SBRDEC_NOSYNCH,
+    SBRDEC_ILLEGAL_PROGRAM,
+    SBRDEC_ILLEGAL_TAG,
+    SBRDEC_ILLEGAL_CHN_CONFIG,
+    SBRDEC_ILLEGAL_SECTION,
+    SBRDEC_ILLEGAL_SCFACTORS,
+    SBRDEC_ILLEGAL_PULSE_DATA,
+    SBRDEC_MAIN_PROFILE_NOT_IMPLEMENTED,
+    SBRDEC_GC_NOT_IMPLEMENTED,
+    SBRDEC_ILLEGAL_PLUS_ELE_ID,
+    SBRDEC_CREATE_ERROR,
+    SBRDEC_NOT_INITIALIZED,
+    SBRDEC_TOO_MANY_SBR_ENVELOPES,
+    SBRDEC_INVALID_BITSTREAM
+}
+SBR_ERROR;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_sbr_header_status.h b/media/libstagefright/codecs/aacdec/e_sbr_header_status.h
new file mode 100644
index 0000000..5b2a43f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sbr_header_status.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sbr_header_status.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SBR_HEADER_STATUS_H
+#define E_SBR_HEADER_STATUS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    HEADER_OK,
+    HEADER_RESET,
+    HEADER_NOT_INITIALIZED
+}
+SBR_HEADER_STATUS;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_sbr_master_status.h b/media/libstagefright/codecs/aacdec/e_sbr_master_status.h
new file mode 100644
index 0000000..16e43a4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sbr_master_status.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sbr_master_status.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SBR_MASTER_STATUS_H
+#define E_SBR_MASTER_STATUS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    MASTER_OK,
+    MASTER_RESET
+}
+SBR_MASTER_STATUS;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_sbr_sync_state.h b/media/libstagefright/codecs/aacdec/e_sbr_sync_state.h
new file mode 100644
index 0000000..d9f8669
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sbr_sync_state.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sbr_sync_state.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SBR_SYNC_STATE_H
+#define E_SBR_SYNC_STATE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    SBR_NOT_INITIALIZED,
+    UPSAMPLING,
+    SBR_ACTIVE
+}
+SBR_SYNC_STATE;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_sr_mode.h b/media/libstagefright/codecs/aacdec/e_sr_mode.h
new file mode 100644
index 0000000..eff00dd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_sr_mode.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: e_sr_mode.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_SR_MODE_H
+#define E_SR_MODE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    SINGLE_RATE = 1,
+    UP_BY_2
+}
+SR_MODE;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_tmp4audioobjecttype.h b/media/libstagefright/codecs/aacdec/e_tmp4audioobjecttype.h
new file mode 100644
index 0000000..83cccce
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_tmp4audioobjecttype.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_tMP4AudioObjectType.h
+
+ This file contains enumerated types for MP4 Audio Object Types, as defined
+ in ISO/IEC 14496-3, AMMENDMENT 1 Dated 2000-09-15
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_TMP4AUDIOOBJECTTYPE_H
+#define E_TMP4AUDIOOBJECTTYPE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+
+    typedef enum eMP4AudioObjectType
+    {
+        MP4AUDIO_NULL            =  0, /*                                       */
+        MP4AUDIO_AAC_MAIN        =  1, /*                                       */
+        MP4AUDIO_AAC_LC          =  2, /* LC = Low Complexity                   */
+        MP4AUDIO_AAC_SSR         =  3, /* SSR = Scalable Sampling Rate          */
+        MP4AUDIO_LTP             =  4, /* LTP = Long Term Prediction            */
+        MP4AUDIO_SBR             =  5, /* SBR = Spectral Band Replication       */
+        MP4AUDIO_AAC_SCALABLE    =  6, /* scales both bitrate and sampling rate */
+        MP4AUDIO_TWINVQ          =  7, /* low bit rate                          */
+        MP4AUDIO_CELP            =  8,
+        MP4AUDIO_HVXC            =  9,
+        /* 10 is reserved                        */
+        /* 11 is reserved                        */
+        MP4AUDIO_TTSI            = 12,
+        /* 13-16 are synthesis and MIDI types    */
+        MP4AUDIO_ER_AAC_LC       = 17, /*                                       */
+        /* 18 is reserved                        */
+        MP4AUDIO_ER_AAC_LTP      = 19, /*                                       */
+        MP4AUDIO_ER_AAC_SCALABLE = 20, /*                                       */
+        MP4AUDIO_ER_TWINVQ       = 21, /*                                       */
+        MP4AUDIO_ER_BSAC         = 22, /*                                       */
+        MP4AUDIO_ER_AAC_LD       = 23, /*                                       */
+        MP4AUDIO_ER_CELP         = 24, /*                                       */
+        MP4AUDIO_ER_HVXC         = 25, /*                                       */
+        MP4AUDIO_ER_HILN         = 26, /*                                       */
+        MP4AUDIO_PARAMETRIC      = 27, /*                                       */
+        MP4AUDIO_PS              = 29  /*  Explicit Parametric Stereo           */
+
+    } tMP4AudioObjectType;
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    /* Should not be any function declarations in this file */
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* E_TMP4AUDIOOBJECTTYPE_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/e_tns_const.h b/media/libstagefright/codecs/aacdec/e_tns_const.h
new file mode 100644
index 0000000..157d471
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_tns_const.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Pathname: ./include/e_TNS_Const.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for TNS related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_TNS_CONST_H
+#define E_TNS_CONST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    TNS_MAX_BANDS = 49,
+    TNS_MAX_ORDER = 20,
+    TNS_MAX_WIN   =  8,
+    TNS_MAX_FILT  =  3,
+    Q_SPEC        = 11,
+    Q_LPC         = 19
+
+} eTNS_Const;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_window_sequence.h b/media/libstagefright/codecs/aacdec/e_window_sequence.h
new file mode 100644
index 0000000..c4b933e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_window_sequence.h
@@ -0,0 +1,90 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/e_WINDOW_SEQUENCE.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for Window Sequence related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_WINDOW_SEQUENCE_H
+#define E_WINDOW_SEQUENCE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    ONLY_LONG_SEQUENCE,
+    LONG_START_SEQUENCE,
+    EIGHT_SHORT_SEQUENCE,
+    LONG_STOP_SEQUENCE,
+    NUM_WINDOW_SEQUENCE,
+    ENSURE_WINDOW_SEQUENCE_INT_SIZE = 0x7FFFFF
+}
+WINDOW_SEQUENCE;
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/e_window_shape.h b/media/libstagefright/codecs/aacdec/e_window_shape.h
new file mode 100644
index 0000000..3eca438
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/e_window_shape.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: e_Window_shape.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ enum for Window Sequence related constants
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef E_WINDOW_SHAPE_H
+#define E_WINDOW_SHAPE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+typedef enum
+{
+    SINE_WINDOW = 0,
+    KAISER_BESSEL_WINDOW,
+    NUM_WINDOW_SHAPES,
+    ENSURE_WINDOW_SHAPE_INT_SIZE = 0x7FFFFF
+}
+WINDOW_SHAPE;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp b/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp
new file mode 100644
index 0000000..778c88c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp
@@ -0,0 +1,789 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/esc_iquant_scaling.c
+ Funtions:  esc_iquant_scaling
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from esc_iquant_fxp.c code
+
+ Description:  Eliminated unused variables to avoid warnings, changed header
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    quantSpec[] = array of quantized compressed spectral coefficients, of
+                  data type Int and length sfbWidth.
+
+    sfbWidth    = number of array elements in quantSpec and the output array
+                  coef, data type Int.
+
+    coef[]      = output array of uncompressed coefficients, stored in a
+                  variable Q format, depending on the maximum value found
+                  for the group, array of Int32, length sfbWdith to be
+                  overwritten.
+
+    QFormat     = the output Q format for the array coef[].
+
+
+    scale       = scaling factor after separating power of 2 factor out from
+                  0.25*(sfb_scale - 100), i.e., 0.25*sfb_scale.
+
+    maxInput    = maximum absolute value of quantSpec.
+
+ Local Stores/Buffers/Pointers Needed: None.
+
+ Global Stores/Buffers/Pointers Needed:
+    inverseQuantTable = lookup table of const integer values to the one third
+                power stored in Q27 format, in file iquant_table.c, const
+                array of UInt32, of size 1025.
+
+ Outputs: None
+
+ Pointers and Buffers Modified:
+    coef[] contents are overwritten with the uncompressed values from
+    quantSpec[]
+
+
+
+
+ Local Stores Modified: None.
+
+ Global Stores Modified: None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs the inverse quantization of the spectral coeficients
+ read from huffman decoding. It takes each input array value to the four
+ thirds power, then scales it according to the scaling factor input argument
+ ,and stores the result in the output array in a variable Q format
+ depending upon the maximum input value found.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall not have static or global variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+   of moving pictures and associated audio information - Part 7: Advanced
+   Audio Coding (AAC)", Section 10.3, "Decoding process", page 43.
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    maxInput = 0;
+
+    FOR (i = sfbWidth - 1; i >= 0; i--)
+        x = quantSpec[i];
+
+        IF ( x >= 0)
+            absX = x;
+        ELSE
+            absX = -x;
+        ENDIF
+
+        coef[i] = absX;
+
+        IF (absX > maxInput)
+            maxInput = absX;
+        ENDIF
+    ENDFOR
+
+    IF (maxInput == 0)
+        *pQFormat = QTABLE;
+    ELSE
+        temp = inverseQuantTable[(maxInput >> ORDER) + 1];
+
+        temp += ((1 << (QTABLE))-1);
+
+        temp >>= (QTABLE-1);
+
+        temp *= maxInput;
+
+        binaryDigits = 0;
+        WHILE( temp != 0)
+            temp >>= 1;
+            binaryDigits++;
+        WEND
+
+        IF (binaryDigits < (SIGNED32BITS - QTABLE))
+            binaryDigits = SIGNED32BITS - QTABLE;
+        ENDIF
+
+        *pQFormat = SIGNED32BITS - binaryDigits;
+        shift = QTABLE - *pQFormat;
+
+        IF (maxInput < TABLESIZE)
+            FOR (i = sfbWidth - 1; i >= 0; i--)
+                x = quantSpec[i];
+
+                absX = coef[i];
+
+                tmp_coef = x * (inverseQuantTable[absX] >> shift);
+
+                b_low  = (tmp_coef & 0xFFFF);
+                b_high = (tmp_coef >> 16);
+
+                mult_low  = ( (UInt32) b_low * scale );
+                mult_high = ( (Int32) b_high * scale );
+
+                mult_low >>= 16;
+
+                coef[i]  = (Int32) (mult_high + mult_low);
+
+            ENDFOR
+        ELSE
+            FOR (i = sfbWidth; i >= 0 ; i--)
+                x    = quantSpec[i];
+                absX = coef[i];
+
+                IF (absX < TABLESIZE)
+                    tmp_coef = x * (inverseQuantTable[absX] >> shift);
+                ELSE
+                    index = absX >> ORDER;
+                    w1 = inverseQuantTable[index];
+
+                    approxOneThird = (w1 * FACTOR) >> shift;
+
+
+                    x1 = index * SPACING;
+                    w2 = inverseQuantTable[index+1];
+
+                    deltaOneThird = (w2 - w1) * (absX - x1);
+
+                    deltaOneThird >>= (shift + ORDER - 1);
+
+                    tmp_coef = x * (approxOneThird + deltaOneThird);
+
+                ENDIF
+
+                b_low  = (mult_high & 0xFFFF);
+                b_high = (mult_high >> 16);
+
+                mult_low  = ( (UInt32) b_low * scale );
+                mult_high = ( (Int32) b_high * scale );
+
+                mult_low >>= 16;
+
+                coef[i]  = (Int32) (mult_high + mult_low);
+
+            ENDFOR
+        ENDIF
+    ENDIF
+
+    RETURN
+
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "iquant_table.h"
+#include "esc_iquant_scaling.h"
+#include "aac_mem_funcs.h"         /* For pv_memset                         */
+
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+/*
+ * Read further on what order is.
+ * Note: If ORDER is not a multiple of 3, FACTOR is not an integer.
+ * Note: Portions of this function assume ORDER is 3, and so does the table
+ *       in iquant_table.c
+ */
+#define ORDER        (3)
+/*
+ * For input values > TABLESIZE, multiply by FACTOR to get x ^ (1/3)
+ * FACTOR = 2 ^ (ORDER/3)
+ */
+#define FACTOR       (2)
+
+/*
+ * This is one more than the range of expected inputs.
+ */
+#define INPUTRANGE   (8192)
+
+/*
+ * SPACING is 2 ^ ORDER, and is the spacing between points when in the
+ * interpolation range.
+ */
+#define SPACING      (1<<ORDER)
+
+/*
+ * The actual table size is one more than TABLESIZE, to allow for
+ * interpolation for numbers near 8191
+ */
+#define TABLESIZE    (INPUTRANGE/SPACING)
+
+/*
+ * Format the table is stored in.
+ */
+#define QTABLE       (27)
+
+/*
+ * Number of bits for data in a signed 32 bit integer.
+ */
+#define SIGNED32BITS  (31)
+
+/*
+ * Round up value for intermediate values obtained from the table
+ */
+#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1)
+
+#define     MASK_LOW16  0xffff
+#define     UPPER16     16
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*
+ * Processing in this function is performed in these steps:
+ *
+ * 1) Find the overall Q format for the entire group of inputs. This consists
+ *    of:
+ *    a) Finding the maximum input
+ *    b) estimate the maximum output
+ *    c) Using the table, get max ^ (4/3), taking into account the table is
+ *       in q format.
+ * 2) For each array element, see if the value is directly inside the table.
+ *    a) If yes, just multiply by table value by itself, then shift as
+ *       appropriate.
+ *    b) If no, get an approximation (described below) for x ^ (1/3) by linearly
+ *       interpolating using lower values in the table, then multiply by a
+ *       correction factor, then multiply by x (see below).
+ *
+ * It more accurate to interpolate x ^ (1/3) then x ^ (4/3), so that is stored
+ * in the lookup table. For values not in the table, interpolation is used:
+ *
+ *  We want y = x ^ (4/3) = x * (x ^ (1/3))
+ *
+ *  Let     x = w * (2 ^ m)  where m is a constant, = ORDER
+ *
+ *  then     x ^ (1/3) = w ^ (1/3) * (2 ^ (m/3))
+ *
+ *  w is most likely not an integer, so an interpolation with floor(w) and
+ *  ceil(w) can be performed to approximate w ^ (1/3) by getting values out of
+ *  the table. Then to get x ^ (1/3), multiply by FACTOR. If m = 0, 3, 6,
+ *  then FACTOR is a simple power of 2, so a shift can do the job.
+ *
+ *  The actual code employs some more tricks to speed things up, and because
+ *  the table is stored in Q format.
+ *
+ *  Rather than saving the sign of each input, the unsigned value of
+ *  abs(x) ^ (1/3) is multiplied by the signed input value.
+ */
+
+
+
+#if ( defined(_ARM) || defined(_ARM_V4))
+
+/*
+ *  Absolute value for 16 bit-numbers
+ */
+__inline Int32 abs2(Int32 x)
+{
+    Int32 z;
+    /*
+        z = x - (x<0);
+        x = z ^ sign(z)
+     */
+    __asm
+    {
+        sub  z, x, x, lsr #31
+        eor  x, z, z, asr #31
+    }
+    return (x);
+}
+
+
+#define pv_abs(x)   abs2(x)
+
+
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+/*
+ *  Absolute value for 16 bit-numbers
+ */
+__inline Int32 abs2(Int32 x)
+{
+    register Int32 z;
+    register Int32 y;
+    register Int32 ra = x;
+    asm volatile(
+        "sub  %0, %2, %2, lsr #31\n\t"
+        "eor  %1, %0, %0, asr #31"
+    : "=&r*i"(z),
+        "=&r*i"(y)
+                : "r"(ra));
+
+    return (y);
+}
+
+#define pv_abs(x)   abs2(x)
+
+
+#else
+
+#define pv_abs(x)   ((x) > 0)? (x) : (-x)
+
+#endif
+
+
+
+
+
+void esc_iquant_scaling(
+    const Int16     quantSpec[],
+    Int32         coef[],
+    const Int     sfbWidth,
+    Int const      QFormat,
+    UInt16        scale,
+    Int           maxInput)
+{
+    Int    i;
+    Int    x;
+    Int    y;
+    Int    index;
+    Int    shift;
+    UInt   absX;
+    UInt32 w1, w2;
+    UInt32 deltaOneThird;
+    UInt32 x1;
+    UInt32 approxOneThird;
+    Int32   mult_high;
+
+
+#if ( defined(_ARM) || defined(_ARM_V4))
+
+    {
+        Int32   *temp;
+        Int32   R12, R11, R10, R9;
+
+        deltaOneThird = sizeof(Int32) * sfbWidth;
+        temp = coef;
+
+        // from standard library call for __rt_memset
+        __asm
+        {
+            MOV     R12, #0x0
+            MOV     R11, #0x0
+            MOV     R10, #0x0
+            MOV     R9, #0x0
+            SUBS    deltaOneThird, deltaOneThird, #0x20
+loop:
+            STMCSIA temp!, {R12, R11, R10, R9}
+            STMCSIA temp!, {R12, R11, R10, R9}
+            SUBCSS  deltaOneThird, deltaOneThird, #0x20
+            BCS     loop
+
+            MOVS    deltaOneThird, deltaOneThird, LSL #28
+            STMCSIA temp!, {R12, R11, R10, R9}
+            STMMIIA temp!, {R12, R11}
+        }
+    }
+
+#else
+    pv_memset(coef, 0, sizeof(Int32) * sfbWidth);
+#endif
+
+    if (maxInput > 0)
+    {
+
+        shift = QTABLE - QFormat;
+
+        if (scale != 0)
+        {
+            if (maxInput < TABLESIZE)
+            {
+
+                for (i = sfbWidth - 1; i >= 0; i -= 4)
+                {
+                    x = quantSpec[i];
+                    y = quantSpec[i-1];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        mult_high = (x * (inverseQuantTable[absX] >> shift));
+                        coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
+                    }
+
+                    if (y)
+                    {
+                        absX = pv_abs(y);
+                        mult_high = y * (inverseQuantTable[absX] >> shift);
+                        coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
+                    }
+
+                    x = quantSpec[i-2];
+                    y = quantSpec[i-3];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        mult_high = x * (inverseQuantTable[absX] >> shift);
+                        coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
+                    }
+
+                    if (y)
+                    {
+                        absX = pv_abs(y);
+                        mult_high = y * (inverseQuantTable[absX] >> shift);
+                        coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
+                    }
+                } /* end for (i = sfbWidth - 1; i >= 0; i--) */
+
+            } /* end if (maxInput < TABLESIZE)*/
+
+            else /* maxInput >= TABLESIZE) */
+            {
+                for (i = sfbWidth - 1; i >= 0; i -= 4)
+                {
+                    x    = quantSpec[i];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
+
+                        }
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
+
+                        }
+                    } /* if(x) */
+
+
+                    x    = quantSpec[i-1];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = (x * (inverseQuantTable[absX] >> shift));
+                            coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
+
+                        }
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
+                        }
+                    } /* if(x) */
+
+                    x    = quantSpec[i-2];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
+                        }
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
+                        }
+                    } /* if(x) */
+
+                    x    = quantSpec[i-3];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
+
+                        }
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
+
+                        }
+                    } /* if(x) */
+
+                }  /* end for (i = sfbWidth - 1; i >= 0; i--) */
+            } /* end else for if (maxInput < TABLESIZE)*/
+        }
+        else /* scale == 0 */
+        {
+            if (maxInput < TABLESIZE)
+            {
+                for (i = sfbWidth - 1; i >= 0; i -= 4)
+                {
+                    x = quantSpec[i];
+                    y = quantSpec[i-1];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        mult_high = x * (inverseQuantTable[absX] >> shift);
+                        coef[i] = mult_high >> 1;
+                    }
+
+                    if (y)
+                    {
+                        absX = pv_abs(y);
+                        mult_high = y * (inverseQuantTable[absX] >> shift);
+                        coef[i-1] = mult_high >> 1;
+                    }
+
+                    x = quantSpec[i-2];
+                    y = quantSpec[i-3];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        mult_high = x * (inverseQuantTable[absX] >> shift);
+                        coef[i-2] = mult_high >> 1;
+                    }
+
+                    if (y)
+                    {
+                        absX = pv_abs(y);
+                        mult_high = y * (inverseQuantTable[absX] >> shift);
+                        coef[i-3] = mult_high >> 1;
+                    }
+                }
+
+            } /* end if (maxInput < TABLESIZE)*/
+
+            else /* maxInput >= TABLESIZE) */
+            {
+                for (i = sfbWidth - 1; i >= 0; i -= 4)
+                {
+                    x    = quantSpec[i];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i] = (mult_high >> 1);
+                        } /* end if (absX < TABLESIZE) */
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i] = (mult_high >> 1);
+                        }
+                    } /* if(x) */
+
+                    x    = quantSpec[i-1];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i-1] = (mult_high >> 1);
+                        } /* end if (absX < TABLESIZE) */
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-1] = (mult_high >> 1);
+                        }
+                    } /* if(x) */
+
+                    x    = quantSpec[i-2];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i-2] = (mult_high >> 1);
+                        } /* end if (absX < TABLESIZE) */
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-2] = (mult_high >> 1);
+                        }
+                    } /* if(x) */
+
+                    x    = quantSpec[i-3];
+                    if (x)
+                    {
+                        absX = pv_abs(x);
+                        if (absX < TABLESIZE)
+                        {
+                            mult_high = x * (inverseQuantTable[absX] >> shift);
+                            coef[i-3] = (mult_high >> 1);
+                        } /* end if (absX < TABLESIZE) */
+                        else
+                        {
+                            index = absX >> ORDER;
+                            w1 = inverseQuantTable[index];
+                            w2 = inverseQuantTable[index+1];
+                            approxOneThird = (w1 * FACTOR) >> shift;
+                            x1 = index << ORDER;
+                            deltaOneThird = (w2 - w1) * (absX - x1);
+                            deltaOneThird >>= (shift + 2);
+                            mult_high = x * (approxOneThird + deltaOneThird);
+                            coef[i-3] = (mult_high >> 1);
+                        }
+
+                    } /* if(x) */
+
+                }  /* end for (i = sfbWidth - 1; i >= 0; i--) */
+
+            } /* end else for if (maxInput < TABLESIZE)*/
+
+        } /* end else for if(scale!=0) */
+
+    }  /* end else for if(maxInput == 0) */
+
+} /* end esc_iquant_fxp */
+
+
diff --git a/media/libstagefright/codecs/aacdec/esc_iquant_scaling.h b/media/libstagefright/codecs/aacdec/esc_iquant_scaling.h
new file mode 100644
index 0000000..a846b9f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/esc_iquant_scaling.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/esc_iquant_scaling.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for esc_iquant_scaling.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef ESC_IQUANT_SCALING_H
+#define ESC_IQUANT_SCALING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    void esc_iquant_scaling(
+        const Int16   quantSpec[],
+        Int32       coef[],
+        const Int   sfbWidth,
+        Int  const pQFormat,
+        UInt16      scale,
+        Int           maxInput);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif /* ESC_IQUANT_SCALING_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/extractframeinfo.cpp b/media/libstagefright/codecs/aacdec/extractframeinfo.cpp
new file mode 100644
index 0000000..571cc98
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/extractframeinfo.cpp
@@ -0,0 +1,487 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Filename: extractframeInfo.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:   hBitBuf      - bitbuffer handle
+              v_frame_info - pointer to memorylocation where the frame-info will
+                             be stored.
+
+ Return:     none.
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+Extracts a frame_info vector from control data read from the bitstream.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "extractframeinfo.h"
+#include    "buf_getbits.h"
+#include    "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+
+/*
+ *  (int) ceil (log (bs_num_env + 1) / log (2))
+ *  ceil(log([0:5]+1)/log(2))
+ */
+
+const Int32 bs_pointer_bits_tbl[MAX_ENVELOPES + 1] = { 0, 1, 2, 2, 3, 3};
+
+/*
+ *  (int)((float)numTimeSlots/bs_num_env + 0.5f)
+ *  floor(16./[0:5] + 0.5)
+ */
+
+const Int32 T_16_ov_bs_num_env_tbl[MAX_ENVELOPES + 1] = { 2147483647, 16, 8,
+        5,  4, 3
+                                                        };
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+SBR_ERROR extractFrameInfo(BIT_BUFFER     * hBitBuf,
+                           SBR_FRAME_DATA * h_frame_data)
+{
+
+    Int32 absBordLead = 0;
+    Int32 nRelLead = 0;
+    Int32 nRelTrail = 0;
+    Int32 bs_num_env = 0;
+    Int32 bs_num_rel = 0;
+    Int32 bs_var_bord = 0;
+    Int32 bs_var_bord_0 = 0;
+    Int32 bs_var_bord_1 = 0;
+    Int32 bs_pointer = 0;
+    Int32 bs_pointer_bits;
+    Int32 frameClass;
+    Int32 temp;
+    Int32 env;
+    Int32 k;
+    Int32 bs_num_rel_0 = 0;
+    Int32 bs_num_rel_1 = 0;
+    Int32 absBordTrail = 0;
+    Int32 middleBorder = 0;
+    Int32 bs_num_noise;
+    Int32 lA = 0;
+
+    Int32 tE[MAX_ENVELOPES + 1];
+    Int32 tQ[2 + 1];
+    Int32 f[MAX_ENVELOPES + 1];
+    Int32 bs_rel_bord[3];
+    Int32 bs_rel_bord_0[3];
+    Int32 bs_rel_bord_1[3];
+    Int32 relBordLead[3];
+    Int32 relBordTrail[3];
+
+
+    Int32 *v_frame_info = h_frame_data->frameInfo;
+
+    SBR_ERROR err =  SBRDEC_OK;
+
+
+    /*
+     * First read from the bitstream.
+     */
+
+    /* Read frame class */
+    h_frame_data->frameClass = frameClass = buf_getbits(hBitBuf, SBR_CLA_BITS);
+
+
+    switch (frameClass)
+    {
+
+        case FIXFIX:
+            temp = buf_getbits(hBitBuf, SBR_ENV_BITS);   /* 2 bits */
+
+            bs_num_env = 1 << temp;
+
+
+            f[0] = buf_getbits(hBitBuf, SBR_RES_BITS);   /* 1 bit */
+
+            for (env = 1; env < bs_num_env; env++)
+            {
+                f[env] = f[0];
+            }
+
+            nRelLead     = bs_num_env - 1;
+            absBordTrail  = 16;
+
+
+            break;
+
+        case FIXVAR:
+            bs_var_bord = buf_getbits(hBitBuf, SBR_ABS_BITS);   /* 2 bits */
+            bs_num_rel  = buf_getbits(hBitBuf, SBR_NUM_BITS);   /* 2 bits */
+            bs_num_env  = bs_num_rel + 1;
+
+            for (k = 0; k < bs_num_env - 1; k++)
+            {
+                bs_rel_bord[k] = (buf_getbits(hBitBuf, SBR_REL_BITS) + 1) << 1;
+            }
+
+            bs_pointer_bits = bs_pointer_bits_tbl[bs_num_env];
+
+            bs_pointer = buf_getbits(hBitBuf, bs_pointer_bits);
+
+            for (env = 0; env < bs_num_env; env++)
+            {                                                    /* 1 bit */
+                f[bs_num_env - 1 - env] = buf_getbits(hBitBuf, SBR_RES_BITS);
+            }
+
+            absBordTrail  = 16 + bs_var_bord;
+            nRelTrail     = bs_num_rel;
+
+            break;
+
+        case VARFIX:
+            bs_var_bord = buf_getbits(hBitBuf, SBR_ABS_BITS);   /* 2 bits */
+            bs_num_rel  = buf_getbits(hBitBuf, SBR_NUM_BITS);   /* 2 bits */
+            bs_num_env  = bs_num_rel + 1;
+
+            for (k = 0; k < bs_num_env - 1; k++)
+            {
+                bs_rel_bord[k] = (buf_getbits(hBitBuf, SBR_REL_BITS) + 1) << 1;
+            }
+
+            bs_pointer_bits = bs_pointer_bits_tbl[bs_num_env];
+
+            bs_pointer = buf_getbits(hBitBuf, bs_pointer_bits);
+
+            for (env = 0; env < bs_num_env; env++)
+            {                                  /* 1 bit */
+                f[env] = buf_getbits(hBitBuf, SBR_RES_BITS);
+            }
+
+            absBordTrail = 16;
+            absBordLead  = bs_var_bord;
+            nRelLead     = bs_num_rel;
+
+            break;
+
+        case VARVAR:
+            bs_var_bord_0 = buf_getbits(hBitBuf, SBR_ABS_BITS);   /* 2 bits */
+            bs_var_bord_1 = buf_getbits(hBitBuf, SBR_ABS_BITS);
+            bs_num_rel_0  = buf_getbits(hBitBuf, SBR_NUM_BITS);   /* 2 bits */
+            bs_num_rel_1  = buf_getbits(hBitBuf, SBR_NUM_BITS);
+
+            bs_num_env = bs_num_rel_0 + bs_num_rel_1 + 1;
+
+            for (k = 0; k < bs_num_rel_0; k++)
+            {                                                 /* 2 bits */
+                bs_rel_bord_0[k] = (buf_getbits(hBitBuf, SBR_REL_BITS) + 1) << 1;
+            }
+
+            for (k = 0; k < bs_num_rel_1; k++)
+            {                                                 /* 2 bits */
+                bs_rel_bord_1[k] = (buf_getbits(hBitBuf, SBR_REL_BITS) + 1) << 1;
+            }
+
+
+            bs_pointer_bits = bs_pointer_bits_tbl[bs_num_env];
+
+            bs_pointer = buf_getbits(hBitBuf, bs_pointer_bits);
+
+            for (env = 0; env < bs_num_env; env++)
+            {                                  /* 1 bit */
+                f[env] = buf_getbits(hBitBuf, SBR_RES_BITS);
+            }
+
+            absBordLead   = bs_var_bord_0;
+            absBordTrail  = 16 + bs_var_bord_1;
+            nRelLead      = bs_num_rel_0;
+            nRelTrail     = bs_num_rel_1;
+
+            break;
+
+    };
+
+
+    /*
+     * Calculate the framing.
+     */
+
+
+    switch (frameClass)
+    {
+        case FIXFIX:
+            for (k = 0; k < nRelLead; k++)
+            {
+                relBordLead[k] = T_16_ov_bs_num_env_tbl[bs_num_env];
+            }
+            break;
+        case VARFIX:
+            for (k = 0; k < nRelLead; k++)
+            {
+                relBordLead[k] = bs_rel_bord[k];
+            }
+            break;
+        case VARVAR:
+            for (k = 0; k < nRelLead; k++)
+            {
+                relBordLead[k] = bs_rel_bord_0[k];
+            }
+            for (k = 0; k < nRelTrail; k++)
+            {
+                relBordTrail[k] = bs_rel_bord_1[k];
+            }
+            break;
+        case FIXVAR:
+            for (k = 0; k < nRelTrail; k++)
+            {
+                relBordTrail[k] = bs_rel_bord[k];
+            }
+            break;
+    }
+
+
+    tE[0]          = absBordLead;
+    tE[bs_num_env] = absBordTrail;
+
+    for (env = 1; env <= nRelLead; env++)
+    {
+        tE[env] = absBordLead;
+        for (k = 0; k <= env - 1; k++)
+        {
+            tE[env] += relBordLead[k];
+        }
+    }
+
+    for (env = nRelLead + 1; env < bs_num_env; env++)
+    {
+        tE[env] = absBordTrail;
+        for (k = 0; k <= bs_num_env - env - 1; k++)
+        {
+            tE[env] -= relBordTrail[k];
+        }
+    }
+
+
+
+    switch (frameClass)
+    {
+        case  FIXFIX:
+            middleBorder = bs_num_env >> 1;
+            break;
+        case VARFIX:
+            switch (bs_pointer)
+            {
+                case 0:
+                    middleBorder = 1;
+                    break;
+                case 1:
+                    middleBorder = bs_num_env - 1;
+                    break;
+                default:
+                    middleBorder = bs_pointer - 1;
+                    break;
+            };
+            break;
+        case FIXVAR:
+        case VARVAR:
+            switch (bs_pointer)
+            {
+                case 0:
+                case 1:
+                    middleBorder = bs_num_env - 1;
+                    break;
+                default:
+                    middleBorder = bs_num_env + 1 - bs_pointer;
+                    break;
+            };
+            break;
+    };
+
+
+    tQ[0] = tE[0];
+    if (bs_num_env > 1)
+    {
+        tQ[1] = tE[middleBorder];
+        tQ[2] = tE[bs_num_env];
+        bs_num_noise = 2;
+    }
+    else
+    {
+        tQ[1] = tE[bs_num_env];
+        bs_num_noise = 1;
+    }
+
+    /*
+     *  Check consistency on freq bands
+     */
+
+    if ((tE[bs_num_env] < tE[0]) || (tE[0] < 0))
+    {
+        err = SBRDEC_INVALID_BITSTREAM;
+    }
+
+
+    switch (frameClass)
+    {
+        case  FIXFIX:
+            lA = -1;
+            break;
+        case VARFIX:
+            switch (bs_pointer)
+            {
+                case 0:
+                case 1:
+                    lA = -1;
+                    break;
+                default:
+                    lA = bs_pointer - 1;
+                    break;
+            };
+            break;
+        case FIXVAR:
+        case VARVAR:
+            switch (bs_pointer)
+            {
+                case 0:
+                    lA = - 1;
+                    break;
+                default:
+                    lA = bs_num_env + 1 - bs_pointer;
+                    break;
+            };
+            break;
+    };
+
+    /*
+     * Build the frameInfo vector...
+     */
+
+    v_frame_info[0] = bs_num_env;   /* Number of envelopes*/
+    pv_memcpy(v_frame_info + 1, tE, (bs_num_env + 1)*sizeof(Int32));    /* time borders*/
+    /* frequency resolution */
+    pv_memcpy(v_frame_info + 1 + bs_num_env + 1, f, bs_num_env*sizeof(Int32));
+
+    temp = (1 + bs_num_env) << 1;
+    v_frame_info[temp] = lA;                     /* transient envelope*/
+    v_frame_info[temp + 1] = bs_num_noise;       /* Number of noise envelopes */
+    /* noise borders */
+    pv_memcpy(v_frame_info + temp + 2, tQ, (bs_num_noise + 1)*sizeof(Int32));
+
+
+    return (err);
+
+}
+
+
+
+
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/extractframeinfo.h b/media/libstagefright/codecs/aacdec/extractframeinfo.h
new file mode 100644
index 0000000..2fcfe3789
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/extractframeinfo.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: extractFrameInfo.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef EXTRACTFRAMEINFO_H
+#define EXTRACTFRAMEINFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.h"
+#include    "e_sbr_error.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 Int32 FRAME_INFO[LENGTH_FRAME_INFO];
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    SBR_ERROR extractFrameInfo(BIT_BUFFER     * hBitBuf,
+    SBR_FRAME_DATA * h_frame_data);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/fft_rx4.h b/media/libstagefright/codecs/aacdec/fft_rx4.h
new file mode 100644
index 0000000..8e7acb31
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fft_rx4.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/fft_rx4.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+        (1) modified definition of w_64rx4 from Int to Int16
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions fft_rx4()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef FFT_RX4_H
+#define FFT_RX4_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define     FFT_RX4_LONG                256
+#define     ONE_FOURTH_FFT_RX4_LONG     ((FFT_RX4_LONG)>>2)
+#define     FFT_RX4_SHORT               64
+#define     ONE_FOURTH_FFT_RX4_SHORT    ((FFT_RX4_SHORT)>>2)
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+extern const Int16 w_64rx4[];
+extern const Int32 W_64rx4[];
+extern const Int32 W_256rx4[];
+extern const Int32 w_512rx2[];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void fft_rx4_long(
+        Int32      Data[],
+        Int32      *peak_value);
+
+    Int fft_rx4_short(
+        Int32      Data[],
+        Int32      *peak_value);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* FFT_RX4_H */
diff --git a/media/libstagefright/codecs/aacdec/fft_rx4_long.cpp b/media/libstagefright/codecs/aacdec/fft_rx4_long.cpp
new file mode 100644
index 0000000..c517e7e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fft_rx4_long.cpp
@@ -0,0 +1,428 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/fft_rx4_long.c
+ Funtions: fft_rx4_long
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+            (1) Eliminated search for max in the main loop.
+            (2) Reduced precision on w_256rx4 from Q15 to Q10
+
+ Description:
+            (1) Created function fft_rx4_long_no_max to overcome LTP problem.
+
+ Description:
+            (1) Modified shift so the accumulation growths faster than the
+                downshift, so now the input can be as high as 1.0 and saturation
+                will not occurre. The accumulation times the Q10 format will
+                never exceed 31 bits. This increases precision
+            (2) Eliminated unneeded data moves, used before for max search.
+            (3) Eliminated function fft_rx4_long_no_max.
+
+ Description:
+            (1) Added comment to explain max search elimination and
+                Q format during multiplications
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Data       =  Input complex vector, arranged in the following order:
+                  real, imag, real, imag...
+                  This is a complex vector whose elements (real and Imag) are
+                  Int32.
+                  type Int32 *
+
+    peak_value =  Input,  peak value of the input vector
+                  Output,  peak value of the resulting vector
+                  type Int32 *
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    calculation are done in-place and returned in Data
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Fast Fourier Transform, radix 4 with Decimation in Frequency and block
+    floating point arithmetic.
+    The radix-4 FFT  simply divides the FFT into four smaller FFTs. Each of
+    the smaller FFTs is then further divided into smaller ones and so on.
+    It consists of log 4 N stages and each stage consists of N/4 dragonflies.
+
+    An FFT is nothing but a bundle of multiplications and summations which
+    may overflow during calculations.
+
+
+    This routine uses a scheme to test and scale the result output from
+    each FFT stage in order to fix the accumulation overflow.
+
+    The Input Data should be in Q13 format to get the highest precision.
+    At the end of each dragonfly calculation, a test for possible bit growth
+    is made, if bit growth is possible the Data is scale down back to Q13.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should provide a fixed point FFT for an input array
+    of size 256.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] Advance Digital Signal Processing, J. Proakis, C. Rader, F. Ling,
+        C. Nikias, Macmillan Pub. Co.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+   MODIFY( x[] )
+   RETURN( exponent )
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "fft_rx4.h"
+
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void fft_rx4_long(
+    Int32      Data[],
+    Int32      *peak_value)
+
+{
+    Int     n1;
+    Int     n2;
+    Int     j;
+    Int     k;
+    Int     i;
+
+    Int32   t1;
+    Int32   t2;
+    Int32   r1;
+    Int32   r2;
+    Int32   r3;
+    Int32   r4;
+    Int32   s1;
+    Int32   s2;
+    Int32   s3;
+    Int32   *pData1;
+    Int32   *pData2;
+    Int32   *pData3;
+    Int32   *pData4;
+    Int32   temp1;
+    Int32   temp2;
+    Int32   temp3;
+    Int32   temp4;
+    Int32   max;
+
+    Int32   exp_jw1;
+    Int32   exp_jw2;
+    Int32   exp_jw3;
+
+
+
+    const Int32  *pw = W_256rx4;
+
+    n2 = FFT_RX4_LONG;
+
+    for (k = FFT_RX4_LONG; k > 4; k >>= 2)
+    {
+
+        n1 = n2;
+        n2 >>= 2;
+
+        for (i = 0; i < FFT_RX4_LONG; i += n1)
+        {
+            pData1 = &Data[ i<<1];
+            pData2 = pData1 + n1;
+
+            temp1   = *pData1;
+            temp2   = *pData2;
+
+            r1      = temp1 + temp2;
+            r2      = temp1 - temp2;
+
+            pData3 = pData1 + (n1 >> 1);
+            pData4 = pData3 + n1;
+            temp3   = *pData3++;
+            temp4   = *pData4++;
+
+            t1      = temp3 + temp4;
+
+            *(pData1++) = (r1 + t1);
+            t2      = temp3 - temp4;
+            *(pData2++) = (r1 - t1);
+
+            temp1   = *pData1;
+            temp2   = *pData2;
+
+            s1      = temp1 + temp2;
+            temp3   = *pData3;
+            s2      = temp1 - temp2;
+            temp4   = *pData4;
+            *pData3--  = (s2 - t2);
+            *pData4--  = (s2 + t2);
+
+            t1      = temp3 + temp4;
+
+            *pData1    = (s1 + t1);
+            *pData2    = (s1 - t1);
+
+            r1      = temp3 - temp4;
+
+            *pData4    = (r2 - r1);
+            *pData3    = (r2 + r1);
+
+        }  /* i */
+
+
+
+        for (j = 1; j < n2; j++)
+        {
+
+            exp_jw1 = (*pw++);
+            exp_jw2 = (*pw++);
+            exp_jw3 = (*pw++);
+
+
+            for (i = j; i < FFT_RX4_LONG; i += n1)
+            {
+                pData1 = &Data[ i<<1];
+                pData2 = pData1 + n1;
+
+                temp1   = *pData1;
+                temp2   = *pData2++;
+
+                r1      = temp1 + temp2;
+                r2      = temp1 - temp2;
+
+                pData3 = pData1 + (n1 >> 1);
+                pData4 = pData3 + n1;
+                temp3   = *pData3++;
+                temp4   = *pData4++;
+
+                r3      = temp3 + temp4;
+                r4      = temp3 - temp4;
+
+                *(pData1++) = (r1 + r3);
+                r1          = (r1 - r3) << 1;
+
+                temp2   = *pData2;
+                temp1   = *pData1;
+
+                s1      = temp1 + temp2;
+                s2      = temp1 - temp2;
+                s3      = (s2 + r4) << 1;
+                s2      = (s2 - r4) << 1;
+
+                temp3   = *pData3;
+                temp4   = *pData4;
+
+                t1      = temp3 + temp4;
+                t2      = temp3 - temp4;
+
+                *pData1  = (s1 + t1);
+                s1       = (s1 - t1) << 1;
+
+                *pData2--  = cmplx_mul32_by_16(s1, -r1, exp_jw2);
+                r3      = (r2 - t2) << 1;
+                *pData2    = cmplx_mul32_by_16(r1,  s1, exp_jw2);
+
+                r2      = (r2 + t2) << 1;
+
+                *pData3--  = cmplx_mul32_by_16(s2, -r2, exp_jw1);
+                *pData3    = cmplx_mul32_by_16(r2,  s2, exp_jw1);
+
+                *pData4--  = cmplx_mul32_by_16(s3, -r3, exp_jw3);
+                *pData4    = cmplx_mul32_by_16(r3,  s3, exp_jw3);
+
+            }  /* i */
+
+        }  /*  j */
+
+    } /* k */
+
+
+    max = 0;
+
+    pData1 = Data - 7;
+
+
+    for (i = ONE_FOURTH_FFT_RX4_LONG; i != 0 ; i--)
+    {
+        pData1 += 7;
+        pData2 = pData1 + 4;
+
+
+        temp1   = *pData1;
+        temp2   = *pData2++;
+
+        r1      = temp1 + temp2;
+        r2      = temp1 - temp2;
+
+        pData3 = pData1 + 2;
+        pData4 = pData1 + 6;
+        temp1   = *pData3++;
+        temp2   = *pData4++;
+
+        t1      = temp1 + temp2;
+        t2      = temp1 - temp2;
+
+        temp1       = (r1 + t1);
+        r1          = (r1 - t1);
+        *(pData1++) = temp1;
+        max        |= (temp1 >> 31) ^ temp1;
+
+
+
+        temp2   = *pData2;
+        temp1   = *pData1;
+
+        s1      = temp1 + temp2;
+        s2      = temp1 - temp2;
+
+
+        temp1   = *pData3;
+        temp2   = *pData4;
+
+        s3      = (s2 + t2);
+        s2      = (s2 - t2);
+
+        t1      = temp1 + temp2;
+        t2      = temp1 - temp2;
+
+        temp1      = (s1 + t1);
+        *pData1    = temp1;
+        temp2      = (s1 - t1);
+
+        max       |= (temp1 >> 31) ^ temp1;
+        *pData2--  = temp2;
+        max       |= (temp2 >> 31) ^ temp2;
+
+        *pData2    = r1;
+        max       |= (r1 >> 31) ^ r1;
+        *pData3--  = s2;
+        max       |= (s2 >> 31) ^ s2;
+        *pData4--  = s3;
+        max       |= (s3 >> 31) ^ s3;
+
+        temp1      = (r2 - t2);
+        *pData4    = temp1;
+        temp2      = (r2 + t2);
+        *pData3    = temp2;
+        max       |= (temp1 >> 31) ^ temp1;
+        max       |= (temp2 >> 31) ^ temp2;
+
+    }  /* i */
+
+    *peak_value = max;
+
+    return ;
+
+}
+
diff --git a/media/libstagefright/codecs/aacdec/fft_rx4_short.cpp b/media/libstagefright/codecs/aacdec/fft_rx4_short.cpp
new file mode 100644
index 0000000..4a8a0d6
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fft_rx4_short.cpp
@@ -0,0 +1,468 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/fft_rx4_short.c
+ Funtions: fft_rx4_short
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+            (1) Eliminated search for max in the main loop.
+            (2) Simplified the function by eliminating different conditions
+                for exp.
+            (3) Reduced precision on w_64rx4 from Q15 to Q12, so now the
+                input can be as high as 1.0 and saturation will not occurre
+                because the accumulation times the new Q12 format will never
+                exceed 31 bits.
+
+ Description:
+            (1) Added comment to explain max search elimination and
+                Q format during multiplications
+            (2) Increased down shift from 1 to 2, to ensure that 32-bit
+                numbers will not overflow when 2 consecutive adds are done
+                This was found during code review.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Data       =  Input complex vector, arranged in the following order:
+                  real, imag, real, imag...
+                  This is a complex vector whose elements (real and Imag) are
+                  Int32.
+                  type Int32 *
+
+    peak_value =  Input,  peak value of the input vector
+                  Output,  peak value of the resulting vector
+                  type Int32 *
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exponent returns a shift to compensate the scaling introduced by
+    overflow protection
+
+ Pointers and Buffers Modified:
+    calculation are done in-place and returned in Data
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Fast Fourier Transform, radix 4 with Decimation in Frequency and block
+    floating point arithmetic.
+    The radix-4 FFT  simply divides the FFT into four smaller FFTs. Each of
+    the smaller FFTs is then further divided into smaller ones and so on.
+    It consists of log 4 N stages and each stage consists of N/4 dragonflies.
+
+    An FFT is nothing but a bundle of multiplications and summations which
+    may overflow during calculations.
+
+
+    This routine uses a scheme to test and scale the result output from
+    each FFT stage in order to fix the accumulation overflow.
+
+    The Input Data should be in Q13 format to get the highest precision.
+    At the end of each dragonfly calculation, a test for possible bit growth
+    is made, if bit growth is possible the Data is scale down back to Q13.
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should provide a fixed point FFT for an input array
+    of size 64.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] Advance Digital Signal Processing, J. Proakis, C. Rader, F. Ling,
+        C. Nikias, Macmillan Pub. Co.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+   MODIFY( x[] )
+   RETURN( exponent )
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "fft_rx4.h"
+#include "pv_normalize.h"
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Int fft_rx4_short(
+    Int32      Data[],
+    Int32      *peak_value)
+
+{
+    Int     n1;
+    Int     n2;
+    Int     n3;
+    Int     j;
+    Int     k;
+    Int     i;
+    Int32   exp_jw1;
+    Int32   exp_jw2;
+    Int32   exp_jw3;
+
+
+    Int32   t1;
+    Int32   t2;
+    Int32   r1;
+    Int32   r2;
+    Int32   r3;
+    Int32   s1;
+    Int32   s2;
+    Int32   s3;
+
+    Int32   *pData1;
+    Int32   *pData2;
+    Int32   *pData3;
+    Int32   *pData4;
+    const Int32  *pw;
+    Int32   temp1;
+    Int32   temp2;
+    Int32   temp3;
+    Int32   temp4;
+    Int32   max;
+    Int     exp;
+    Int     exponent = 0;
+    Int     shift;
+
+
+    max = *peak_value;
+    exp = 0;
+
+    if (max > 0x008000)
+    {
+        exp = 8 - pv_normalize(max);   /* use 24 bits  */
+
+        exponent = exp;        /* keeps track of # of shifts */
+
+    }
+
+    n2 = FFT_RX4_SHORT;
+
+    pw = W_64rx4;
+
+
+    /* shift down to avoid possible overflow in first pass of the loop */
+    shift = 2;
+
+    for (k = FFT_RX4_SHORT; k > 4; k >>= 2)
+    {
+
+        n1 = n2;
+        n2 >>= 2;
+        n3 = n1 >> 1;
+
+        exp -= 2;
+
+        for (i = 0; i < FFT_RX4_SHORT; i += n1)
+        {
+            pData1 = &Data[ i<<1];
+            pData3 = pData1 + n3;
+            pData2 = pData1 + n1;
+            pData4 = pData3 + n1;
+
+            temp1   = *(pData1);
+            temp2   = *(pData2);
+            temp1   >>= shift;
+            temp2   >>= shift;
+
+            r1      = temp1 + temp2;
+            r2      = temp1 - temp2;
+
+            temp3   = *(pData3++);
+            temp4   = *(pData4++);
+            temp3   >>= shift;
+            temp4   >>= shift;
+
+            t1      = temp3 + temp4;
+            t2      = temp3 - temp4;
+
+            *(pData1++) = (r1 + t1) >> exp;
+            *(pData2++) = (r1 - t1) >> exp;
+
+            temp1   = *pData1;
+            temp2   = *pData2;
+            temp1   >>= shift;
+            temp2   >>= shift;
+
+            s1      = temp1 + temp2;
+            s2      = temp1 - temp2;
+
+            temp3   = *pData3;
+            temp4   = *pData4;
+            temp3   >>= shift;
+            temp4   >>= shift;
+
+            t1      = temp3 + temp4;
+            r1      = temp3 - temp4;
+
+            *pData1   = (s1 + t1) >> exp;
+            *pData2   = (s1 - t1) >> exp;
+
+            *pData4--    = (s2 + t2) >> exp;
+            *pData4      = (r2 - r1) >> exp;
+
+            *pData3--    = (s2 - t2) >> exp;
+            *pData3      = (r2 + r1) >> exp;
+
+
+        }  /* i */
+
+        for (j = 1; j < n2; j++)
+        {
+            exp_jw1 = *pw++;
+            exp_jw2 = *pw++;
+            exp_jw3 = *pw++;
+
+
+            for (i = j; i < FFT_RX4_SHORT; i += n1)
+            {
+                pData1 = &Data[ i<<1];
+                pData3 = pData1 + n3;
+                pData2 = pData1 + n1;
+                pData4 = pData3 + n1;
+
+                temp1   = *(pData1);
+                temp2   = *(pData2++);
+                temp1   >>= shift;
+                temp2   >>= shift;
+
+                r1      = temp1 + temp2;
+                r2      = temp1 - temp2;
+                temp3   = *(pData3++);
+                temp4   = *(pData4++);
+                temp3   >>= shift;
+                temp4   >>= shift;
+
+                t1      = temp3 + temp4;
+                t2      = temp3 - temp4;
+
+                *(pData1++) = (r1 + t1) >> exp;
+                r1          = (r1 - t1) >> exp;
+
+                temp1   = *pData1;
+                temp2   = *pData2;
+                temp1   >>= shift;
+                temp2   >>= shift;
+
+                s1      = temp1 + temp2;
+                s2      = temp1 - temp2;
+
+                s3      = (s2 + t2) >> exp;
+                s2      = (s2 - t2) >> exp;
+
+                temp3   = *pData3;
+                temp4   = *pData4 ;
+                temp3   >>= shift;
+                temp4   >>= shift;
+
+                t1      = temp3 + temp4;
+                t2      = temp3 - temp4;
+
+                *pData1  = (s1 + t1) >> exp;
+                s1       = (s1 - t1) >> exp;
+
+
+                *pData2--  = cmplx_mul32_by_16(s1, -r1, exp_jw2) << 1;
+                *pData2    = cmplx_mul32_by_16(r1,  s1, exp_jw2) << 1;
+
+                r3       = ((r2 - t2) >> exp);
+                r2       = ((r2 + t2) >> exp);
+
+                *pData3--  = cmplx_mul32_by_16(s2, -r2, exp_jw1) << 1;
+                *pData3    = cmplx_mul32_by_16(r2,  s2, exp_jw1) << 1;
+
+                *pData4--  = cmplx_mul32_by_16(s3, -r3, exp_jw3) << 1;
+                *pData4    = cmplx_mul32_by_16(r3,  s3, exp_jw3) << 1;
+
+            }  /* i */
+
+        }  /*  j */
+
+        /*
+         *  this will reset exp and shift to zero for the second pass of the
+         *  loop
+         */
+        exp   = 2;
+        shift = 0;
+
+    } /* k */
+
+
+    max = 0;
+
+    pData1 = Data - 7;
+
+    for (i = ONE_FOURTH_FFT_RX4_SHORT; i != 0 ; i--)
+    {
+        pData1 += 7;
+
+        pData3 = pData1 + 2;
+        pData2 = pData1 + 4;
+        pData4 = pData1 + 6;
+
+        temp1   = *pData1;
+        temp2   = *pData2++;
+
+        r1      = temp1 + temp2;
+        r2      = temp1 - temp2;
+
+        temp1   = *pData3++;
+        temp2   = *pData4++;
+
+        t1      = temp1 + temp2;
+        t2      = temp1 - temp2;
+
+        temp1       = (r1 + t1);
+        r1          = (r1 - t1);
+        *(pData1++) = temp1;
+        max        |= (temp1 >> 31) ^ temp1;
+
+
+
+        temp1   = *pData1;
+        temp2   = *pData2;
+
+        s1      = temp1 + temp2;
+        s2      = temp1 - temp2;
+
+        s3      = (s2 + t2);
+        s2      = (s2 - t2);
+
+        temp1   = *pData3;
+        temp2   = *pData4;
+
+        t1      = temp1 + temp2;
+        t2      = temp1 - temp2;
+
+        temp1      = (s1 + t1);
+        temp2      = (s1 - t1);
+        *pData1    = temp1;
+        *pData2--  = temp2;
+        max       |= (temp1 >> 31) ^ temp1;
+        max       |= (temp2 >> 31) ^ temp2;
+
+        *pData2    = r1;
+        *pData3--  = s2;
+        *pData4--  = s3;
+        max       |= (r1 >> 31) ^ r1;
+        max       |= (s2 >> 31) ^ s2;
+        max       |= (s3 >> 31) ^ s3;
+
+        temp1      = (r2 - t2);
+        temp2      = (r2 + t2);
+        *pData4    = temp1;
+        *pData3    = temp2;
+        max       |= (temp1 >> 31) ^ temp1;
+        max       |= (temp2 >> 31) ^ temp2;
+
+    }  /* i */
+
+    *peak_value = max;
+
+
+    return (exponent);
+
+}
diff --git a/media/libstagefright/codecs/aacdec/fft_rx4_tables_fxp.cpp b/media/libstagefright/codecs/aacdec/fft_rx4_tables_fxp.cpp
new file mode 100644
index 0000000..2476b87
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fft_rx4_tables_fxp.cpp
@@ -0,0 +1,269 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/fft_rx4_tables_fxp.c
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Reduce the accuracy of w_256rx4 and w_512rx2 to Q10 format.
+            Try to to pack sin and cos into one 32-bit number to reduce the
+            memory access, but doesn't help in speed, so commented out for now.
+
+ Description:
+        (1) Reduced precision of w_64rx4 from Q15 to Q12.
+        (2) Increased precision of w_512rx2 from Q10 to Q13, Both changes
+            increase overall decoder precision
+
+ Description:
+        (1) per code review comment, added description for table generation
+        (2) modified definition of w_64rx4 from Int to Int16
+
+
+ Who:                           Date:
+ Description:
+
+  ----------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+  Table generation
+
+ n = 256  or  64;
+ M = precision; 2^10, 2^12, 2^13
+
+ for j=1; j<log4(n); j *= 4
+
+    for i=0; i<n/4; i +=j
+
+        phi_1 = 2*pi*i/n;
+        phi_2 = 4*pi*i/n;
+        phi_3 = 6*pi*i/n;
+        M*[cos(phi_1) sin(phi_1) cos(phi_2) sin(phi_2) cos(phi_3) sin(phi_4)];
+
+    end
+
+ end
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "fft_rx4.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
+----------------------------------------------------------------------------*/
+
+/*
+------------------------------------------------------------------------------
+ Forward FFT radix-4 tables
+------------------------------------------------------------------------------
+*/
+
+
+const Int32 W_64rx4[60] =            /* 2 Q15  */
+{
+
+    0x7F610C8C,  0x7D8918F9,  0x7A7C2528,
+    0x7D8918F9,  0x764130FB,  0x6A6D471C,
+    0x7A7C2528,  0x6A6D471C,  0x513362F1,
+    0x764130FB,  0x5A825A82,  0x30FB7641,
+    0x70E23C56,  0x471C6A6D,  0x0C8C7F61,
+    0x6A6D471C,  0x30FB7641,  0xE7057D89,
+    0x62F15133,  0x18F97D89,  0xC3A870E2,
+    0x5A825A82,  0x00007FFF,  0xA57C5A82,
+    0x513362F1,  0xE7057D89,  0x8F1C3C56,
+    0x471C6A6D,  0xCF037641,  0x827518F9,
+    0x3C5670E2,  0xB8E26A6D,  0x809DF372,
+    0x30FB7641,  0xA57C5A82,  0x89BDCF03,
+    0x25287A7C,  0x9591471C,  0x9D0DAECB,
+    0x18F97D89,  0x89BD30FB,  0xB8E29591,
+    0x0C8C7F61,  0x827518F9,  0xDAD68582,
+    0x764130FB,  0x5A825A82,  0x30FB7641,
+    0x5A825A82,  0x00007FFF,  0xA57C5A82,
+    0x30FB7641,  0xA57C5A82,  0x89BDCF03,
+};
+
+
+
+const Int32 W_256rx4[495] =            /* 2 Q15  */
+{
+
+    0x7FF50324,  0x7FD80648,  0x7FA6096A,
+    0x7FD80648,  0x7F610C8C,  0x7E9C12C8,
+    0x7FA6096A,  0x7E9C12C8,  0x7CE31C0B,
+    0x7F610C8C,  0x7D8918F9,  0x7A7C2528,
+    0x7F090FAB,  0x7C291F1A,  0x776B2E11,
+    0x7E9C12C8,  0x7A7C2528,  0x73B536BA,
+    0x7E1D15E2,  0x78842B1F,  0x6F5E3F17,
+    0x7D8918F9,  0x764130FB,  0x6A6D471C,
+    0x7CE31C0B,  0x73B536BA,  0x64E84EBF,
+    0x7C291F1A,  0x70E23C56,  0x5ED755F5,
+    0x7B5C2223,  0x6DC941CE,  0x58425CB3,
+    0x7A7C2528,  0x6A6D471C,  0x513362F1,
+    0x79892826,  0x66CF4C3F,  0x49B468A6,
+    0x78842B1F,  0x62F15133,  0x41CE6DC9,
+    0x776B2E11,  0x5ED755F5,  0x398C7254,
+    0x764130FB,  0x5A825A82,  0x30FB7641,
+    0x750433DF,  0x55F55ED7,  0x28267989,
+    0x73B536BA,  0x513362F1,  0x1F1A7C29,
+    0x7254398C,  0x4C3F66CF,  0x15E27E1D,
+    0x70E23C56,  0x471C6A6D,  0x0C8C7F61,
+    0x6F5E3F17,  0x41CE6DC9,  0x03247FF5,
+    0x6DC941CE,  0x3C5670E2,  0xF9B67FD8,
+    0x6C23447A,  0x36BA73B5,  0xF0537F09,
+    0x6A6D471C,  0x30FB7641,  0xE7057D89,
+    0x68A649B4,  0x2B1F7884,  0xDDDB7B5C,
+    0x66CF4C3F,  0x25287A7C,  0xD4DF7884,
+    0x64E84EBF,  0x1F1A7C29,  0xCC1F7504,
+    0x62F15133,  0x18F97D89,  0xC3A870E2,
+    0x60EB539B,  0x12C87E9C,  0xBB846C23,
+    0x5ED755F5,  0x0C8C7F61,  0xB3BF66CF,
+    0x5CB35842,  0x06487FD8,  0xAC6360EB,
+    0x5A825A82,  0x00007FFF,  0xA57C5A82,
+    0x58425CB3,  0xF9B67FD8,  0x9F13539B,
+    0x55F55ED7,  0xF3727F61,  0x992F4C3F,
+    0x539B60EB,  0xED367E9C,  0x93DB447A,
+    0x513362F1,  0xE7057D89,  0x8F1C3C56,
+    0x4EBF64E8,  0xE0E47C29,  0x8AFA33DF,
+    0x4C3F66CF,  0xDAD67A7C,  0x877A2B1F,
+    0x49B468A6,  0xD4DF7884,  0x84A22223,
+    0x471C6A6D,  0xCF037641,  0x827518F9,
+    0x447A6C23,  0xC94473B5,  0x80F50FAB,
+    0x41CE6DC9,  0xC3A870E2,  0x80260648,
+    0x3F176F5E,  0xBE306DC9,  0x8009FCDA,
+    0x3C5670E2,  0xB8E26A6D,  0x809DF372,
+    0x398C7254,  0xB3BF66CF,  0x81E1EA1C,
+    0x36BA73B5,  0xAECB62F1,  0x83D5E0E4,
+    0x33DF7504,  0xAA095ED7,  0x8675D7D8,
+    0x30FB7641,  0xA57C5A82,  0x89BDCF03,
+    0x2E11776B,  0xA12755F5,  0x8DAAC672,
+    0x2B1F7884,  0x9D0D5133,  0x9235BE30,
+    0x28267989,  0x992F4C3F,  0x9758B64A,
+    0x25287A7C,  0x9591471C,  0x9D0DAECB,
+    0x22237B5C,  0x923541CE,  0xA34BA7BC,
+    0x1F1A7C29,  0x8F1C3C56,  0xAA09A127,
+    0x1C0B7CE3,  0x8C4936BA,  0xB13F9B16,
+    0x18F97D89,  0x89BD30FB,  0xB8E29591,
+    0x15E27E1D,  0x877A2B1F,  0xC0E790A0,
+    0x12C87E9C,  0x85822528,  0xC9448C49,
+    0x0FAB7F09,  0x83D51F1A,  0xD1ED8893,
+    0x0C8C7F61,  0x827518F9,  0xDAD68582,
+    0x096A7FA6,  0x816212C8,  0xE3F3831B,
+    0x06487FD8,  0x809D0C8C,  0xED368162,
+    0x03247FF5,  0x80260648,  0xF6948058,
+    0x7F610C8C,  0x7D8918F9,  0x7A7C2528,
+    0x7D8918F9,  0x764130FB,  0x6A6D471C,
+    0x7A7C2528,  0x6A6D471C,  0x513362F1,
+    0x764130FB,  0x5A825A82,  0x30FB7641,
+    0x70E23C56,  0x471C6A6D,  0x0C8C7F61,
+    0x6A6D471C,  0x30FB7641,  0xE7057D89,
+    0x62F15133,  0x18F97D89,  0xC3A870E2,
+    0x5A825A82,  0x00007FFF,  0xA57C5A82,
+    0x513362F1,  0xE7057D89,  0x8F1C3C56,
+    0x471C6A6D,  0xCF037641,  0x827518F9,
+    0x3C5670E2,  0xB8E26A6D,  0x809DF372,
+    0x30FB7641,  0xA57C5A82,  0x89BDCF03,
+    0x25287A7C,  0x9591471C,  0x9D0DAECB,
+    0x18F97D89,  0x89BD30FB,  0xB8E29591,
+    0x0C8C7F61,  0x827518F9,  0xDAD68582,
+    0x764130FB,  0x5A825A82,  0x30FB7641,
+    0x5A825A82,  0x00007FFF,  0xA57C5A82,
+    0x30FB7641,  0xA57C5A82,  0x89BDCF03
+};
+
+
+
+/*
+------------------------------------------------------------------------------
+ Forward FFT radix-2 table
+------------------------------------------------------------------------------
+*/
+
+
+const Int32 w_512rx2[127] =
+{
+    /* Q15  */
+    0x7FFE0192, 0x7FF60324, 0x7FEA04B6,
+    0x7FD90648,  0x7FC207D9, 0x7FA7096B, 0x7F870AFB,
+    0x7F620C8C,  0x7F380E1C, 0x7F0A0FAB, 0x7ED6113A,
+    0x7E9D12C8,  0x7E601455, 0x7E1E15E2, 0x7DD6176E,
+    0x7D8A18F9,  0x7D3A1A83, 0x7CE41C0C, 0x7C891D93,
+    0x7C2A1F1A,  0x7BC6209F, 0x7B5D2224, 0x7AEF23A7,
+    0x7A7D2528,  0x7A0626A8, 0x798A2827, 0x790A29A4,
+    0x78852B1F,  0x77FB2C99, 0x776C2E11, 0x76D92F87,
+    0x764230FC,  0x75A6326E, 0x750533DF, 0x7460354E,
+    0x73B636BA,  0x73083825, 0x7255398D, 0x719E3AF3,
+    0x70E33C57,  0x70233DB8, 0x6F5F3F17, 0x6E974074,
+    0x6DCA41CE,  0x6CF94326, 0x6C24447B, 0x6B4B45CD,
+    0x6A6E471D,  0x698C486A, 0x68A749B4, 0x67BD4AFB,
+    0x66D04C40,  0x65DE4D81, 0x64E94EC0, 0x63EF4FFB,
+    0x62F25134,  0x61F15269, 0x60EC539B, 0x5FE454CA,
+    0x5ED755F6,  0x5DC8571E, 0x5CB45843, 0x5B9D5964,
+    0x5A825A82,  0x59645B9D, 0x58435CB4, 0x571E5DC8,
+    0x55F65ED7,  0x54CA5FE4, 0x539B60EC, 0x526961F1,
+    0x513462F2,  0x4FFB63EF, 0x4EC064E9, 0x4D8165DE,
+    0x4C4066D0,  0x4AFB67BD, 0x49B468A7, 0x486A698C,
+    0x471D6A6E,  0x45CD6B4B, 0x447B6C24, 0x43266CF9,
+    0x41CE6DCA,  0x40746E97, 0x3F176F5F, 0x3DB87023,
+    0x3C5770E3,  0x3AF3719E, 0x398D7255, 0x38257308,
+    0x36BA73B6,  0x354E7460, 0x33DF7505, 0x326E75A6,
+    0x30FC7642,  0x2F8776D9, 0x2E11776C, 0x2C9977FB,
+    0x2B1F7885,  0x29A4790A, 0x2827798A, 0x26A87A06,
+    0x25287A7D,  0x23A77AEF, 0x22247B5D, 0x209F7BC6,
+    0x1F1A7C2A,  0x1D937C89, 0x1C0C7CE4, 0x1A837D3A,
+    0x18F97D8A,  0x176E7DD6, 0x15E27E1E, 0x14557E60,
+    0x12C87E9D,  0x113A7ED6, 0x0FAB7F0A, 0x0E1C7F38,
+    0x0C8C7F62,  0x0AFB7F87, 0x096B7FA7, 0x07D97FC2,
+    0x06487FD9,  0x04B67FEA, 0x03247FF6, 0x01927FFE
+};
+
diff --git a/media/libstagefright/codecs/aacdec/find_adts_syncword.cpp b/media/libstagefright/codecs/aacdec/find_adts_syncword.cpp
new file mode 100644
index 0000000..535f177
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/find_adts_syncword.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/find_adts_syncword.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Fixed error in logic that determines whether there are enough
+ bits available to conduct a search for the syncword.  The plus sign in
+ the following condition should be a minus.
+
+    if (pInputStream->usedBits <
+            (pInputStream->availableBits + syncword_length)
+
+ The length of the syncword should subtract from the number of available
+ bits, not add.
+
+ Description:  Fixed condition when the end of file was found, unsigned
+   comparison produced a undesired search. Fixed by casting comparison
+     if ((Int)pInputStream->usedBits <
+            ((Int)pInputStream->availableBits - syncword_length) )
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pSyncword     = Pointer to variable containing the syncword that the
+                    function should be scanning for in the buffer. [ UInt32 * ]
+
+    pInputStream  = Pointer to a BITS structure, used by the function getbits
+                    to retrieve data from the bitstream.  [ BITS * ]
+
+    syncword_length = The length of the syncword. [ Int ]
+
+    syncword_mask   = A mask to be applied to the bitstream before comparison
+                      with the value pointed to by pSyncword. [ UInt32 ]
+
+ 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 module scans the bitstream for a syncword of any length between 1 and 32.
+ If certain bits in the syncword are to be ignored, that bit position should
+ be set to 0 in both parameters *(pSyncword) and syncword_mask.  This allows
+ for a syncword to be constructed out of non-contiguous bits.
+
+ Upon finding the syncword's position in the bitstream, a value denoting the
+ syncword's degree of deviance from being byte-aligned (byte_align_offset)
+ is set in the structure pointed to by pInputStream.
+ This is a value between 0 and 7.
+
+ If no syncword is found, the function returns status == ERROR.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ "Don't care" bits must be set to '0' in both *(pSyncword) and syncword_mask.
+
+ This function should not be called if there are less than
+ (8 + syncword_length) bits in the buffer.
+
+------------------------------------------------------------------------------
+ REFERENCES
+ (1) ISO/IEC 13818-7:1997(E)
+     Part 7
+        Subpart 6.2 (Audio_Data_Transport_Stream frame, ADTS)
+
+ (2) ISO/IEC 11172-3:1993(E)
+     Part 3
+        Subpart 2.4.3 The audio decoding process
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF (pInputStream->usedBits <
+            (pInputStream->availableBits + syncword_length) )
+
+        max_search_length = (pInputStream->availableBits - pInputStream->usedBits);
+
+        max_search_length = max_search_length - syncword_length;
+
+        search_length = 0;
+
+        adts_header =
+        CALL getbits(syncword_length, pInputStream);
+            MODIFYING pInputStream->usedBits
+            RETURNING bits from bitstream of length (syncword_length)
+
+        test_for_syncword = adts_header AND syncword_mask;
+        test_for_syncword = test_for_syncword XOR syncword;
+
+        WHILE ( (test_for_syncword != 0) && (search_length > 0) )
+
+            search_length = search_length - 1;
+
+            adts_header = adts_header << 1;
+            adts_header = adts_header OR ...
+
+            CALL getbits(syncword_length, pInputStream);
+                MODIFYING pInputStream->usedBits
+                RETURNING 1 bit from the bitstream
+
+            test_for_syncword = adts_header AND syncword_mask;
+            test_for_syncword = test_for_syncword XOR syncword;
+
+        ENDWHILE
+
+        IF (search_length == 0)
+            status = ERROR;
+        ENDIF
+
+        *(pSyncword) = adts_header;
+
+         pInputStream->byteAlignOffset =
+             (pInputStream->usedBits - syncwordlength) AND 0x7;
+
+    ELSE
+        status = ERROR;
+    ENDIF
+
+    return (status);
+
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_bits.h"
+#include "ibstream.h"
+#include "find_adts_syncword.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define FIND_ADTS_ERROR -1
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int find_adts_syncword(
+    UInt32 *pSyncword,
+    BITS   *pInputStream,
+    Int     syncword_length,
+    UInt32  syncword_mask)
+{
+
+    Int    status = SUCCESS;
+    UInt   search_length;
+    UInt32 adts_header = 0;
+    UInt32 test_for_syncword;
+    UInt32 syncword = *(pSyncword);
+
+    /*
+     * Determine the maximum number of bits available to this function for
+     * the syncword search.
+     */
+    if ((Int)pInputStream->usedBits <
+            ((Int)pInputStream->availableBits - syncword_length))
+    {
+        search_length = (pInputStream->availableBits - pInputStream->usedBits);
+
+        search_length -= syncword_length;
+
+        adts_header  = getbits(syncword_length, pInputStream);
+
+        /*
+         * Mask the result in adts_header with the syncword_mask, so only the
+         * bits relevant to syncword detection are compared to *(pSyncword).
+         */
+        test_for_syncword  = adts_header & syncword_mask;
+        test_for_syncword ^= syncword;
+
+        /*
+         * Scan bit-by-bit through the bitstream, until the function either
+         * runs out of bits, or finds the syncword.
+         */
+
+        while ((test_for_syncword != 0) && (search_length > 0))
+        {
+            search_length--;
+
+            adts_header <<= 1;
+            adts_header |= getbits(1, pInputStream);
+
+            test_for_syncword  = adts_header & syncword_mask;
+            test_for_syncword ^= syncword;
+        }
+
+        if (search_length == 0)
+        {
+            status = FIND_ADTS_ERROR;
+        }
+
+        /*
+         * Return the syncword's position in the bitstream.  Correct placement
+         * of the syncword will result in byte_align_offset == 0.
+         * If the syncword is found not to be byte-aligned, then return
+         * the degree of disalignment, so further decoding can
+         * be shifted as necessary.
+         *
+         */
+        pInputStream->byteAlignOffset =
+            (pInputStream->usedBits - syncword_length) & 0x7;
+
+    } /* END if (pInputStream->usedBits < ...) */
+
+    else
+    {
+        status = FIND_ADTS_ERROR;
+    }
+
+    *(pSyncword) = adts_header;
+
+    return (status);
+
+} /* find_adts_syncword() */
diff --git a/media/libstagefright/codecs/aacdec/find_adts_syncword.h b/media/libstagefright/codecs/aacdec/find_adts_syncword.h
new file mode 100644
index 0000000..d147bc5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/find_adts_syncword.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/find_adts_syncword.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This function includes the function declaration for find_adts_syncword()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef FIND_ADTS_SYNCWORD_H
+#define FIND_ADTS_SYNCWORD_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_bits.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
+----------------------------------------------------------------------------*/
+Int find_adts_syncword(
+    UInt32 *pSyncword,
+    BITS   *pInputStream,
+    Int     syncword_length,
+    UInt32  syncword_mask);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.cpp b/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.cpp
new file mode 100644
index 0000000..b85c7df
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.cpp
@@ -0,0 +1,284 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/fwd_long_complex_rot.c
+ Funtions: fwd_long_complex_rot
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Date: 10/18/2002
+ Description:
+            (1) Change the input arguments, no shifts information from
+                long_fft_rx4 is passed, only a single max is passed.
+            (2) Eliminate search for max, a fixed shift has replaced the
+                search for max with minimal loss of precision.
+            (3) Eliminated unused variables
+
+ Date: 10/28/2002
+ Description:
+            (1) Added comments per code review
+            (2) Eliminated hardly used condition on if-else (exp==0)
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    Data_in   = Input vector (sized for long windows
+                TWICE_FWD_LONG_CX_ROT_LENGTH), with time domain samples
+                type Int32 *
+
+    Data_out  = Output vector with a post-rotation by exp(-j(2pi/N)(k+1/8)),
+                (sized for long windows TWICE_FWD_LONG_CX_ROT_LENGTH)
+                type Int32 *
+
+    max       = Input, carries the maximum value of the input vector
+                "Data_in"
+                type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exp = shift factor to reflect signal scaling
+
+ Pointers and Buffers Modified:
+    Results are return in "Data_out"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    fwd_long_complex_rot() performs the pre complex rotation for the MDCT
+    for the case of long windows. It also performs digit reverse ordering of
+    the first and second halves of the input vector "Data_in", as well as
+    reordering of the two half vectors (following radix-2 decomposition)
+    Word normalization is also done to ensure 16 by 16 bit multiplications.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    fwd_long_complex_rot() should execute a pre-rotation by
+    exp(-j(2pi/N)(k+1/8)), digit reverse ordering and normalization
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ 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 "fwd_long_complex_rot.h"
+#include "digit_reversal_tables.h"
+#include "imdct_fxp.h"
+#include "pv_normalize.h"
+
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+Int fwd_long_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max)
+{
+    Int     i;
+    const   Int32 *p_rotate;
+    Int32   temp_re;
+    Int32   temp_im;
+    Int32   *pData_in_ref1;
+    Int32   *pData_in_ref2;
+    Int32   exp_jw;
+    Int32   temp_re_32;
+    Int32   temp_im_32;
+
+    Int32   *pData_out_1;
+    Int32   *pData_out_2;
+    Int32   *pData_out_3;
+    Int32   *pData_out_4;
+
+    Int32 *pData_in_1;
+    Int32 *pData_in_2;
+
+    Int     exp;
+
+    p_rotate       =  exp_rotation_N_2048;
+
+    pData_in_ref1  =  Data_in;
+    pData_in_ref2  = &Data_in[TWICE_FWD_LONG_CX_ROT_LENGTH];
+
+    pData_out_1 = Data_out;
+    pData_out_2 = &Data_out[LONG_WINDOW_LENGTH_m_1];
+    pData_out_3 = &Data_out[LONG_WINDOW_LENGTH];
+    pData_out_4 = &Data_out[TWICE_LONG_WINDOW_LENGTH_m_1];
+
+    /*
+     *  Data_out
+     *                                   >>>>                   <<<<
+     *                                pData_out_3             pData_out_4
+     *      |             |             |             |             |
+     * pData_out_1               pData_out_2
+     *      >>>>                     <<<<
+     */
+
+
+    exp = 16 - pv_normalize(max);
+
+    if (exp < 0)
+    {
+        exp = 0;
+    }
+
+    /*
+     *  Apply  A/2^(diff) + B
+     */
+
+
+    pData_in_1 = pData_in_ref1;
+    pData_in_2 = pData_in_ref2;
+
+    for (i = FWD_LONG_CX_ROT_LENGTH; i != 0; i--)
+    {
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+
+        exp_jw = *p_rotate++;
+
+        /*
+         *  Use auxiliary variables to avoid double accesses to memory.
+         *  Data in is scaled to use only lower 16 bits.
+         */
+
+        temp_re =  *(pData_in_1++) >> exp;
+        temp_im =  *(pData_in_1++) >> exp;
+
+        /*
+         *   Pre-rotation
+         */
+
+        temp_re_32  = (cmplx_mul32_by_16(temp_re,   temp_im,  exp_jw));
+        temp_im_32  = (cmplx_mul32_by_16(temp_im,  -temp_re,  exp_jw));
+
+        *(pData_out_1++) = - temp_re_32;
+        *(pData_out_2--) =   temp_im_32;
+        *(pData_out_3++) = - temp_im_32;
+        *(pData_out_4--) =   temp_re_32;
+
+        /*
+         *   Pointer increment to jump over imag (1 & 4) or real parts
+         *   (2 & 3)
+         */
+        pData_out_1++;
+        pData_out_2--;
+        pData_out_3++;
+        pData_out_4--;
+
+        /*
+         *   Repeat procedure for odd index at the output
+         */
+
+        exp_jw = *p_rotate++;
+
+        temp_re =  *(pData_in_2++) >> exp;
+        temp_im =  *(pData_in_2++) >> exp;
+
+        temp_re_32  = (cmplx_mul32_by_16(temp_re,   temp_im,  exp_jw));
+        temp_im_32  = (cmplx_mul32_by_16(temp_im,  -temp_re,  exp_jw));
+
+        *(pData_out_1++) = - temp_re_32;
+        *(pData_out_2--) =   temp_im_32;
+        *(pData_out_3++) = - temp_im_32;
+        *(pData_out_4--) =   temp_re_32;
+
+        pData_out_1++;
+        pData_out_2--;
+        pData_out_3++;
+        pData_out_4--;
+
+    }
+
+    return (exp + 1);
+}
diff --git a/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.h b/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.h
new file mode 100644
index 0000000..5978906
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fwd_long_complex_rot.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/fwd_long_complex_rot.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions fwd_long_complex_rot
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef FWD_LONG_COMPLEX_ROT_H
+#define FWD_LONG_COMPLEX_ROT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define FWD_LONG_CX_ROT_LENGTH              256
+#define TWICE_FWD_LONG_CX_ROT_LENGTH        (FWD_LONG_CX_ROT_LENGTH<<1)
+#define LONG_WINDOW_LENGTH                  1024
+#define LONG_WINDOW_LENGTH_m_1              (LONG_WINDOW_LENGTH - 1)
+#define TWICE_LONG_WINDOW_LENGTH_m_1        ((LONG_WINDOW_LENGTH<<1) - 1)
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+
+Int fwd_long_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* FWD_LONG_COMPLEX_ROT_H */
diff --git a/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.cpp b/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.cpp
new file mode 100644
index 0000000..964f766
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.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.
+ * -------------------------------------------------------------------
+ */
+/*
+ Pathname: ./src/fwd_short_complex_rot.c
+ Funtions:  fwd_short_complex_rot
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Date: 10/18/2002
+ Description:
+            (1) Change the input argument, only a single max is passed.
+            (2) Eliminate search for max, a fixed shift has replaced the
+                search for max with minimal loss of precision.
+            (3) Eliminated unused variables
+
+ Date: 10/28/2002
+ Description:
+            (1) Added comments per code review
+            (2) Eliminated hardly used condition on if-else (exp==0)
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    Data_in   = Input vector (sized for short windows
+                2*FWD_SHORT_CX_ROT_LENGTH elements), with freq. domain samples
+                type Int32 *
+
+    Data_out  = Output vector with a post-rotation by exp(-j(2pi/N)(k+1/8)),
+                (sized for short windows 2*FWD_SHORT_CX_ROT_LENGTH)
+                type Int32 *
+
+    max       = Input, carries the maximum value of the input vector
+                "Data_in"
+                type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exp = shift factor to reflect signal scaling
+
+ Pointers and Buffers Modified:
+    Results are return in "Data_out"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    fwd_short_complex_rot() performs the complex rotation for the MDCT
+    for the case of short windows. It performs digit reverse ordering as well
+    word normalization to ensure 16 by 16 bit multiplications.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    fwd_short_complex_rot() should execute a pre-rotation by
+    exp(-j(2pi/N)(k+1/8)), digit reverse ordering and word normalization
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ 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 "fwd_short_complex_rot.h"
+#include "digit_reversal_tables.h"
+#include "imdct_fxp.h"
+#include "pv_normalize.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
+----------------------------------------------------------------------------*/
+
+Int fwd_short_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max)
+
+{
+    Int     i;
+    Int16     I;
+    const   Int16 *pTable;
+    const   Int32 *p_rotate;
+
+    Int32   *pData_in_1;
+    Int     exp;
+    Int32   temp_re;
+    Int32   temp_im;
+
+    Int32   cos_n;
+    Int32   sin_n;
+    Int32   temp_re_32;
+    Int32   temp_im_32;
+
+    Int32   *pData_in_ref;
+
+    Int32   *pData_out_1;
+    Int32   *pData_out_2;
+    Int32   *pData_out_3;
+    Int32   *pData_out_4;
+
+    pTable    =  digit_reverse_64;
+    p_rotate  =  exp_rotation_N_256;
+
+    pData_in_ref  =  Data_in;
+
+    exp = 16 - pv_normalize(max);
+
+    if (exp < 0)
+    {
+        exp = 0;
+    }
+
+    pData_out_1 = Data_out;
+    pData_out_2 = &Data_out[TWICE_FWD_SHORT_CX_ROT_LENGTH_m_1];
+    pData_out_3 = &Data_out[TWICE_FWD_SHORT_CX_ROT_LENGTH];
+    pData_out_4 = &Data_out[FOUR_FWD_SHORT_CX_ROT_LENGTH_m_1];
+
+    /*
+     *  Data_out
+     *                                   >>>>                   <<<<
+     *                                pData_out_3             pData_out_4
+     *      |             |             |             |             |
+     * pData_out_1               pData_out_2
+     *      >>>>                     <<<<
+     */
+
+
+    for (i = FWD_SHORT_CX_ROT_LENGTH; i != 0; i--)
+    {
+        /*
+         *   Perform digit reversal by accessing index I from table
+         */
+
+        I = *pTable++;
+        pData_in_1 = pData_in_ref + I;
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+
+        sin_n = *p_rotate++;
+        cos_n = sin_n >> 16;
+        sin_n = sin_n & 0xFFFF;
+
+        /*
+         *  Use auxiliary variables to avoid double accesses to memory.
+         *  Data in is scaled to use only lower 16 bits.
+         */
+
+        temp_re =  *(pData_in_1++) >> exp;
+        temp_im =  *(pData_in_1) >> exp;
+
+        /*
+         *   Pre-rotation
+         */
+
+        temp_re_32 = (temp_re * cos_n + temp_im * sin_n) >> 16;
+        temp_im_32 = (temp_im * cos_n - temp_re * sin_n) >> 16;
+
+        *(pData_out_1++) = - temp_re_32;
+        *(pData_out_2--) =   temp_im_32;
+        *(pData_out_3++) = - temp_im_32;
+        *(pData_out_4--) =   temp_re_32;
+
+        /*
+         *   Pointer increment to jump over imag (1 & 4) or real parts
+         *   (2 & 3)
+         */
+
+        pData_out_1++;
+        pData_out_2--;
+        pData_out_3++;
+        pData_out_4--;
+
+    } /* for(i) */
+
+    return (exp);
+}
diff --git a/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.h b/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.h
new file mode 100644
index 0000000..3d1e1f1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fwd_short_complex_rot.h
@@ -0,0 +1,92 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: .fwd_short_complex_rot.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions fwd_short_complex_rot
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef FWD_SHORT_COMPLEX_ROT_H
+#define FWD_SHORT_COMPLEX_ROT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define FWD_SHORT_CX_ROT_LENGTH             64
+#define TWICE_FWD_SHORT_CX_ROT_LENGTH       (FWD_SHORT_CX_ROT_LENGTH<<1)
+#define TWICE_FWD_SHORT_CX_ROT_LENGTH_m_1   ((FWD_SHORT_CX_ROT_LENGTH<<1) - 1)
+#define FOUR_FWD_SHORT_CX_ROT_LENGTH_m_1    ((FWD_SHORT_CX_ROT_LENGTH<<2) - 1)
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int fwd_short_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* FWD_SHORT_COMPLEX_ROT_H */
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32.h b/media/libstagefright/codecs/aacdec/fxp_mul32.h
new file mode 100644
index 0000000..230cef5e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32.h
@@ -0,0 +1,72 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/fxp_mul32.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32
+#define FXP_MUL32
+
+#if   defined(PV_ARM_V5)
+
+#include "fxp_mul32_arm_v5.h"
+
+#elif defined(PV_ARM_V4)
+
+#include "fxp_mul32_arm_v4.h"
+
+#elif defined(PV_ARM_MSC_EVC_V4)
+
+#include "fxp_mul32_c_msc_evc.h"
+
+#elif defined(PV_ARM_MSC_EVC_V5)
+
+#include "fxp_mul32_c_msc_evc_armv5.h"
+
+#elif defined(PV_ARM_GCC_V5)
+
+#include "fxp_mul32_arm_gcc.h"
+
+#elif defined(PV_ARM_GCC_V4)
+
+#include "fxp_mul32_arm_v4_gcc.h"
+
+#else
+
+#ifndef C_EQUIVALENT
+#define C_EQUIVALENT
+#endif
+
+#include "fxp_mul32_c_equivalent.h"
+
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_arm_gcc.h b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_gcc.h
new file mode 100644
index 0000000..dc58976
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_gcc.h
@@ -0,0 +1,547 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/fxp_mul32_arm_gcc.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_ARM_GCC
+#define FXP_MUL32_ARM_GCC
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+
+#if (defined (PV_ARM_GCC_V4) || defined(PV_ARM_GCC_V5)) /* ARM GNU COMPILER  */
+
+
+
+#define preload_cache( a)
+
+
+    static inline Int32 shft_lft_1(Int32 y)
+    {
+        register Int32 x;
+        register Int32 ra = y;
+
+
+        asm volatile(
+            "qadd %0, %1, %1\n\t"
+    : "=&r*i"(x)
+                    : "r"(ra));
+
+        return (x);
+    }
+
+    static inline Int32 fxp_mul_16_by_16bb(Int32 L_var1, const Int32 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_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+
+    static inline Int32 fxp_mul_16_by_16tb(Int32 L_var1, const Int32 L_var2)
+{
+
+        register Int32 tmp;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "smultb %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp);
+    }
+
+    static inline Int32 fxp_mul_16_by_16bt(Int32 L_var1, const Int32 L_var2)
+{
+
+        register Int32 tmp;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "smulbt %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp);
+    }
+
+    static inline Int32 fxp_mul_16_by_16tt(Int32 L_var1, const Int32 L_var2)
+{
+
+        register Int32 tmp;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "smultt %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp);
+    }
+
+    static inline Int32 fxp_mac_16_by_16(const Int32 L_var1, const Int32 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_mac_16_by_16_bb(const Int32 L_var1, const Int32 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_mac_16_by_16_bt(const Int32 L_var1, const Int32 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(
+            "smlabt %0, %1, %2, %3"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (tmp);
+    }
+
+
+
+    static inline Int32 cmplx_mul32_by_16(Int32 x, const Int32 y, Int32 exp_jw)
+{
+        register Int32 cx_sum;
+        register Int32 rx = (Int32)x;
+        register Int32 ry = (Int32)y;
+        register Int32 rexp = (Int32)exp_jw;
+        asm volatile(
+            "smulwt %0, %1, %3\n\t"
+            "smlawb %0, %2, %3, %0"
+    : "=&r*i"(cx_sum)
+                    : "r"(rx),
+                    "r"(ry),
+                    "r"(rexp));
+
+        return (cx_sum);
+    }
+
+
+    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)
+
+
+    static inline Int32 fxp_mul32_by_16t(Int32 L_var1, const Int32 L_var2)
+{
+
+        register Int32 tmp;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "smulwt %0, %1, %2"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp);
+    }
+
+
+
+    static inline Int32 fxp_mac32_by_16(const Int32 L_var1, const Int32 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(
+            "smlawb %0, %1, %2, %3"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (tmp);
+    }
+
+
+    __inline  int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+{
+        sum += (int64)L_var1 * L_var2;
+        return (sum);
+    }
+
+
+
+
+    static inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %4, %4, %0, asl #2\n\t"
+                     "add %0, %4, %1, lsr #30"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
+{
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %0, %0, %4"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_sub;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "sub %0, %4, %0"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q31(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile(
+            "smull %1, %0, %2, %3"
+    : "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #2\n\t"
+                     "orr   %0, %0, %1, lsr #30"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add   %4, %4, %0, lsl #3\n\t"
+                     "add   %0, %4, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_sub;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "sub   %4, %4, %0, lsl #3\n\t"
+                     "sub   %0, %4, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+    static inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #3\n\t"
+                     "orr   %0, %0, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #4\n\t"
+                     "orr   %0, %0, %1, lsr #28"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+    static inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #5\n\t"
+                     "orr   %0, %0, %1, lsr #27"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #6\n\t"
+                     "orr   %0, %0, %1, lsr #26"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #12\n\t"
+                     "orr   %0, %0, %1, lsr #20"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #17\n\t"
+                     "orr   %0, %0, %1, lsr #15"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2,  %3\n\t"
+                     "mov   %0, %0, lsl #18\n\t"
+                     "orr   %0, %0, %1, lsr #14"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4.h b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4.h
new file mode 100644
index 0000000..6869c54
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4.h
@@ -0,0 +1,429 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: fxp_mul32_c_equivalent.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_ARM_V4
+#define FXP_MUL32_ARM_V4
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+
+#if defined(PV_ARM_V4)
+
+#define preload_cache( a)
+
+
+    __inline  Int32 shft_lft_1(Int32 L_var1)
+    {
+        Int32 x;
+        Int32 z = 1; /* rvct compiler problem */
+        __asm
+        {
+            mov x, L_var1, asl 1
+            teq L_var1, x, asr z
+            eorne  x, INT32_MAX, L_var1, asr #31
+        }
+
+        return(x);
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16bb(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+
+            mov L_var2, L_var2, asl #16
+            mov L_var2, L_var2, asr #16
+            mov L_var1, L_var1, asl #16
+            mov L_var1, L_var1, asr #16
+
+
+            mul L_var1, L_var2, L_var1
+        }
+
+        return L_var1;
+
+    }
+
+
+#define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+
+    __inline  Int32 fxp_mul_16_by_16tb(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            mov L_var2, L_var2, asl #16
+            mov L_var2, L_var2, asr #16
+            mov L_var1, L_var1, asr #16
+
+            mul L_var1, L_var2, L_var1
+        }
+        return L_var1;
+    }
+
+    __inline  Int32 fxp_mul_16_by_16bt(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            mov L_var2, L_var2, asr #16
+            mov L_var1, L_var1, asl #16
+            mov L_var1, L_var1, asr #16
+
+            mul L_var1, L_var2, L_var1
+        }
+
+        return L_var1;
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16tt(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            mov L_var2, L_var2, asr #16
+            mov L_var1, L_var1, asr #16
+
+            mul L_var1, L_var2, L_var1
+        }
+
+        return L_var1;
+
+    }
+
+    __inline  Int32 fxp_mac_16_by_16(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            mla L_add, L_var1, L_var2, L_add
+        }
+        return (L_add);
+    }
+
+
+    __inline  Int32 fxp_mac_16_by_16_bb(const Int32 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            mov L_var2, L_var2, asl #16
+            mov L_var2, L_var2, asr #16
+            mla L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_mac_16_by_16_bt(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            mov L_var2, L_var2, asr #16
+            mla L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+
+    __inline  Int32 cmplx_mul32_by_16(Int32 x, const Int32 y, Int32 exp_jw)
+    {
+
+        Int32 result64_hi;
+        Int32 rTmp0;
+        Int32 iTmp0;
+        __asm
+        {
+            mov rTmp0, exp_jw, asr #16
+            mov rTmp0, rTmp0, asl #16
+            mov iTmp0, exp_jw, asl #16
+            smull rTmp0, result64_hi, x, rTmp0
+            smlal iTmp0, result64_hi, y, iTmp0
+        }
+
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mul32_by_16(Int32 L_var1, Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            mov L_var2, L_var2, asl #16
+            smull L_var1, result64_hi, L_var2, L_var1
+        }
+        return (result64_hi);
+    }
+
+
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+
+
+    __inline  Int32 fxp_mul32_by_16t(Int32 L_var1, Int32 L_var2)
+    {
+
+        Int32 result64_hi;
+        __asm
+        {
+            mov L_var2, L_var2, asr #16
+            mov L_var2, L_var2, asl #16
+            smull L_var1, result64_hi, L_var2, L_var1
+        }
+        return (result64_hi);
+
+    }
+
+    __inline  Int32 fxp_mac32_by_16(Int32 L_var1, Int32 L_var2, Int32 L_add)
+    {
+
+        __asm
+        {
+            mov L_var2, L_var2, asl #16
+            smlal L_var1, L_add, L_var2, L_var1
+        }
+
+        return (L_add);
+    }
+
+
+    __inline  int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+    {
+        uint32 b = (UInt32)(sum);
+        int32 c = Int32(sum >> 32);
+        __asm
+        {
+            smlal b, c, L_var1, L_var2
+        }
+        return (((int64(c)) << 32) | b);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q31(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            smull L_var1, result64_hi, L_var2, L_var1
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mac32_Q31(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
+    {
+        __asm
+        {
+            smlal L_var1, L_add, L_var2, L_var1
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_msu32_Q31(Int32 L_sub,  Int32 L_var1, const Int32 L_var2)
+    {
+        __asm
+        {
+            rsb   L_var1, L_var1, #0
+            smlal L_var1, L_sub, L_var2, L_var1
+        }
+        return L_sub;
+    }
+
+
+    __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #2
+            orr  result64_hi, result64_hi, result64_lo, lsr #30
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            add L_add, L_add, result64_hi, asl  #2
+            add L_add, L_add, result64_lo, lsr  #30
+        }
+        return (L_add);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q29(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #3
+            orr  result64_hi, result64_hi, result64_lo, lsr #29
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mac32_Q29(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            add L_add, L_add, result64_hi, asl  #3
+            add L_add, L_add, result64_lo, lsr  #29
+        }
+        return (L_add);
+    }
+
+    __inline  Int32 fxp_msu32_Q29(const Int32 L_var1, const Int32 L_var2, Int32 L_sub)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            sub L_sub, L_sub, result64_hi, asl  #3
+            sub L_sub, L_sub, result64_lo, lsr  #29
+        }
+        return (L_sub);
+    }
+
+    __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #4
+            orr  result64_hi, result64_hi, result64_lo, lsr #28
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #5
+            orr  result64_hi, result64_hi, result64_lo, lsr #27
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q26(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #6
+            orr  result64_hi, result64_hi, result64_lo, lsr #26
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q20(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #12
+            orr  result64_hi, result64_hi, result64_lo, lsr #20
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q15(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #17
+            orr  result64_hi, result64_hi, result64_lo, lsr #15
+        }
+        return (result64_hi);
+    }
+
+
+
+
+    __inline  Int32 fxp_mul32_Q14(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #18
+            orr  result64_hi, result64_hi, result64_lo, lsr #14
+        }
+        return (result64_hi);
+    }
+
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4_gcc.h b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4_gcc.h
new file mode 100755
index 0000000..f4ab2f7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v4_gcc.h
@@ -0,0 +1,630 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: fxp_mul32_arm_v4_gcc.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+
+
+#ifndef FXP_MUL32_V4_ARM_GCC
+#define FXP_MUL32_V4_ARM_GCC
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+
+#if defined (_ARM_V4_GCC) /* ARM_V4 GNU COMPILER  */
+
+
+#define preload_cache( a)
+
+
+    static inline  Int32 shft_lft_1(Int32 L_var1)
+    {
+        Int32 x;
+        register Int32 ra = L_var1;
+        Int32 z = INT32_MAX;
+
+        asm volatile(
+            "mov %0, %1, asl #1\n\t"
+            "teq %1, %0, asr #1\n\t"
+            "eorne   %0, %2, %1, asr #31"
+    : "=&r*i"(x)
+                    : "r"(ra),
+                    "r"(z));
+
+        return(x);
+    }
+
+    static inline Int32 fxp_mul_16_by_16bb(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %3, asl #16\n\t"
+            "mov %0, %0, asr #16\n\t"
+            "mov %1, %2, asl #16\n\t"
+            "mov %1, %1, asr #16\n\t"
+            "mul %0, %1, %0"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp1);
+
+    }
+
+#define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+
+    static inline Int32 fxp_mul_16_by_16tb(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %3, asl #16\n\t"
+            "mov %0, %0, asr #16\n\t"
+            "mov %1, %2, asr #16\n\t"
+            "mul %0, %1, %0"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp1);
+
+    }
+
+
+    static inline Int32 fxp_mul_16_by_16bt(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %3, asr #16\n\t"
+            "mov %1, %2, asl #16\n\t"
+            "mov %1, %1, asr #16\n\t"
+            "mul %0, %1, %0"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp1);
+
+    }
+
+
+    static inline Int32 fxp_mul_16_by_16tt(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %3, asr #16\n\t"
+            "mov %1, %2, asr #16\n\t"
+            "mul %0, %1, %0"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (tmp1);
+
+    }
+
+
+
+    static inline  Int32 fxp_mac_16_by_16(Int16 L_var1,  Int16 L_var2, Int32 L_add)
+{
+
+        Int32 tmp;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile(
+            "mla %0, %1, %2, %3"
+    : "=&r*i"(tmp)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (tmp);
+    }
+
+
+
+    static inline Int32 fxp_mac_16_by_16_bb(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile(
+            "mov %0, %3, asl #16\n\t"
+            "mov %0, %0, asr #16\n\t"
+            "mla %1, %0, %2, %4"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (tmp2);
+    }
+
+
+
+    static inline  Int32 fxp_mac_16_by_16_bt(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+{
+
+        Int32 tmp1;
+        Int32 tmp2;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile(
+            "mov %0, %3, asr #16\n\t"
+            "mla %1, %0, %2, %4"
+    : "=&r*i"(tmp1),
+            "=&r*i"(tmp2)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (tmp2);
+
+    }
+
+
+
+    static inline  Int32 cmplx_mul32_by_16(Int32 x, Int32 y, Int32 exp_jw)
+{
+
+        Int32 rTmp0;
+        Int32 iTmp0;
+        Int32 result64_hi;
+        register Int32 ra = (Int32)x;
+        register Int32 rb = (Int32)y;
+        register Int32 rc = (Int32)exp_jw;
+
+
+
+        asm volatile(
+            "mov %0, %5, asr #16\n\t"
+            "mov %1, %5, asl #16\n\t"
+            "mov %0, %0, asl #16\n\t"
+    : "=&r*i"(rTmp0),
+            "=&r*i"(iTmp0),
+            "=&r*i"(result64_hi)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+
+        asm volatile(
+            "smull %0, %2, %3, %0\n\t"
+            "smlal %1, %2, %4, %1"
+    : "=&r*i"(rTmp0),
+            "=&r*i"(iTmp0),
+            "=&r*i"(result64_hi)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (result64_hi);
+
+
+    }
+
+
+    static inline  Int32 fxp_mul32_by_16(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 rTmp0;
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %4, asl #16\n\t"
+            "smull %2, %1, %0, %3"
+    : "=&r*i"(rTmp0),
+            "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+
+
+    static inline  Int32 fxp_mul32_by_16t(Int32 L_var1, Int32 L_var2)
+{
+
+        Int32 rTmp0;
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+
+        asm volatile(
+            "mov %0, %4, asr #16\n\t"
+            "mov %0, %0, asl #16\n\t"
+            "smull %2, %1, %0, %3"
+    : "=&r*i"(rTmp0),
+            "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline  Int32 fxp_mac32_by_16(Int32 L_var1, Int32 L_var2, Int32 L_add)
+{
+
+        Int32 rTmp0;
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)L_var1;
+        register Int32 rb = (Int32)L_var2;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile(
+            "mov %0, %4, asl #16\n\t"
+            "mov %1, %5\n\t"
+            "smlal %2, %1, %0, %3"
+    : "=&r*i"(rTmp0),
+            "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb),
+                    "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+    static inline int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+{
+        sum += (int64)L_var1 * L_var2;
+        return (sum);
+    }
+
+
+    static inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %4, %4, %0, asl #2\n\t"
+                     "add %0, %4, %1, lsr #30"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
+{
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %0, %0, %4"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_sub;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "sub %0, %4, %0"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q31(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile(
+            "smull %1, %0, %2, %3"
+    : "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #2\n\t"
+                     "orr   %0, %0, %1, lsr #30"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add   %4, %4, %0, lsl #3\n\t"
+                     "add   %0, %4, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        register Int32 rc = (Int32)L_sub;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "sub   %4, %4, %0, lsl #3\n\t"
+                     "sub   %0, %4, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+    static inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #3\n\t"
+                     "orr   %0, %0, %1, lsr #29"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #4\n\t"
+                     "orr   %0, %0, %1, lsr #28"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+    static inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #5\n\t"
+                     "orr   %0, %0, %1, lsr #27"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #6\n\t"
+                     "orr   %0, %0, %1, lsr #26"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #12\n\t"
+                     "orr   %0, %0, %1, lsr #20"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov %0, %0, lsl #17\n\t"
+                     "orr   %0, %0, %1, lsr #15"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
+{
+        Int32 result64_hi;
+        Int32 result64_lo;
+        register Int32 ra = (Int32)a;
+        register Int32 rb = (Int32)b;
+        asm volatile("smull %1, %0, %2,  %3\n\t"
+                     "mov   %0, %0, lsl #18\n\t"
+                     "orr   %0, %0, %1, lsr #14"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+
+        return (result64_hi);
+    }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32_V4_ARM_GCC  */
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v5.h b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v5.h
new file mode 100644
index 0000000..8ab108f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_arm_v5.h
@@ -0,0 +1,450 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/fxp_mul32_arm_v5.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_ARM_V5
+#define FXP_MUL32_ARM_V5
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "pv_audio_type_defs.h"
+
+
+#if defined(PV_ARM_V5)
+
+//#undef EXTENDED_ASM
+#define EXTENDED_ASM
+#define _ARM_V5_
+
+
+    __inline  Int32 shft_lft_1(Int32 L_var1)
+    {
+        __asm
+        {
+            qadd L_var1, L_var1, L_var1
+        }
+
+        return L_var1;
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            smulbb L_var1, L_var1, L_var2
+        }
+        return L_var1;
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16bb(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            smulbb L_var1, L_var1, L_var2
+        }
+        return L_var1;
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16tb(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            smultb L_var1, L_var1, L_var2
+        }
+        return L_var1;
+    }
+
+    __inline  Int32 fxp_mul_16_by_16tt(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            smultt L_var1, L_var1, L_var2
+        }
+        return L_var1;
+    }
+
+    __inline  Int32 fxp_mul_16_by_16bt(Int32 L_var1,  Int32 L_var2)
+    {
+        __asm
+        {
+            smulbt L_var1, L_var1, L_var2
+        }
+        return L_var1;
+    }
+
+
+
+    __inline  Int32 fxp_mac_16_by_16(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlabb L_add, L_var1, L_var2, L_add
+        }
+        return (L_add);
+    }
+
+    __inline  Int32 fxp_mac_16_by_16_bb(const Int32 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlabb L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_mac_16_by_16_bt(const Int32 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlabt L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+
+    __inline  Int32 fxp_mac_16_by_16_tb(const Int32 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlatb L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_mac_16_by_16_tt(const Int32 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlatt L_add, L_var1, L_var2, L_add
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_mac32_by_16(Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        __asm
+        {
+            smlawb L_add, L_var1, L_var2, L_add
+        }
+        return (L_add);
+    }
+
+
+    __inline  int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+    {
+        uint32 b = (UInt32)(sum);
+        int32 c = Int32(sum >> 32);
+        __asm
+        {
+            smlal b, c, L_var1, L_var2
+        }
+        return (((int64(c)) << 32) | b);
+    }
+
+
+    __inline  Int32 fxp_mac32_Q31(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
+    {
+        __asm
+        {
+            smlal L_var1, L_add, L_var2, L_var1
+        }
+        return L_add;
+    }
+
+    __inline  Int32 fxp_msu32_Q31(Int32 L_sub,  Int32 L_var1, const Int32 L_var2)
+    {
+        __asm
+        {
+            rsb   L_var1, L_var1, #0
+            smlal L_var1, L_sub, L_var2, L_var1
+        }
+        return L_sub;
+    }
+
+    __inline  Int32 fxp_mul32_Q31(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            smull L_var1, result64_hi, L_var2, L_var1
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #2
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #30
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #30
+#endif
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            add L_add, L_add, result64_hi, asl  #2
+            add L_add, L_add, result64_lo, lsr  #30
+        }
+        return (L_add);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q29(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #3
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #29
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #29
+#endif
+        }
+        return (result64_hi);
+    }
+
+
+
+    __inline  Int32 fxp_mac32_Q29(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            add L_add, L_add, result64_hi, asl  #3
+            add L_add, L_add, result64_lo, lsr  #29
+        }
+        return (L_add);
+    }
+
+
+    __inline  Int32 fxp_msu32_Q29(const Int32 L_var1, const Int32 L_var2, Int32 L_sub)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            sub L_sub, L_sub, result64_hi, asl  #3
+            sub L_sub, L_sub, result64_lo, lsr  #29
+        }
+        return (L_sub);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #4
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #28
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #28
+#endif
+
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #5
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #27
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #27
+#endif
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q26(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #6
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #26
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #26
+#endif
+
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q20(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #12
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #20
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #20
+#endif
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_by_16(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            smulwb result64_hi, L_var1, L_var2
+        }
+        return (result64_hi);
+    }
+
+#define fxp_mul32_by_16b( a, b)         fxp_mul32_by_16(a, b)
+
+    __inline  Int32 fxp_mul32_by_16t(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            smulwt result64_hi, L_var1, L_var2
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q15(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #17
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #15
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #15
+#endif
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 cmplx_mul32_by_16(Int32 L_var1, const Int32 L_var2, const Int32 cmplx)
+    {
+        Int32 result64_hi;
+
+        __asm
+        {
+            smulwt result64_hi, L_var1, cmplx
+            smlawb result64_hi, L_var2, cmplx, result64_hi
+        }
+        return (result64_hi);
+
+    }
+
+    __inline  Int32 fxp_mul32_Q14(const Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov result64_hi, result64_hi, asl  #18
+#ifdef EXTENDED_ASM
+            mov result64_lo, result64_lo, lsr  #14
+            orr  result64_hi, result64_lo, result64_hi
+#else
+            orr  result64_hi, result64_hi, result64_lo, lsr #14
+#endif
+        }
+        return (result64_hi);
+    }
+
+
+#define preload_cache( a)
+
+
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_c_equivalent.h b/media/libstagefright/codecs/aacdec/fxp_mul32_c_equivalent.h
new file mode 100644
index 0000000..5bcbe53
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_c_equivalent.h
@@ -0,0 +1,285 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./c/include/fxp_mul32_c_equivalent.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_C_EQUIVALENT
+#define FXP_MUL32_C_EQUIVALENT
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+
+#if defined(C_EQUIVALENT)
+
+#define preload_cache( a)
+
+    __inline  Int32 shft_lft_1(Int32 L_var1)
+    {
+        if (((L_var1 << 1) >> 1) == L_var1)
+            L_var1 <<= 1;
+        else
+            L_var1 = ((L_var1 >> 31) ^ INT32_MAX);
+
+        return (L_var1);
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16bb(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+        L_var1 = (L_var1 << 16) >> 16;
+
+        L_var1 *= L_var2;
+
+        return L_var1;
+
+    }
+
+
+#define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+
+    __inline  Int32 fxp_mul_16_by_16tb(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+        L_var1 =  L_var1 >> 16;
+
+        L_var1 *= L_var2;
+
+        return L_var1;
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16bt(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = L_var2 >> 16;
+        L_var1 = (L_var1 << 16) >> 16;
+
+        L_var1 *= L_var2;
+
+        return L_var1;
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16tt(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = L_var2 >> 16;
+        L_var1 = L_var1 >> 16;
+
+        L_var1 *= L_var2;
+
+        return L_var1;
+
+    }
+
+    __inline  Int32 fxp_mac_16_by_16(Int16 L_var1,  Int16 L_var2, Int32 L_add)
+    {
+
+        L_add += L_var1 * L_var2;
+
+        return L_add;
+
+    }
+
+
+
+
+
+    __inline  Int32 fxp_mac_16_by_16_bb(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+
+        L_add += L_var1 * L_var2;
+
+        return L_add;
+
+    }
+
+
+    __inline  Int32 fxp_mac_16_by_16_bt(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        L_var2 = L_var2 >> 16;
+
+        L_add += L_var1 * L_var2;
+
+        return L_add;
+
+    }
+
+
+
+
+
+    __inline  Int32 cmplx_mul32_by_16(Int32 x, const Int32 y, Int32 exp_jw)
+    {
+        Int32  rTmp0 = (Int16)(exp_jw >> 16);
+        Int32  iTmp0 = exp_jw;
+        Int32  z;
+
+        z  = (Int32)(((int64_t)x * (rTmp0 << 16)) >> 32);
+        z += (Int32)(((int64_t)y * (iTmp0 << 16)) >> 32);
+
+        return (z);
+    }
+
+
+    __inline  Int32 fxp_mul32_by_16(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32  z;
+
+        z = (Int32)(((int64_t) L_var1 * (L_var2 << 16)) >> 32);
+        return(z);
+    }
+
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+
+    __inline  Int32 fxp_mul32_by_16t(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32  rTmp0 = (Int16)(L_var2 >> 16);
+        Int32  z;
+
+        z = (Int32)(((int64_t) L_var1 * (rTmp0 << 16)) >> 32);
+
+        return(z);
+    }
+
+
+    __inline  Int32 fxp_mac32_by_16(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32  rTmp0 = L_var2 << 16;
+
+        L_add += (Int32)(((int64_t) L_var1 * rTmp0) >> 32);
+
+        return(L_add);
+    }
+
+    __inline  int64_t fxp_mac64_Q31(int64_t sum, const Int32 L_var1, const Int32 L_var2)
+    {
+        sum += (int64_t)L_var1 * L_var2;
+        return (sum);
+    }
+
+    __inline Int32 fxp_mul32_Q31(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 32);
+    }
+
+    __inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
+    {
+        return (L_add + (Int32)(((int64_t)(a) * b) >> 32));
+    }
+
+    __inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
+    {
+        return (L_sub - (Int32)(((int64_t)(a) * b) >> 32));
+    }
+
+
+    __inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 30);
+    }
+
+    __inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64_t)(a) * b) >> 30));
+    }
+
+
+    __inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 29);
+    }
+
+    __inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64_t)(a) * b) >> 29));
+    }
+
+    __inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
+    {
+        return (L_sub - (Int32)(((int64_t)(a) * b) >> 29));
+    }
+
+
+    __inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 28);
+    }
+
+    __inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 27);
+    }
+
+    __inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 26);
+    }
+
+    __inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 20);
+    }
+
+    __inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 15);
+    }
+
+    __inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64_t)(a) * b) >> 14);
+    }
+
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc.h b/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc.h
new file mode 100644
index 0000000..64397cf
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: fxp_mul32_msc_evc.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+
+#ifndef FXP_MUL32_MSC_EVC
+#define FXP_MUL32_MSC_EVC
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+#if defined(PV_ARM_MSC_EVC_V4)
+
+#include "cmnintrin.h"
+
+#define preload_cache( a)
+
+    __inline  Int32 shft_lft_1(Int32 L_var1)
+    {
+        if (((L_var1 << 1) >> 1) == L_var1)
+            L_var1 <<= 1;
+        else
+            L_var1 = ((L_var1 >> 31) ^ INT32_MAX);
+
+        return L_var1;
+
+    }
+
+    __inline  Int32 fxp_mul_16_by_16bb(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+        L_var1 = (L_var1 << 16) >> 16;
+
+        return (L_var1*L_var2);
+
+    }
+
+#define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+    __inline  Int32 fxp_mul_16_by_16tb(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+        L_var1 =  L_var1 >> 16;
+
+        return (L_var1*L_var2);
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16bt(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = L_var2 >> 16;
+        L_var1 = (L_var1 << 16) >> 16;
+
+        return (L_var1*L_var2);
+
+    }
+
+
+    __inline  Int32 fxp_mul_16_by_16tt(Int32 L_var1,  Int32 L_var2)
+    {
+        L_var2 = L_var2 >> 16;
+        L_var1 = L_var1 >> 16;
+
+        return (L_var1*L_var2);
+
+    }
+
+    __inline  Int32 fxp_mac_16_by_16(Int16 L_var1,  Int16 L_var2, Int32 L_add)
+    {
+        return (L_add + (L_var1*L_var2));
+    }
+
+
+
+    __inline  Int32 fxp_mac_16_by_16_bb(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        L_var2 = (L_var2 << 16) >> 16;
+
+        return (L_add + (L_var1*L_var2));
+
+    }
+
+
+    __inline  Int32 fxp_mac_16_by_16_bt(Int16 L_var1,  Int32 L_var2, Int32 L_add)
+    {
+        L_var2 = L_var2 >> 16;
+
+        return (L_add + (L_var1*L_var2));
+
+    }
+
+
+    __inline  Int32 cmplx_mul32_by_16(Int32 x, const Int32 y, Int32 exp_jw)
+    {
+        Int32  rTmp0 = (exp_jw >> 16) << 16;
+        Int32  iTmp0 = exp_jw << 16;
+        Int32  z;
+
+
+        z  = _MulHigh(rTmp0, x);
+        z += _MulHigh(iTmp0, y);
+
+        return (z);
+    }
+
+
+    __inline  Int32 fxp_mul32_by_16(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32  rTmp0 = L_var2 << 16;
+
+        return(_MulHigh(rTmp0, L_var1));
+    }
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+
+    __inline  Int32 fxp_mul32_by_16t(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32  rTmp0 = (Int16)(L_var2 >> 16);
+
+        return(_MulHigh((rTmp0 << 16), L_var1));
+    }
+
+
+    __inline  Int32 fxp_mac32_by_16(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+
+        Int32  rTmp0 = (L_var2 << 16);
+
+        return(L_add + _MulHigh(rTmp0, L_var1));
+    }
+
+    __inline  int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+    {
+        sum += (int64)L_var1 * L_var2;
+        return (sum);
+    }
+
+#define fxp_mul32_Q31( a,  b)   _MulHigh( b, a)
+
+    __inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
+    {
+        return (L_add + _MulHigh(b, a));
+    }
+
+    __inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
+    {
+        return (L_sub - _MulHigh(b, a));
+    }
+
+
+    __inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 30);
+    }
+
+    __inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 30));
+    }
+
+
+    __inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 29);
+    }
+
+    __inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 29));
+    }
+
+    __inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
+    {
+        return (L_sub - (Int32)(((int64)(a) * b) >> 29));
+    }
+
+
+    __inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 28);
+    }
+
+    __inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 27);
+    }
+
+    __inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 26);
+    }
+
+    __inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 20);
+    }
+
+    __inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 15);
+    }
+
+    __inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 14);
+    }
+
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc_armv5.h b/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc_armv5.h
new file mode 100644
index 0000000..04cbf49
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_c_msc_evc_armv5.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: .fxp_mul32_msc_evc_armv5.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_MSC_EVC_ARMV5
+#define FXP_MUL32_MSC_EVC_ARMV5
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+#if defined(PV_ARM_MSC_EVC_V5)
+
+#include "armintr.h"
+#include "cmnintrin.h"
+
+#define preload_cache( a)
+
+#define shft_lft_1( L_var1)  _AddSatInt( L_var1, L_var1)
+
+#define fxp_mul_16_by_16bb( L_var1, L_var2)  _SmulLo_SW_SL( L_var1, L_var2)
+
+#define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
+
+#define fxp_mul_16_by_16tb( L_var1, L_var2)  _SmulHiLo_SW_SL( L_var1, L_var2)
+
+#define fxp_mul_16_by_16bt( L_var1, L_var2)  _SmulLoHi_SW_SL( L_var1, L_var2)
+
+#define fxp_mul_16_by_16tt( L_var1, L_var2)  _SmulHi_SW_SL( L_var1, L_var2)
+
+#define fxp_mac_16_by_16( L_var1, L_var2, L_add)  _SmulAddLo_SW_SL( L_add, L_var1, L_var2)
+
+#define fxp_mac_16_by_16_bb(a, b, c)  fxp_mac_16_by_16(  a, b, c)
+
+#define fxp_mac_16_by_16_bt( L_var1, L_var2, L_add)  _SmulAddLoHi_SW_SL( L_add, L_var1, L_var2)
+
+
+    __inline  Int32 cmplx_mul32_by_16(Int32 L_var1, const Int32 L_var2, const Int32 cmplx)
+    {
+        Int32 result64_hi;
+
+        result64_hi = _SmulWHi_SW_SL(L_var1, cmplx);
+        result64_hi = _SmulAddWLo_SW_SL(result64_hi, L_var2, cmplx);
+
+        return (result64_hi);
+    }
+
+#define fxp_mul32_by_16( L_var1, L_var2)  _SmulWLo_SW_SL( L_var1, L_var2)
+
+#define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
+
+#define fxp_mul32_by_16t( L_var1, L_var2)  _SmulWHi_SW_SL( L_var1, L_var2)
+
+#define fxp_mac32_by_16( L_var1, L_var2, L_add)  _SmulAddWLo_SW_SL( L_add, L_var1, L_var2)
+
+
+    __inline  int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
+    {
+        sum += (int64)L_var1 * L_var2;
+        return (sum);
+    }
+
+#define fxp_mul32_Q31( a,  b)   _MulHigh( b, a)
+
+
+    __inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
+    {
+        return (L_add + _MulHigh(b, a));
+    }
+
+
+    __inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
+    {
+        return (L_sub - _MulHigh(b, a));
+    }
+
+
+    __inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 30);
+    }
+
+    __inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 30));
+    }
+
+
+    __inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 29);
+    }
+
+    __inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 29));
+    }
+
+    __inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
+    {
+        return (L_sub - (Int32)(((int64)(a) * b) >> 29));
+    }
+
+
+    __inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 28);
+    }
+
+    __inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 27);
+    }
+
+    __inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 26);
+    }
+
+    __inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 20);
+    }
+
+    __inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 15);
+    }
+
+    __inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 14);
+    }
+
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/fxp_mul32_pentium.h b/media/libstagefright/codecs/aacdec/fxp_mul32_pentium.h
new file mode 100644
index 0000000..72862e7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/fxp_mul32_pentium.h
@@ -0,0 +1,55 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: .fxp_mul32_pentium.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef FXP_MUL32_PENTIUM
+#define FXP_MUL32_PENTIUM
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include "pv_audio_type_defs.h"
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  FXP_MUL32  */
+
diff --git a/media/libstagefright/codecs/aacdec/gen_rand_vector.cpp b/media/libstagefright/codecs/aacdec/gen_rand_vector.cpp
new file mode 100644
index 0000000..08ccc4a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/gen_rand_vector.cpp
@@ -0,0 +1,512 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to remove instances of pow() and sqrt(), and
+ optimized for inclusion in fixed-point version of decoder.
+
+ Description:  Modified to include comments/optimizations from code review.
+ Also, declared appropriate variables as type "const"
+
+ Description:  Adopted strategy of "one q-format per sfb" strategy, which
+ eliminated the array q-format from this function.  The q-format the
+ random vector is stored in is now returned from the function.
+
+ Description:  Completely redesigned the routine to allow a simplified
+        calculation of the adjusted noise, by eliminating the dependency
+        on the band_length. Added polynomial approximation for the
+        function 1/sqrt(power). Updated comments and pseudo-code
+
+ Description:  Modified function description, pseudocode, etc.
+
+ Description:
+    Modified casting to ensure proper operations for different platforms
+
+ Description:
+    Eliminiated access to memory for noise seed. Now a local variable is
+    used. Also unrolled loops to speed up code.
+
+ Description:
+    Modified pointer decrement to a pointer increment, to ensure proper
+    compiler behavior
+
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:    random_array[] = Array for storage of the power-scaled
+                             random values of length "band_length"
+            Int32
+
+            band_length    = Length of random_array[]
+            const Int
+
+            pSeed          = seed for random number generator
+            Int32*
+
+            power_scale    = scale factor for this particular band
+            const Int
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:   Function returns the q-format the random vector is stored in.
+
+ Pointers and Buffers Modified:
+            random_array[] = filled with random numbers scaled
+            to the correct power as defined by the input value power_scale.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function generates a vector of uniformly distributed random numbers for
+ the PNS block.  The random numbers are each scaled by a scale_factor,
+ defined in Ref(2) as
+
+ 2^(scale_factor/4)
+ ------------------
+  sqrt(N*MEAN_NRG)
+
+ where N == band_length, and MEAN_NRG is defined as...
+
+         N-1
+         ___
+     1   \
+    ---   >    x(i)^2
+     N   /__
+         i=0
+
+ And x is the unscaled vector from the random number generator.
+
+ This function takes advantage of the fact that the portion of the
+ scale_factor that is divisible by 4 can be simply accounted for by varying
+ the q-format.
+
+ The scaling of the random numbers is thus broken into the
+ equivalent equation below.
+
+ 2^(scale_factor%4)   2^(floor(scale_factor/4))
+ ------------------ *
+  sqrt(N*MEAN_NRG)
+
+
+ 2^(scale_factor%4) is stored in a simple 4-element table.
+ 2^(floor(scale_factor/4) is accounted for by adjusting the q-format.
+ sqrt(N*MEAN_NRG) is calculated and implemented via a polynomial approximation.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall produce uniformly distributed random 32-bit integers,
+ with signed random values of average energy equal to the results of the ISO
+ code's multiplying factor discussed in the FUNCTION DESCRIPTION section.
+
+ Please see Ref (2) for a detailed description of the requirements.
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) Numerical Recipes in C     Second Edition
+        William H. Press        Saul A. Teukolsky
+        William T. Vetterling   Brian P. Flannery
+        Page 284
+
+ (2) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.12 (Perceptual Noise Substitution)
+
+ (3) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    power_adj = scale_mod_4[power_scale & 3];
+
+    power = 0;
+
+    FOR (k=band_length; k > 0; k--)
+
+        *(pSeed) = *(pSeed) * 1664525L;
+        *(pSeed) = *(pSeed) + 1013904223L;
+
+        temp = (Int)(*(pSeed) >> 16);
+
+        power = power + ((temp*temp) >> 6);
+
+        *(pArray) = (Int32)temp;
+
+        pArray = pArray + 1;
+
+    ENDFOR
+
+    k = 0;
+    q_adjust = 30;
+
+    IF (power)
+    THEN
+
+        WHILE ( power > 32767)
+
+            power = power >> 1;
+            k = k + 1;
+
+        ENDWHILE
+
+        k = k - 13;
+
+        IF (k < 0)
+        THEN
+            k = -k;
+            IF ( k & 1 )
+            THEN
+                power_adj = (power_adj*SQRT_OF_2)>>14;
+            ENDIF
+            q_adjust = q_adjust - ( k >> 1);
+
+        ELSE IF (k > 0)
+        THEN
+            IF ( k & 1  )
+            THEN
+                power_adj = (power_adj*INV_SQRT_OF_2)>>14;
+            ENDIF
+            q_adjust = q_adjust + ( k >> 1);
+        ENDIF
+
+        pInvSqrtCoeff = inv_sqrt_coeff;
+
+        inv_sqrt_power  = (*(pInvSqrtCoeff)* power) >>15;
+
+        pInvSqrtCoeff = pInvSqrtCoeff + 1;
+
+        inv_sqrt_power = inv_sqrt_power + *(pInvSqrtCoeff);
+
+        pInvSqrtCoeff = pInvSqrtCoeff + 1;
+
+        FOR ( k=INV_SQRT_POLY_ORDER - 1; k>0; k--)
+
+            inv_sqrt_power  =  ( inv_sqrt_power * power)>>15;
+
+            inv_sqrt_power = inv_sqrt_power + *(pInvSqrtCoeff);
+
+            pInvSqrtCoeff = pInvSqrtCoeff + 1;
+
+        ENDFOR
+
+        inv_sqrt_power = (inv_sqrt_power*power_adj)>>13;
+
+        FOR (k=band_length; k > 0; k--)
+
+            pArray = pArray - 1;
+
+            *(pArray) = *(pArray)*inv_sqrt_power;
+
+        ENDFOR
+
+    ENDIF
+
+    q_adjust = q_adjust - (power_scale >> 2);
+
+    return q_adjust;
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor
+     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    "pv_audio_type_defs.h"
+#include    "gen_rand_vector.h"
+#include    "window_block_fxp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define     SQRT_OF_2       23170       /*    sqrt(2) in Q14  */
+#define     INV_SQRT_OF_2   11585       /*  1/sqrt(2) in Q14  */
+#define     INV_SQRT_POLY_ORDER     4
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+
+
+/*
+ *  2^([0:3]/4) = 1.0000    1.1892    1.4142    1.6818
+ */
+const UInt scale_mod_4[4] = { 16384, 19484, 23170, 27554};
+
+/*
+ *  polynomial approx. in Q12 (type Int)
+ */
+
+const Int  inv_sqrt_coeff[INV_SQRT_POLY_ORDER+1] =
+    { 4680, -17935, 27697, -22326, 11980};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int gen_rand_vector(
+    Int32     random_array[],
+    const Int band_length,
+    Int32*   pSeed,
+    const Int power_scale)
+{
+
+    Int      k;
+    UInt     power_adj;
+    Int      q_adjust = 30;
+
+    Int32    temp;
+    Int32    seed;
+    Int32    power;
+
+    Int32*   pArray = &random_array[0];
+
+    Int32    inv_sqrt_power;
+    const Int  *pInvSqrtCoeff;
+
+    /*
+     *  The out of the random number generator is scaled is such a way
+     *  that is independent of the band length.
+     *  The output is computed as:
+     *
+     *                  x(i)
+     *  output = ------------------ * 2^(power_scale%4) 2^(floor(power_scale/4))
+     *                   bl
+     *           sqrt(  SUM x(i)^2 )
+     *                   0
+     *
+     *  bl == band length
+     */
+
+
+    /*
+     *  get 2^(power_scale%4)
+     */
+
+
+    power = 0;
+
+    seed = *pSeed;
+
+    /*
+     *  band_length is always an even number (check tables in pg.66 IS0 14496-3)
+     */
+    if (band_length < 0 || band_length > LONG_WINDOW)
+    {
+        return  q_adjust;     /*  avoid any processing on error condition */
+    }
+
+    for (k = (band_length >> 1); k != 0; k--)
+    {
+        /*------------------------------------------------
+           Numerical Recipes in C
+                    Page 284
+        ------------------------------------------------*/
+        seed *= 1664525L;
+        seed += 1013904223L;
+
+        temp =  seed >> 16;
+
+        seed *= 1664525L;
+        seed += 1013904223L;
+
+        /* shift by 6 make room for band length accumulation  */
+        power  += ((temp * temp) >> 6);
+        *pArray++ = temp;
+
+        temp    = seed >> 16;
+        power  += ((temp * temp) >> 6);
+        *pArray++ = temp;
+
+    } /* END for (k=half_band_length; k > 0; k--) */
+
+
+    *pSeed = seed;
+
+    /*
+     *  If the distribution is uniform, the power is expected to use between
+     *  28 and 27 bits, by shifting down by 13 bits the power will be a
+     *  Q15 number.
+     *  For different band lengths, the power uses between 20 and 29 bits
+     */
+
+
+    k = 0;
+
+    if (power)
+    {
+        /*
+         *    approximation requires power  between 0.5 < power < 1 in Q15.
+         */
+
+        while (power > 32767)
+        {
+            power >>= 1;
+            k++;
+        }
+
+        /*
+         *  expected power bit usage == 27 bits
+         */
+
+        k -= 13;
+
+        power_adj = scale_mod_4[power_scale & 3];
+
+        if (k < 0)
+        {
+            k = -k;
+            if (k & 1)
+            {                               /* multiply by sqrt(2)  */
+                power_adj = (UInt)(((UInt32) power_adj * SQRT_OF_2) >> 14);
+            }
+            q_adjust -= (k >> 1);    /* adjust Q instead of shifting up */
+        }
+        else if (k > 0)
+        {
+            if (k & 1)
+            {                               /* multiply by 1/sqrt(2)  */
+                power_adj = (UInt)(((UInt32) power_adj * INV_SQRT_OF_2) >> 14);
+            }
+            q_adjust += (k >> 1);   /* adjust Q instead of shifting down */
+        }
+
+        /*
+         *    Compute 1/sqrt(power), where 0.5 < power < 1.0 is approximated
+         *    using a polynomial order INV_SQRT_POLY_ORDER
+         */
+
+        pInvSqrtCoeff = inv_sqrt_coeff;
+
+        inv_sqrt_power  = (*(pInvSqrtCoeff++) * power) >> 15;
+        inv_sqrt_power += *(pInvSqrtCoeff++);
+        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
+        inv_sqrt_power += *(pInvSqrtCoeff++);
+        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
+        inv_sqrt_power += *(pInvSqrtCoeff++);
+        inv_sqrt_power  = (inv_sqrt_power * power) >> 15;
+        inv_sqrt_power += *(pInvSqrtCoeff);
+
+        inv_sqrt_power  = (inv_sqrt_power * power_adj) >> 13;
+
+        pArray = &random_array[0];
+
+        for (k = (band_length >> 1); k != 0; k--)
+        {
+            temp        = *(pArray) * inv_sqrt_power;
+            *(pArray++) = temp;
+            temp        = *(pArray) * inv_sqrt_power;
+            *(pArray++) = temp;
+        } /* END for (k=half_band_length; k > 0; k--) */
+
+    }   /* if(power) */
+
+    /*
+     *      Adjust Q with the value corresponding to 2^(floor(power_scale/4))
+     */
+
+    q_adjust  -= (power_scale >> 2);
+
+    return (q_adjust);
+
+} /* gen_rand_vector */
diff --git a/media/libstagefright/codecs/aacdec/gen_rand_vector.h b/media/libstagefright/codecs/aacdec/gen_rand_vector.h
new file mode 100644
index 0000000..17b5490
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/gen_rand_vector.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: gen_rand_vector.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added include of pv_audio_type_defs.h
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the function declaration for gen_rand_vector.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef gen_rand_vector_H
+#define gen_rand_vector_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+Int gen_rand_vector(
+    Int32  random_array[],
+    const Int    band_length,
+    Int32 *pSeed,
+    const Int    power_scale);
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/get_adif_header.cpp b/media/libstagefright/codecs/aacdec/get_adif_header.cpp
new file mode 100644
index 0000000..8a1e74b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_adif_header.cpp
@@ -0,0 +1,443 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_adif_header.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Change to PV template, remove default config parameter,
+               move some functionality into get_prog_config().
+
+ Description: Update per code review
+              1) Add parameter pScratchPCE
+              2) Change way ADIF_ID is read in.
+              3) Fix comments
+              4) ADD a test for status != SUCCESS in loop.
+
+ Description: The ADIF_Header has now been delegated to the "scratch memory"
+ union.  This change inside s_tDec_Int_File.h had to be reflected here also.
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pVars        = pointer to the structure that contains the current state
+                   of this instance of the library, of data type pointer to
+                   tDec_Int_File
+
+    pScratchPCE  = pointer to a ProgConfig structure used as scratch in the
+                   the function get_prog_config. of data type pointer to
+                   ProgConfig
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+    The function returns 0 if no error occurred, non-zero otherwise.
+
+ Pointers and Buffers Modified:
+    pVars->adif_header contents are updated with the some of the ADIF header
+           contents
+    pVars->tempProgConfig contents are overwritten with last PCE found,
+           which is most likely the first one found.
+    pVars->prog_config contents are updated with the first PCE found.
+    pVars->inputStream contents are modify in such a way that the
+           stream is moved further along in the buffer.
+    pVars->SFBWidth128 contents may be updated.
+    pVars->winSeqInfo  contents may be updated.
+    pScratchPCE        contents may be updated.
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads in the ADIF Header found at the front of ADIF streams.
+ If the header is not found an error is returned. An ADIF header can contain
+ from zero to sixteen program configuration elements (PCE). This function, and
+ the rest of the library, saves and uses the first PCE found.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ Function shall not use static or global variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+   of moving pictures and associated audio information - Part 7: Advanced
+   Audio Coding (AAC)", Table 6.21 - Syntax of program_config_element(),
+   page 16, and section 8.5 "Program Config Element (PCE)", page 30.
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+     CALL getbits(
+        neededBits = 2 * LEN_BYTE,
+        pInputStream = pInputStream)
+     MODIFYING( pInputStream )
+     RETURNING( theIDFromFile )
+
+     CALL getbits(
+        neededBits = 2 * LEN_BYTE,
+        pInputStream = pInputStream)
+     MODIFYING( pInputStream )
+     RETURNING( temp )
+
+    theIDFromFile = (theIDFromFile << (2*LEN_BYTE)) | temp;
+
+    IF (theIDFromFile != ADIF_ID)
+    THEN
+
+        pInputStream->usedBits -= (4 * LEN_BYTE);
+
+        status = -1;
+    ELSE
+        CALL getbits(
+            neededBits = LEN_COPYRT_PRES,
+            pInputStream = pInputStream)
+        MODIFYING( pInputStream )
+        RETURNING( temp )
+
+        IF (temp != FALSE) THEN
+            FOR (i = LEN_COPYRT_ID; i > 0; i--)
+               CALL getbits(
+                   neededBits = LEN_BYTE,
+                   pInputStream = pInputStream)
+               MODIFYING( pInputStream )
+
+            END FOR
+        END IF
+
+        CALL getbits(
+            neededBits = LEN_ORIG + LEN_HOME,
+            pInputStream = pInputStream)
+        MODIFYING( pInputStream )
+
+        CALL getbits(
+            neededBits = LEN_BS_TYPE,
+            pInputStream = pInputStream)
+        MODIFYING( pInputStream )
+        RETURNING( bitStreamType )
+
+        CALL getbits(
+            neededBits = LEN_BIT_RATE,
+            pInputStream = pInputStream)
+        MODIFYING( pInputStream )
+        RETURNING( pHeader->bitrate )
+
+        CALL getbits(
+            neededBits = LEN_NUM_PCE,
+            pInputStream = pInputStream)
+        MODIFYING( pInputStream )
+        RETURNING( numConfigElementsMinus1 )
+
+        FOR (  i = numConfigElementsMinus1;
+              (i >= 0) && (status == SUCCESS);
+               i--)
+
+            IF (bitStreamType == CONSTANT_RATE_BITSTREAM) THEN
+               CALL getbits(
+                   neededBits = LEN_ADIF_BF,
+                   pInputStream = pInputStream)
+               MODIFYING( pInputStream )
+            END IF
+
+            CALL get_prog_config(
+                pVars = pVars)
+            MODIFYING( pVars->prog_config )
+            RETURNING( status )
+
+        END FOR
+    END IF
+
+    RETURN (status)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "e_adif_const.h"
+
+#include "s_progconfig.h"
+#include "s_adif_header.h"
+#include "s_bits.h"
+#include "s_mc_info.h"
+#include "s_frameinfo.h"
+#include "s_tdec_int_file.h"
+
+#include "get_prog_config.h"
+#include "ibstream.h"
+
+#include "get_adif_header.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+/*
+ * This constant is simply the characters 'A' 'D' 'I' 'F' compressed into
+ * a UInt32. Any possible endian problems that exist must be solved by
+ * the function that fills the buffer and getbits(), or this constant and
+ * the rest of the bit stream will not work.
+ */
+#define ADIF_ID (0x41444946)
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int get_adif_header(
+    tDec_Int_File *pVars,
+    ProgConfig    *pScratchPCE)
+{
+    Int          i;
+    UInt32       temp;
+    Int          numConfigElementsMinus1;
+    Int          bitStreamType;
+    UInt32       theIDFromFile;
+
+    BITS        *pInputStream = &pVars->inputStream;
+    ADIF_Header *pHeader = &pVars->scratch.adif_header;
+    Int          status  = SUCCESS;
+
+    /*
+     * The ADIF_ID field is 32 bits long, one more than what getbits() can
+     * do, so read the field in two parts. There is no point in saving the
+     * string - it either matches or it does not. If it matches, it must
+     * have been 'ADIF'
+     */
+
+    theIDFromFile = get17_n_lessbits((2 * LEN_BYTE), pInputStream);
+
+    temp          = get17_n_lessbits((2 * LEN_BYTE), pInputStream);
+
+    theIDFromFile = (theIDFromFile << (2 * LEN_BYTE)) | temp;
+
+
+    if (theIDFromFile != ADIF_ID)
+    {
+        /*
+         * Rewind the bit stream pointer so a search for ADTS header
+         * can start at the beginning.
+         */
+
+        pInputStream->usedBits -= (4 * LEN_BYTE);
+
+        /*
+         * The constant in the next line needs to be updated when
+         * error handling method is determined.
+         */
+        status = -1;
+    }
+    else
+    {
+        /*
+         * To save space, the unused fields are read in, but not saved.
+         */
+
+        /* copyright string */
+        temp =
+            get1bits(/*                LEN_COPYRT_PRES,*/
+                pInputStream);
+
+        if (temp != FALSE)
+        {
+            /*
+             * Read in and ignore the copyright string. If restoring
+             * watch out for count down loop.
+             */
+
+            for (i = LEN_COPYRT_ID; i > 0; i--)
+            {
+                get9_n_lessbits(LEN_BYTE,
+                                pInputStream);
+            } /* end for */
+
+            /*
+             * Make sure to terminate the string with '\0' if restoring
+             * the the copyright string.
+             */
+
+        } /* end if */
+
+        /* Combine the original/copy and fields into one call */
+        get9_n_lessbits(
+            LEN_ORIG + LEN_HOME,
+            pInputStream);
+
+        bitStreamType =
+            get1bits(/*                LEN_BS_TYPE,*/
+                pInputStream);
+
+        pHeader->bitrate =
+            getbits(
+                LEN_BIT_RATE,
+                pInputStream);
+
+        /*
+         * Read in all the Program Configuration Elements.
+         * For this library, only one of the up to 16 possible PCE's will be
+         * saved. Since each PCE must be read, a temporary PCE structure is
+         * used, and if that PCE is the one to use, it is copied into the
+         * single PCE. This is done inside of get_prog_config()
+         */
+
+        numConfigElementsMinus1 =  get9_n_lessbits(LEN_NUM_PCE,
+                                   pInputStream);
+
+        for (i = numConfigElementsMinus1;
+                (i >= 0) && (status == SUCCESS);
+                i--)
+        {
+            /*
+             * For ADIF contant bit rate streams, the _encoder_ buffer
+             * fullness is transmitted. This version of an AAC decoder has
+             * no use for this variable; yet it must be read in to move
+             * the bitstream pointers.
+             */
+
+            if (bitStreamType == CONSTANT_RATE_BITSTREAM)
+            {
+                getbits(
+                    LEN_ADIF_BF,
+                    pInputStream);
+            } /* end if */
+
+            pVars->adif_test = 1;
+            /* Get one program configuration element */
+            status =
+                get_prog_config(
+                    pVars,
+                    pScratchPCE);
+
+#ifdef AAC_PLUS
+
+            /*
+             *  For implicit signalling, no hint that sbr or ps is used, so we need to
+             *  check the sampling frequency of the aac content, if lesser or equal to
+             *  24 KHz, by defualt upsample, otherwise, do nothing
+             */
+            if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == true) &&
+                    pVars->mc_info.audioObjectType == MP4AUDIO_AAC_LC)
+            {
+                pVars->mc_info.upsamplingFactor = 2;
+                pVars->prog_config.sampling_rate_idx -= 3;
+                pVars->mc_info.sbrPresentFlag = 1;
+                pVars->sbrDecoderData.SbrChannel[0].syncState = UPSAMPLING;
+                pVars->sbrDecoderData.SbrChannel[1].syncState = UPSAMPLING;
+            }
+#endif
+
+
+
+        } /* end for */
+
+
+    } /* end 'else' of --> if (theIDFromFile != ADIF_ID) */
+
+    return status;
+
+} /* end get_adif_header */
diff --git a/media/libstagefright/codecs/aacdec/get_adif_header.h b/media/libstagefright/codecs/aacdec/get_adif_header.h
new file mode 100644
index 0000000..8bc3411
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_adif_header.h
@@ -0,0 +1,95 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_adif_header.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Add parameter to get_adif_header() function.
+
+ Who:                                      Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for get_adif_header.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_ADIF_HEADER_H
+#define GET_ADIF_HEADER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define CONSTANT_RATE_BITSTREAM  (0)
+#define VARIABLE_RATE_BITSTREAM  (1)
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int get_adif_header(
+    tDec_Int_File *pVars,
+    ProgConfig    *pScratchPCE);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_adts_header.cpp b/media/libstagefright/codecs/aacdec/get_adts_header.cpp
new file mode 100644
index 0000000..3ac2756
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_adts_header.cpp
@@ -0,0 +1,672 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_adts_header.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Remove default_config variable
+
+ Description: change enter_mc_info to set_mc_info
+
+ Description: (1) add error checking for channel_config > 2
+              (2) eliminated call to check_mc_info
+              (3) use (profile + 1) when calling set_mc_info
+              (4) use winmap when calling set_mc_info
+
+ Who:                                          Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pVars           =   Pointer to structure that holds file-scope variables.
+                        [ tDec_Int_File * ]
+
+    pSyncword       =   Pointer to variable that holds the 28-bit fixed
+                        header upon the exit of this function. [ UInt32 * ]
+
+    pInvoke         =   Pointer to variable that keeps track of how many
+                        "short" (14 bit) headers have been successfully
+                        parsed from the bitstream. [ Int * ]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    Status = SUCCESS or ERROR CODE
+
+ Pointers and Buffers Modified:
+    pVars->prog_config   Updated with program information data as read from
+                         the ADTS header.
+
+    pSyncword            Value pointed to is updated with the contents of
+                         the 28-bit fixed header.
+
+    pInvoke              Value pointed to is updated to reflect the number
+                         of successful "short" (14 bit) headers that have
+                         been successfully parsed from the bitstream.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Acronym Definitions
+ ADTS  Audio Data Transport Stream
+ CRC   Cyclic Redundancy Code
+
+ This function calls find_adts_syncword to find the next ADTS header.  Until
+ three consistent headers have been read, the syncword used for detection
+ consists of the 12-bit syncword and the 2-bit Layer.  After three consistent
+ headers are read, the entire fixed header is used for a robust 28-bit
+ syncword.
+
+ Configuration information is then extracted from the bitstream.
+
+ The bitstream information is packed as follows.
+ Comments about the correct interpretation of these bits are contained within
+ the code.
+
+                                      CRC_absent    sampling_rate_idx
+                                           \               / \
+                                            \             /   \
+                                             \  Profile  /     \  UNUSED
+                                              \   / \   /       \   /
+|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|
+ \         _______________         / |   \  /                         \      /
+  \-------|0xFFF syncword |-------/  |   Layer == '00' for AAC         \    /
+           \-------------/           |                                  \  /
+                                     |                                   \/
+                                     ID == '1' for MPEG-2 AAC    channel_config
+       copyright_id_bit                 == '0' for MPEG-4 AAC
+          /
+    home /
+     /  /
+|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|
+  |        \  \          _____________           /
+  |         \  \--------|frame length |---------/
+  orig_copy  \           \-----------/
+              \                                  ______________________________
+        copyright_id_start                      | TOTAL HEADER LENGTH: 56 bits|
+                                                |-----------------------------|
+|43|44|45|46|47|48|49|50|51|52|53|54|55|        | FIXED    HEADER BITS 00-27  |
+  \       _______________      /  |   |         | VARIABLE HEADER BITS 28-55  |
+   \-----|buffer_fullness|----/    \ /          |_____________________________|
+          \-------------/           |
+                              headerless_frames
+
+ In addition to the bits displayed above, if the value CRC_absent is '0' an
+ additional 16 bits corresponding to a CRC word are read from the bitstream,
+ following the header.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ After the ADTS syncword is detected, this function shall parse the
+ information residing behind the syncword in the bitstream.
+------------------------------------------------------------------------------
+ REFERENCES
+ (1) ISO/IEC 13818-7:1997(E)
+     Part 7
+        Subpart 6.2 (Audio_Data_Transport_Stream frame, ADTS)
+
+ (2) ISO/IEC 11172-3:1993(E)
+     Part 3
+        Subpart 2.4.3 The audio decoding process
+
+ (3) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those UIntending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF (*(pInvoke) > 3)
+
+         CALL find_adts_syncword(
+                    pSyncword,
+                   &(pVars->inputStream),
+                    LENGTH_FIXED_HEADER,
+                    MASK_28BITS);
+           RETURNING  status
+    ELSE
+
+        *(pSyncword) = SYNCWORD_15BITS;
+
+        CALL find_adts_syncword(
+                   pSyncword,
+                  &(pVars->inputStream),
+                   LENGTH_SYNCWORD,
+                   ID_BIT_FILTER);
+
+          MODIFYING  *(pSyncword) = 28-bit fixed header (long syncword)
+          RETURNING  status
+
+        CALL getbits(
+                (LENGTH_FIXED_HEADER - LENGTH_SYNCWORD),
+               &(pVars->inputStream));
+
+          MODIFYING pVars->inputStream
+          RETURNING adts_header = remaining bits in the fixed header
+
+        *(pSyncword) <<= 13;
+        *(pSyncword) = *(pSyncword) OR adts_header;
+
+        pVars->prog_config.CRC_absent  = ((UInt)(adts_header >> 12)) AND 0x0001;
+
+        lower_16 = (UInt)adts_header;
+
+        pVars->prog_config.profile = (lower_16 >> 10) AND 0x3;
+
+        pVars->prog_config.sampling_rate_idx = (lower_16 >> 6) AND 0xF;
+
+        channel_configuration = (lower_16 >> 2) AND 0x7;
+
+        channel_configuration = channel_configuration - 1;
+        pVars->prog_config.front.ele_is_cpe[0] = channel_configuration;
+
+        pVars->prog_config.front.num_ele    = 1;
+
+        pVars->prog_config.front.ele_tag[0] = 0;
+
+        pVars->prog_config.mono_mix.present = 0;
+        pVars->prog_config.stereo_mix.present = 0;
+        pVars->prog_config.matrix_mix.present = 0;
+
+        CALL set_mc_info(
+                &(pVars->mc_info),
+                &(pVars->savedMCInfo),
+                &(pVars->prog_config),
+                  pVars->pWinSeqInfo,
+                  pVars->SFBWidth128);
+          MODIFYING pVars->mc_info = multi-channel configuration information
+          RETURNING status         = SUCCESS/FAILURE
+
+        IF ( (*pInvoke) != 0)
+            CALL check_mc_info(
+                    &(pVars->mc_info),
+                    &(pVars->savedMCInfo),
+                     FALSE);
+              RETURNING status = SUCCESS/FAILURE
+        ELSE
+            CALL check_mc_info(
+                    &(pVars->mc_info),
+                    &(pVars->savedMCInfo),
+                     TRUE);
+              MODIFYING pVars->savedMCInfo = pVars->mc_info
+              RETURNING status = SUCCESS/FAILURE
+        ENDIF
+
+        IF (status == SUCCESS)
+            (*pInvoke) = (*pInvoke) + 1;
+        ELSE
+            (*pInvoke) = 0;
+        ENDIF
+
+    ENDIF
+
+    CALL getbits(
+            LENGTH_VARIABLE_HEADER,
+           &(pVars->inputStream));
+      RETURNING adts_header = 28-bits (the contents of the variable header.)
+
+    pVars->prog_config.frame_length  = ((UInt)(adts_header >> 13)) AND 0x1FFF;
+
+    lower_16 = (UInt)adts_header;
+
+    pVars->prog_config.buffer_fullness = (lower_16 >> 2) AND 0x7FF;
+
+    pVars->prog_config.headerless_frames = (lower_16 AND 0x0003);
+
+    IF (pVars->prog_config.CRC_absent == 0)
+
+        CALL getbits(
+                LENGTH_CRC,
+               &(pVars->inputStream) );
+          RETURNING pVars->prog_config.CRC_check = 16-bit CRC
+
+    ENDIF
+
+    pVars->default_config = 0;
+
+    IF (byte_align_offset > 7)
+        status = 1;
+    ENDIF
+
+    return (status);
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_bits.h"
+#include "s_tdec_int_file.h"
+#include "ibstream.h"
+#include "set_mc_info.h"
+#include "find_adts_syncword.h"
+#include "get_adts_header.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LENGTH_VARIABLE_HEADER  28
+#define LENGTH_FIXED_HEADER     28
+#define LENGTH_SYNCWORD         15
+#define LENGTH_CRC              16
+
+#define ID_BIT_FILTER           0x7FFB
+#define SYNCWORD_15BITS         0x7FF8
+#define MASK_28BITS             0x0FFFFFFFL
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int get_adts_header(
+    tDec_Int_File *pVars,
+    UInt32        *pSyncword,
+    Int           *pInvoke,
+    Int            CorrectlyReadFramesCount)
+{
+    UInt32 adts_header;
+    UInt   lower_16;
+    Int    status = SUCCESS;
+    UInt   channel_configuration;
+
+    /*
+     * Search for the LONG ADTS syncword (comprised of the entire fixed header)
+     * if the number of CorrectlyReadFrames is > CorrectlyReadFramesCount
+     *
+     * Otherwise, search for just the short syncword.
+     */
+    if (*(pInvoke) > CorrectlyReadFramesCount)
+    {
+        /*
+         * Find the long ADTS syncword
+         * (comprised of the entire ADTS fixed header)
+         */
+
+        status = find_adts_syncword(pSyncword,
+                                    &(pVars->inputStream),
+                                    LENGTH_FIXED_HEADER,
+                                    MASK_28BITS);
+    }
+    else
+    {
+
+        *(pSyncword) = SYNCWORD_15BITS;
+
+        status = find_adts_syncword(pSyncword,
+                                    &(pVars->inputStream),
+                                    LENGTH_SYNCWORD,
+                                    ID_BIT_FILTER);
+
+        /*
+         *  Extract the data from the header following the syncword
+         */
+        adts_header = getbits((LENGTH_FIXED_HEADER - LENGTH_SYNCWORD),
+                              &(pVars->inputStream));
+
+        *(pSyncword) <<= (LENGTH_FIXED_HEADER - LENGTH_SYNCWORD);
+        *(pSyncword)  |= adts_header;
+
+        /* Denotes whether a CRC check should be performed */
+        pVars->prog_config.CRC_absent  = ((UInt)(adts_header >> 12)) & 0x0001;
+
+        /*
+         * All the unread bits in adts_header reside in the lower
+         * 16-bits at this point.  Perform a typecast for faster
+         * execution on 16-bit processors.
+         */
+        lower_16 = (UInt)adts_header;
+
+        /*
+         * Profile consists of 2 bits, which indicate
+         * the profile used.
+         *
+         * '00' AAC_MAIN profile
+         * '01' AAC_LC (Low Complexity) profile
+         * '10' AAC_SSR (Scaleable Sampling Rate) profile
+         * '11' AAC_LTP (Long Term Prediction) profile
+         */
+        pVars->prog_config.profile = (lower_16 >> 10) & 0x3;
+
+        if (pVars->prog_config.profile == MP4AUDIO_AAC_SSR)
+        {
+            status = 1;     /* Not supported */
+        }
+
+        /*
+         * Sampling_rate_idx consists of 4 bits
+         * see Ref #1 for their interpretation.
+         */
+        pVars->prog_config.sampling_rate_idx = (lower_16 >> 6) & 0xF;
+
+        /*
+         * private_bit is a bit for private use.  ISO/IEC will not make
+         * use of this bit in the future.
+         *
+         * We currently make no use of it, but parsing the information
+         * from the bitstream could be easily implemented with the
+         * following instruction...
+         *
+         * private_bit = (lower_16 & 0x0400) >> 10;
+         */
+
+        /*
+         * These 3 bits indicate the channel configuration used.
+         *
+         * If '0' then the channel configuration is unspecified here,
+         * and must be given by a program configuration element in
+         * the raw data block.
+         *
+         * If '1' then the channel configuration is MONO.
+         * If '2' then the channel configuration is STEREO
+         *
+         * 3-7 represent channel configurations which this library
+         * will not support in the forseeable future.
+         */
+        channel_configuration = (lower_16 >> 2) & 0x7;
+        /* do not support more than 2 channels */
+        if (channel_configuration > 2)
+        {
+            status = 1;
+        }
+
+        /*
+         * The following 2 bits encode copyright information.
+         * original_copy is '0' if there is no copyright in the bitstream.
+         *                  '1' if the bitstream is copyright protected.
+         *
+         * home is '0' for a copy, '1' for an original.
+         *
+         * PacketVideo currently does nothing with this information,
+         * however, parsing the data from the bitstream could be easily
+         * implemented with the following instructions...
+         *
+         * original_copy = (lower_16 >> 1) & 0x1;
+         *
+         * home = (lower_16 & 0x1);
+         *
+         */
+
+        /* Set up based on information extracted from the ADTS FIXED header */
+
+        /* This equals 1 for STEREO, 0 for MONO */
+        if (channel_configuration)
+        {
+            channel_configuration--;
+        }
+        pVars->prog_config.front.ele_is_cpe[0] = channel_configuration;
+
+        /* This value is constant for both MONO and STEREO */
+        pVars->prog_config.front.num_ele    = 1;
+
+        /* ADTS does not specify this tag value - do we even use it? */
+        pVars->prog_config.front.ele_tag[0] = 0;
+
+        /* Disable all mix related variables */
+        pVars->prog_config.mono_mix.present = 0;
+        pVars->prog_config.stereo_mix.present = 0;
+        pVars->prog_config.matrix_mix.present = 0;
+
+        /* enter configuration into MC_Info structure */
+        if (status == SUCCESS)
+        {
+            /* profile + 1 == audioObjectType */
+            status =
+                set_mc_info(
+                    &(pVars->mc_info),
+                    (tMP4AudioObjectType)(pVars->prog_config.profile + 1),
+                    pVars->prog_config.sampling_rate_idx,
+                    pVars->prog_config.front.ele_tag[0],
+                    pVars->prog_config.front.ele_is_cpe[0],
+                    pVars->winmap, /* changed from pVars->pWinSeqInfo, */
+                    pVars->SFBWidth128);
+
+        } /* if (status == SUCCESS) */
+
+
+#ifdef AAC_PLUS
+
+        /*
+         *  For implicit signalling, no hint that sbr or ps is used, so we need to
+         *  check the sampling frequency of the aac content, if lesser or equal to
+         *  24 KHz, by defualt upsample, otherwise, do nothing
+         */
+        if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == TRUE))
+        {
+            pVars->mc_info.upsamplingFactor = 2;
+            pVars->prog_config.sampling_rate_idx -= 3;
+            pVars->mc_info.sbrPresentFlag = 1;
+            pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_ACTIVE;
+            pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_ACTIVE;
+        }
+#endif
+
+
+        /*
+         * The tag and is_cpe will be checked in huffdecode,
+         * remove this check routine.
+         */
+        /*if (status == SUCCESS)
+         *{
+         *   if ( (*pInvoke) != 0)
+         *   {
+         *       status =
+         *           check_mc_info(
+         *               &(pVars->mc_info),
+         *               &(pVars->savedMCInfo),
+         *               FALSE);
+         *   }
+         *   else
+         *   {
+         *       status =
+         *           check_mc_info(
+         *               &(pVars->mc_info),
+         *               &(pVars->savedMCInfo),
+         *               TRUE);
+         *   }
+         *
+         *}*/ /* if (status == SUCCESS) */
+
+        /*
+         * This keeps track of how many headers have been read in the file.
+         * After the three successful headers with the same configuration
+         * are read in, the entire ADTS fixed header is used as the syncword
+         * for a more robust 28-bit long syncword
+         */
+
+        if (status == SUCCESS)
+        {
+            (*pInvoke)++;
+        }
+        else
+        {
+            (*pInvoke) = 0;
+        }
+
+    } /* END if (*(pInvoke) > 3) */
+
+    /* Grab the bits in the ADTS variable header */
+    adts_header = getbits(
+                      LENGTH_VARIABLE_HEADER,
+                      &(pVars->inputStream));
+    /*
+     * copyright_identification bit is a single bit of the 72-bit
+     * copyright_id field.  This consists of a 8-bit copyright identifier
+     * and a 64-bit copyright_number.  72 headers must be decoded
+     * to reconstruct the entire copyright_id field.
+     *
+     * copyright_identification_start is a single bit flagging
+     * the beginning bit of the copyright_id field.  '1' for start of
+     * copyright_id, '0' otherwise.
+     *
+     *
+     * PacketVideo currently does nothing with this information,
+     * however, parsing the data from the bitstream could be easily
+     * implemented with the following instructions...
+     *
+     * copyright_id_bit = ((UInt)(adts_header >> 27)) & 0x1;
+     *
+     * copyright_id_start = ((UInt)(adts_header >> 26)) & 0x1;
+     */
+
+    /*
+     * frame_length is a 13-bit field which indicates the length,
+     * in bytes, of the frame including error_check and headers.
+     * This information can theoretically be used to help verify syncwords.
+     */
+    pVars->prog_config.frame_length  = ((UInt)(adts_header >> 13)) & 0x1FFF;
+
+    /*
+     * All the unread bits in adts_header reside in the lower
+     * 16-bits at this point.  Perform a typecast for faster
+     * execution on 16-bit processors.
+     */
+    lower_16 = (UInt)adts_header;
+
+    /*
+     * Indicates the number of 32-bit words remaining in the
+     * encoder buffer after the encoding of the first raw
+     * data block.  This value is 0x7ff for variable bit
+     * rate encoders, since buffer fullness does not apply
+     * to Variable Bit Rate (VBR) encoders.
+     */
+    pVars->prog_config.buffer_fullness = (lower_16 >> 2) & 0x7FF;
+
+    /*
+     * headerless_frames indicates the number of
+     * frames with no headers to be processed before the reading
+     * in of the next header.
+     *
+     * In ADTS, up to 4 "no header frames" can exist between
+     * syncwords.
+     *
+     * EXAMPLES:
+     *
+     * Legend: (Sync words denoted by X, frames
+     * deonted by FRAME_#)
+     *
+     * Example(1): The ADTS sequence below packs 5
+     * frames per header.
+     * Here, headerless_frames would always be read in as "4"
+     *
+     * |X||FRAME_0||FRAME_1||FRAME_2||FRAME_3||FRAME_4||X||FRAME_0|
+     *
+     * Example(2): The ADTS sequence below packs 1 frame per header.
+     * Here, headerless_frames would always be read in as "0"
+     *
+     * |X||FRAME_0||X||FRAME_1||X||FRAME_2|
+     *
+     */
+    pVars->prog_config.headerless_frames = (lower_16 & 0x0003);
+
+    if (pVars->prog_config.CRC_absent == 0)
+    {
+        pVars->prog_config.CRC_check = (UInt)getbits(
+                                           LENGTH_CRC,
+                                           &(pVars->inputStream));
+    }
+
+    /* pVars->current_program = 0; */ /* shall be set after PCE is read */
+
+    return (status);
+
+} /* END get_adts_header */
diff --git a/media/libstagefright/codecs/aacdec/get_adts_header.h b/media/libstagefright/codecs/aacdec/get_adts_header.h
new file mode 100644
index 0000000..13afa05
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_adts_header.h
@@ -0,0 +1,90 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/get_adts_header.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file has the function declaration for get_adts_header().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_ADTS_HEADER_H
+#define GET_ADTS_HEADER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_tdec_int_file.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
+----------------------------------------------------------------------------*/
+Int get_adts_header(
+    tDec_Int_File *pVars,
+    UInt32        *pSyncword,
+    Int           *pInvoke,
+    Int            CorrectlyReadFramesCount);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_audio_specific_config.cpp b/media/libstagefright/codecs/aacdec/get_audio_specific_config.cpp
new file mode 100644
index 0000000..092f397
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_audio_specific_config.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/get_audio_specific_config.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified per review comments
+
+ Description: Modified per second review comments
+              (1) change audioObjectType to Int
+              (2) do not set pVars->prog_config.profile
+              (3) clean up status flag, default to SUCCESS
+              (4) fix multiple lines comments
+
+ Description: Change getbits.h to ibstream.h
+
+ Description: Modified per review comments
+              (1) updated revision history
+              (2) declare audioObjectType as enum type
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less.
+
+ Description: Added support for backward and non-backward (explicit)
+              mode for Parametric Stereo (PS) used in enhanced AAC+
+
+ Who:                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pVars = pointer to the structure that holds all information for
+            this instance of the library. pVars->prog_config is directly
+            used, and pVars->mc_info, pVars->prog_config,
+            pVars->pWinSeqInfo, pVars->SFBWidth128 are needed indirectly
+            for calling set_mc_info. Data type pointer to tDec_Int_File
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    status = 0 if successfully decoded AudioSpecificConfig
+             1 if un-supported config is used for this release
+
+ Pointers and Buffers Modified:
+    pVars->prog_config contents are updated with the information read in.
+    pVars->mc_info contents are updated with channel information.
+    pVars->pWinSeqInfo contents are updated with window information.
+    pVars->SFBWidth128 contents are updated with scale factor band width data.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads the bitstream for the structure "AudioSpecificConfig",
+ and sets the decoder configuration that is needed by the decoder to be able
+ to decode the media properly.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall not use global variables
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3: 1999(E)
+ Part 3
+ Subpart 1  p18     1.6   Interface to MPEG-4 Systems
+ Subpart 4  p13     4.4.1 GA Specific Configuration
+ Amendment  p10     6.2.1 AudioSpecificInfo
+ Amendment  p78     8.2   Decoder configuration (GASpecificConfig)
+
+ (2) AAC DecoderSpecificInfo Information
+   PacketVideo descriptions - San Diego
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    status = SUCCESS;
+
+    pInputStream = &(pVars->inputStream);
+
+    temp = CALL getbits(
+                    neededBits = LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX,
+                    pInputStream = pInputStream)
+           MODIFYING (pInputStream)
+           RETURNING (temp)
+
+    audioObjectType = (temp & 0x1f0) >> 4;
+
+    pVars->prog_config.profile = audioObjectType;
+
+    pVars->prog_config.sampling_rate_idx = temp & 0xf;
+
+    IF (pVars->prog_config.sampling_rate_idx == 0xf)
+    THEN
+        sampling_rate = CALL getbits(
+                            neededBits = LEN_SAMP_RATE,
+                            pInputStream = pInputStream);
+                        MODIFYING (pInputStream)
+                        RETURNING (sampling_rate)
+    ENDIF
+
+    channel_config = CALL getbits(
+                            neededBits = LEN_CHAN_CONFIG,
+                            pInputStream = pInputStream);
+                        MODIFYING (pInputStream)
+                        RETURNING (channel_config)
+
+    IF (channel_config > 2)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (((audioObjectType == MP4AUDIO_AAC_MAIN)     OR
+        (audioObjectType == MP4AUDIO_AAC_LC)        OR
+        (audioObjectType == MP4AUDIO_AAC_SSR)       OR
+        (audioObjectType == MP4AUDIO_LTP)           OR
+        (audioObjectType == MP4AUDIO_AAC_SCALABLE)  OR
+        (audioObjectType == MP4AUDIO_TWINVQ)) AND (status == -1))
+    THEN
+        status = CALL get_GA_specific_config(
+                            pVars = pVars,
+                            channel_config = channel_config,
+                            audioObjectType = audioObjectType,
+                            pInputStream = pInputStream);
+                      MODIFYING (pVars->mc_info,channel_config,pInputStream)
+                      RETURNING (status)
+
+    ENDIF
+
+    IF (audioObjectType == MP4AUDIO_CELP)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (audioObjectType == MP4AUDIO_HVXC)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (audioObjectType == MP4AUDIO_TTSI)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF ((audioObjectType == 13) OR (audioObjectType == 14) OR
+        (audioObjectType == 15) OR (audioObjectType == 16))
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (((audioObjectType == MP4AUDIO_ER_AAC_LC)       OR
+         (audioObjectType == MP4AUDIO_ER_AAC_LTP)      OR
+         (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR
+         (audioObjectType == MP4AUDIO_ER_TWINVQ)       OR
+         (audioObjectType == MP4AUDIO_ER_BSAC)         OR
+         (audioObjectType == MP4AUDIO_ER_AAC_LD)) AND (status == -1))
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (audioObjectType == MP4AUDIO_ER_CELP)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF (audioObjectType == MP4AUDIO_ER_HVXC)
+    THEN
+        status = 1;
+    ENDIF
+
+    IF ((audioObjectType == MP4AUDIO_ER_HILN) OR
+        (audioObjectType == MP4AUDIO_PARAMETRIC))
+    THEN
+        status = 1;
+    ENDIF
+
+    IF ((audioObjectType == MP4AUDIO_ER_AAC_LC)       OR
+        (audioObjectType == MP4AUDIO_ER_AAC_LTP)      OR
+        (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) OR
+        (audioObjectType == MP4AUDIO_ER_TWINVQ)       OR
+        (audioObjectType == MP4AUDIO_ER_BSAC)         OR
+        (audioObjectType == MP4AUDIO_ER_AAC_LD)       OR
+        (audioObjectType == MP4AUDIO_ER_CELP)         OR
+        (audioObjectType == MP4AUDIO_ER_HVXC)         OR
+        (audioObjectType == MP4AUDIO_ER_HILN)         OR
+        (audioObjectType == MP4AUDIO_PARAMETRIC))
+    THEN
+        epConfig = CALL getbits(
+                            neededBits = LEN_EP_CONFIG,
+                            pInputStream = pInputStream);
+                      MODIFYING (pInputStream)
+                      RETURNING (epConfig)
+
+        IF (epConfig == 2)
+        THEN
+            status = 1;
+        ENDIF
+
+    ENDIF
+
+    RETURN status;
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "e_mp4ff_const.h"
+#include    "e_tmp4audioobjecttype.h"
+#include    "get_audio_specific_config.h"
+#include    "get_ga_specific_config.h"
+#include    "ibstream.h"
+#include    "sfb.h"                   /* Where samp_rate_info[] is declared */
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int get_audio_specific_config(tDec_Int_File   * const pVars)
+{
+
+    UInt    temp;
+    tMP4AudioObjectType     audioObjectType;
+    //UInt32  sampling_rate;
+    UInt    channel_config;
+    UInt    syncExtensionType;
+    UInt    extensionAudioObjectType = 0;
+    UInt    extensionSamplingFrequencyIndex = 0;
+    BITS   *pInputStream;
+    Int     status;
+
+    status = SUCCESS;
+
+    pInputStream = &(pVars->inputStream);
+
+    pVars->mc_info.upsamplingFactor = 1;   /*  default to regular AAC */
+
+    temp =  get9_n_lessbits(LEN_OBJ_TYPE + LEN_SAMP_RATE_IDX,
+                            pInputStream);
+
+    /*
+     * The following code can directly set the values of elements in
+     * MC_Info, rather than first setting the values in pVars->prog_config
+     * and then copy these values to MC_Info by calling set_mc_info.
+     * In order to keep consistent with get_prog_config (ADIF) and
+     * get_adts_header (ADTS), the code here is still copying
+     * the info, and set the pVars->current_program = 0
+     */
+
+    /* AudioObjectType */
+    audioObjectType = (tMP4AudioObjectType)((temp & 0x1f0) >> 4);
+
+    pVars->mc_info.ExtendedAudioObjectType =  audioObjectType;   /* default */
+    /* saving an audioObjectType into a profile field */
+    /* pVars->prog_config.profile = audioObjectType; */
+
+    /* sampling rate index */
+    pVars->prog_config.sampling_rate_idx = temp & 0xf;
+
+    if (pVars->prog_config.sampling_rate_idx > 0xb)
+    {
+        /*
+         *  Only support 12 sampling frequencies from array samp_rate_info ( see sfb.cpp)
+         *  7350 Hz (index 0xc) is not supported, the other indexes are reserved or escape
+         */
+        if (pVars->prog_config.sampling_rate_idx == 0xf) /* escape sequence */
+        {
+            /*
+             * sampling rate not listed in Table 1.6.2,
+             * this release does not support this
+             */
+            /*sampling_rate =  getbits( LEN_SAMP_RATE,
+                                      pInputStream);*/
+            getbits(LEN_SAMP_RATE, pInputStream); /* future use */
+        }
+
+        status = 1;
+    }
+
+    channel_config =  get9_n_lessbits(LEN_CHAN_CONFIG,
+                                      pInputStream);
+
+    if ((channel_config > 2) && (!pVars->aacConfigUtilityEnabled))
+    {
+        /*
+         * AAC lib does not support more than two channels
+         * signal error when in decoder mode
+         * do not test when in utility mode
+         */
+        status = 1;
+
+    }
+
+    if (audioObjectType == MP4AUDIO_SBR || audioObjectType == MP4AUDIO_PS)
+    {
+        /* to disable explicit backward compatiblity check */
+        pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR;
+        pVars->mc_info.sbrPresentFlag = 1;
+
+        if (audioObjectType == MP4AUDIO_PS)
+        {
+            pVars->mc_info.psPresentFlag = 1;
+            pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_PS;
+        }
+
+        extensionSamplingFrequencyIndex = /* extensionSamplingFrequencyIndex */
+            get9_n_lessbits(LEN_SAMP_RATE_IDX,
+                            pInputStream);
+        if (extensionSamplingFrequencyIndex == 0x0f)
+        {
+            /*
+             * sampling rate not listed in Table 1.6.2,
+             * this release does not support this
+                */
+            /*sampling_rate = getbits( LEN_SAMP_RATE,
+                                     pInputStream);*/
+            getbits(LEN_SAMP_RATE, pInputStream);
+        }
+
+        audioObjectType = (tMP4AudioObjectType) get9_n_lessbits(LEN_OBJ_TYPE ,
+                          pInputStream);
+    }
+
+
+    if ((/*(audioObjectType == MP4AUDIO_AAC_MAIN)     ||*/
+                (audioObjectType == MP4AUDIO_AAC_LC)        ||
+                /*(audioObjectType == MP4AUDIO_AAC_SSR)       ||*/
+                (audioObjectType == MP4AUDIO_LTP)           /*||*/
+                /*(audioObjectType == MP4AUDIO_AAC_SCALABLE)  ||*/
+                /*(audioObjectType == MP4AUDIO_TWINVQ)*/) && (status == SUCCESS))
+    {
+        status = get_GA_specific_config(pVars,
+                                        pInputStream,
+                                        channel_config,
+                                        audioObjectType);
+
+        /*
+         *  verify that Program config returned a supported audio object type
+         */
+
+        if ((pVars->mc_info.audioObjectType != MP4AUDIO_AAC_LC) &&
+                (pVars->mc_info.audioObjectType != MP4AUDIO_LTP))
+        {
+            return 1;   /* status != SUCCESS invalid aot */
+        }
+    }
+    else
+    {
+        return 1;   /* status != SUCCESS invalid aot or invalid parameter */
+    }
+
+    /*
+     *  SBR tool explicit signaling ( backward compatible )
+     */
+    if (extensionAudioObjectType != MP4AUDIO_SBR)
+    {
+        syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE,
+                            pInputStream);
+
+        if (syncExtensionType == 0x2b7)
+        {
+            extensionAudioObjectType = get9_n_lessbits( /* extensionAudioObjectType */
+                                           LEN_OBJ_TYPE,
+                                           pInputStream);
+
+            if (extensionAudioObjectType == MP4AUDIO_SBR)
+            {
+                pVars->mc_info.sbrPresentFlag = get1bits(pInputStream);  /* sbrPresentFlag */
+                if (pVars->mc_info.sbrPresentFlag == 1)
+                {
+                    extensionSamplingFrequencyIndex =
+                        get9_n_lessbits( /* extensionSamplingFrequencyIndex */
+                            LEN_SAMP_RATE_IDX,
+                            pInputStream);
+                    if (pVars->aacPlusEnabled == true)
+                    {
+#ifdef AAC_PLUS
+                        pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) ==
+                                                          samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1;
+
+                        if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx)
+                        {
+                            /*
+                             *  Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz
+                             */
+                            if (pVars->prog_config.sampling_rate_idx < 6)
+                            {
+                                pVars->aacPlusEnabled = false;
+                            }
+
+                            pVars->mc_info.bDownSampledSbr = true;
+                        }
+                        pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex;
+
+#endif
+                    }
+
+                    if (extensionSamplingFrequencyIndex == 0x0f)
+                    {
+                        /*
+                         * sampling rate not listed in Table 1.6.2,
+                         * this release does not support this
+                         */
+                        /*sampling_rate = getbits( LEN_SAMP_RATE,
+                                                 pInputStream);*/
+                        getbits(LEN_SAMP_RATE, pInputStream);
+                    }
+                    /* syncExtensionType */
+                    syncExtensionType = (UInt)get17_n_lessbits(LEN_SYNC_EXTENSION_TYPE,
+                                        pInputStream);
+                    if (syncExtensionType == 0x548)
+                    {
+                        pVars->mc_info.psPresentFlag = get1bits(pInputStream);  /* psPresentFlag */
+                        if (pVars->mc_info.psPresentFlag)
+                        {
+                            extensionAudioObjectType = MP4AUDIO_PS;
+                        }
+                    }
+                    else
+                    {
+                        /*
+                        * Rewind bitstream pointer so that the syncExtensionType reading has no
+                        * effect when decoding raw bitstream
+                            */
+                        pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE;
+                    }
+
+                    pVars->mc_info.ExtendedAudioObjectType = (eMP4AudioObjectType)extensionAudioObjectType;
+                }
+            }
+        }
+        else if (!status)
+        {
+            /*
+             * Rewind bitstream pointer so that the syncExtensionType reading has no
+             * effect when decoding raw bitstream
+             */
+            pVars->inputStream.usedBits -= LEN_SYNC_EXTENSION_TYPE;
+
+#ifdef AAC_PLUS
+
+            /*
+             *  For implicit signalling, no hint that sbr or ps is used, so we need to
+             *  check the sampling frequency of the aac content, if lesser or equal to
+             *  24 KHz, by defualt upsample, otherwise, do nothing
+             */
+            if ((pVars->prog_config.sampling_rate_idx >= 6) && (pVars->aacPlusEnabled == true) &&
+                    audioObjectType == MP4AUDIO_AAC_LC)
+            {
+                pVars->mc_info.upsamplingFactor = 2;
+                pVars->prog_config.sampling_rate_idx -= 3;
+                pVars->mc_info.sbrPresentFlag = 1;
+                pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_NOT_INITIALIZED;
+                pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_NOT_INITIALIZED;
+
+            }
+#endif
+
+        }
+    }
+    else    /*  MP4AUDIO_SBR was detected  */
+    {
+        /*
+         *  Set the real output frequency use by the SBR tool, define tentative upsample ratio
+         */
+        if (pVars->aacPlusEnabled == true)
+        {
+#ifdef AAC_PLUS
+            pVars->mc_info.upsamplingFactor = (samp_rate_info[extensionSamplingFrequencyIndex].samp_rate >> 1) ==
+                                              samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate ? 2 : 1;
+
+            if ((Int)extensionSamplingFrequencyIndex == pVars->prog_config.sampling_rate_idx)
+            {
+                /*
+                 *  Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz
+                 */
+                if (pVars->prog_config.sampling_rate_idx < 6)
+                {
+                    pVars->aacPlusEnabled = false;
+                }
+                pVars->mc_info.bDownSampledSbr = true;
+            }
+            pVars->prog_config.sampling_rate_idx = extensionSamplingFrequencyIndex;
+
+
+
+#endif
+
+
+
+
+        }
+
+    }  /*  if ( extensionAudioObjectType != MP4AUDIO_SBR ) */
+
+    /*
+     * The following object types are not supported in this release,
+     * however, keep these interfaces for future implementation
+     */
+
+    /*
+     *if (audioObjectType == MP4AUDIO_CELP)
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if (audioObjectType == MP4AUDIO_HVXC)
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if (audioObjectType == MP4AUDIO_TTSI)
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if ((audioObjectType == 13) || (audioObjectType == 14) ||
+     *   (audioObjectType == 15) || (audioObjectType == 16))
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /* The following objects are Amendment 1 objects */
+    /*
+     *if (((audioObjectType == MP4AUDIO_ER_AAC_LC)       ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_LTP)      ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) ||
+     *    (audioObjectType == MP4AUDIO_ER_TWINVQ)       ||
+     *    (audioObjectType == MP4AUDIO_ER_BSAC)         ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_LD)) && (status == -1))
+     *{
+     */
+    /*
+     * should call get_GA_specific_config
+     * for this release, do not support Error Resilience
+     * temporary solution is set status flag and exit decoding
+     */
+    /*    status = 1;
+    *}
+    */
+
+    /*
+     *if (audioObjectType == MP4AUDIO_ER_CELP)
+     * {
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if (audioObjectType == MP4AUDIO_ER_HVXC)
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if ((audioObjectType == MP4AUDIO_ER_HILN) ||
+     *    (audioObjectType == MP4AUDIO_PARAMETRIC))
+     *{
+     *    status = 1;
+     *}
+     */
+
+    /*
+     *if ((audioObjectType == MP4AUDIO_ER_AAC_LC)       ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_LTP)      ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE) ||
+     *    (audioObjectType == MP4AUDIO_ER_TWINVQ)       ||
+     *    (audioObjectType == MP4AUDIO_ER_BSAC)         ||
+     *    (audioObjectType == MP4AUDIO_ER_AAC_LD)       ||
+     *    (audioObjectType == MP4AUDIO_ER_CELP)         ||
+     *    (audioObjectType == MP4AUDIO_ER_HVXC)         ||
+     *    (audioObjectType == MP4AUDIO_ER_HILN)         ||
+     *    (audioObjectType == MP4AUDIO_PARAMETRIC))
+     *{
+     */
+    /* error protection config */
+    /*
+     *     epConfig =
+     *       getbits(
+     *           LEN_EP_CONFIG,
+     *           pInputStream);
+     *
+     *   if (epConfig == 2)
+     *   {
+     */
+    /* should call ErrorProtectionSpecificConfig() */
+    /*
+     *       status = 1;
+     *   }
+     *
+     *}
+     */
+
+    return status;
+
+}
diff --git a/media/libstagefright/codecs/aacdec/get_audio_specific_config.h b/media/libstagefright/codecs/aacdec/get_audio_specific_config.h
new file mode 100644
index 0000000..b7cfcf5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_audio_specific_config.h
@@ -0,0 +1,86 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/get_audio_specific_config.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes function declaration for get_audio_specific_config
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_AUDIO_SPECIFIC_CONFIG_H
+#define GET_AUDIO_SPECIFIC_CONFIG_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_tdec_int_file.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
+----------------------------------------------------------------------------*/
+Int get_audio_specific_config(
+    tDec_Int_File   * const pVars
+);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/get_dse.cpp b/media/libstagefright/codecs/aacdec/get_dse.cpp
new file mode 100644
index 0000000..d64087f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_dse.cpp
@@ -0,0 +1,215 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pInputStream = pointer to a BITS structure that holds information
+                   regarding the input stream.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    pInputStream->usedBits is rounded up to a number that represents the next
+    byte boundary.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Adquire Data Stream element (DSE) from raw bitstream
+    At this time this function just drops the information.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+  This function shall not use global or static variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+void byte_align(
+    BITS  *pInputStream)
+
+    MODIFYING(pInputStream->usedBits = pInputStream->usedBits +
+                (pInputStream->usedBits + 7) % 8)
+
+    RETURN(nothing)
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+
+ STACK USAGE:
+
+     where:
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES:
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+#include "get_dse.h"
+#include "ibstream.h"
+#include "getbits.h"
+#include "s_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 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 CODE
+----------------------------------------------------------------------------*/
+
+void get_dse(
+    Char    *DataStreamBytes,
+    BITS    *pInputStream)
+{
+    Int i;
+    Int data_byte_align_flag;
+    UInt count;
+    Int esc_count;
+    Char    *pDataStreamBytes;
+
+    pDataStreamBytes = DataStreamBytes;
+
+    /*
+     *  Get element instance tag  ( 4 bits)
+     *  ( max of 16 per raw data block)
+     */
+    get9_n_lessbits(LEN_TAG, pInputStream);
+
+    /*
+     *  get data_byte_align_flag ( 1 bit0 to see if byte alignment is
+     *  performed within the DSE
+     */
+    data_byte_align_flag = get1bits(pInputStream);
+
+    /*
+     *  get count ( 8 bits)
+     */
+    count =  get9_n_lessbits(LEN_D_CNT, pInputStream);
+
+    /*
+     *  if count == 255, its value it is incremented  by a
+     *  second 8 bit value, esc_count. This final value represents
+     *  the number of bytes in the DSE
+     */
+    if (count == (1 << LEN_D_CNT) - 1)
+    {
+        esc_count = (Int)get9_n_lessbits(LEN_D_ESC, pInputStream);  /* 8 bits */
+        count +=  esc_count;
+    }
+
+    /*
+     *  Align if flag is set
+     */
+    if (data_byte_align_flag)
+    {
+        byte_align(pInputStream);
+    }
+
+    for (i = count; i != 0; i--)
+    {
+        *(pDataStreamBytes++) = (Char) get9_n_lessbits(
+                                    LEN_BYTE,
+                                    pInputStream);
+    }
+
+    return;
+
+} /* end get_dse */
+
diff --git a/media/libstagefright/codecs/aacdec/get_dse.h b/media/libstagefright/codecs/aacdec/get_dse.h
new file mode 100644
index 0000000..3563f71
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_dse.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_dse.h
+ Funtions:
+    get_dse
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_DSE_H
+#define GET_DSE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_elelist.h"
+#include "s_bits.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
+----------------------------------------------------------------------------*/
+
+void get_dse(
+    Char    *DataStreamBytes,
+    BITS    *pInputStream);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/get_ele_list.cpp b/media/libstagefright/codecs/aacdec/get_ele_list.cpp
new file mode 100644
index 0000000..0534c13
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ele_list.cpp
@@ -0,0 +1,243 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_ele_list.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description: Change to PacketVideo standard, rename variables.
+
+ Description: Add own header file, make pInputStream second param for speed.
+
+ Description: Changes per code review:
+              1) Include header file
+              2) Convert to count down
+              3) Add return (not in review)
+
+ Description:
+ (1) Updated copyright header
+ (2) Replaced include of "interface.h" with "e_ProgConfig.h"
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Who:                                 Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pElementList = pointer to an EleList structure - only the field num_ele
+                   needs to be set. Data type pointer to EleList.
+
+   pInputStream = pointer to a BITS structure, used by the function getbits
+                   to provide data. Data type pointer to BITS
+
+    enableCPE = boolean value indicating the area to be read contains
+                a channel pair element field. Data type Bool
+
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs: None
+
+ Pointers and Buffers Modified:
+    pElementList contents are updated with information pertaining to channel
+        configuration.
+
+    pInputBuffer contents are updated to the next location to be read from
+        the input stream.
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function is called several times by get_prog_config() to read in part of
+ the program configuration data related to channel setup.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall not have static or global variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+   of moving pictures and associated audio information - Part 7: Advanced
+   Audio Coding (AAC)", Table 6.21 - Syntax of program_config_element(),
+   page 16, and section 8.5 "Program Config Element (PCE)", page 30.
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    elementCount = pElementList->num_ele;
+
+    FOR (index = 0; index < elementCount; index++)
+        IF (enableCPE != FALSE) THEN
+            pElementList->ele_is_cpe[index] =
+                getbits(LEN_ELE_IS_CPE, pInputStream);
+        ELSE
+            pElementList->ele_is_cpe[index] = 0;
+        END IF
+
+        pElementList->ele_tag[index] = getbits(LEN_TAG, pInputStream);
+
+    END FOR
+
+    RETURNS nothing
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_elelist.h"
+#include "s_bits.h"
+#include "e_progconfigconst.h"
+#include "ibstream.h"
+#include "get_ele_list.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 get_ele_list(
+    EleList     *pElementList,
+    BITS        *pInputStream,
+    const Bool   enableCPE)
+{
+    Int index;
+    Int *pEleIsCPE;
+    Int *pEleTag;
+
+    pEleIsCPE = &pElementList->ele_is_cpe[0];
+    pEleTag   = &pElementList->ele_tag[0];
+
+    for (index = pElementList->num_ele; index > 0; index--)
+    {
+        if (enableCPE != FALSE)
+        {
+            *pEleIsCPE++ = get1bits(/*LEN_ELE_IS_CPE, */pInputStream);
+        }
+        else
+        {
+            *pEleIsCPE++ = FALSE;
+        }
+
+        *pEleTag++ = get9_n_lessbits(LEN_TAG, pInputStream);
+
+    } /* end for (index) */
+
+    return;
+
+} /* end get_ele_list */
+
diff --git a/media/libstagefright/codecs/aacdec/get_ele_list.h b/media/libstagefright/codecs/aacdec/get_ele_list.h
new file mode 100644
index 0000000..82f140b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ele_list.h
@@ -0,0 +1,90 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/get_ele_list.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for get_ele_list.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_ELE_LIST_H
+#define GET_ELE_LIST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_elelist.h"
+#include "s_bits.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
+----------------------------------------------------------------------------*/
+void get_ele_list(
+    EleList     *pElementList,
+    BITS        *pInputStream,
+    const Bool   enableCPE);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_ga_specific_config.cpp b/media/libstagefright/codecs/aacdec/get_ga_specific_config.cpp
new file mode 100644
index 0000000..65c00ea
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ga_specific_config.cpp
@@ -0,0 +1,473 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_GA_specific_config.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified per review comments
+
+ Description: Change getbits.h to ibstream.h
+
+ Description: (1) use enum type for audioObjectType (2) update revision history
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Description: Updated to use scratch memory for the temporary prog config.
+
+ Description: Replace some instances of getbits to get1bits
+              when only 1 bit is read.
+
+ Who:                               Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+        pVars   = pointer to the structure that holds all information for
+                  this instance of the library. pVars->prog_config
+                  pVars->mc_info, pVars->pWinSeqInfo, pVars->SFBWidth128
+                  are needed for calling set_mc_info.
+                  Data type pointer to tDec_Int_File
+
+        channel_config = variable that indicates the channel configuration
+                         information, in this decoder library, only values
+                         0, 1, and 2 are allowed.
+                         Data type UInt
+
+        audioObjectType = variable that indicates the Audio Object Type.
+                          Data type UInt.
+
+        pInputStream = pointer to a BITS structure that holds information
+                       regarding the input stream.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    status = 0 if success
+             1 otherwise
+
+ Pointers and Buffers Modified:
+    pVars->mc_info contents are updated with channel information.
+    if infoinit is called within set_mc_info, then
+    pVars->pWinSeqInfo contents are updated with window information.
+    pVars->SFBWidth128 contents are updated with scale factor band width data.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function takes the sampling_rate_idx, channel_config, and
+ audioObjectType from AudioSpecificConfig() and set the decoder configuration
+ necessary for the decoder to decode properly.
+ It also reads the bitstream for frame length, scalable bitstream information
+ and extension information to General Audio defined in MPEG-4 phase 1
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+  This function shall not use global variables
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3: 1999(E)
+ Part 3
+ Subpart 1  p18     1.6 Interface to MPEG-4 Systems
+ Subpart 4  p13     4.4.1 GA Specific Configuration
+ Amendment  p10     6.2.1 AudioSpecificInfo
+ Amendment  p78     8.2 Decoder configuration (GASpecificConfig)
+
+ (2) AAC DecoderSpecificInfo Information
+   PacketVideo descriptions - San Diego
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    frameLenFlag = CALL getbits(
+                            neededBits = LEN_FRAME_LEN_FLAG,
+                            pInputStream = pInputStream);
+                        MODIFYING (pInputStream)
+                        RETURNING (frameLenFlag)
+
+    dependsOnCoreCoder = CALL getbits(
+                               neededBits = LEN_DEPEND_ON_CORE,
+                               pInputStream = pInputStream);
+                        MODIFYING (pInputStream)
+                        RETURNING (dependsOnCoreCoder)
+
+    IF (dependsOnCoreCoder != FALSE)
+    THEN
+        coreCoderDelay = CALL getbits(
+                                neededBits = LEN_CORE_DELAY,
+                                pInputStream = pInputStream);
+                            MODIFYING (pInputStream)
+                            RETURNING (coreCoderDelay)
+    ENDIF
+
+    extFlag = CALL getbits(
+                      neededBits = LEN_EXT_FLAG,
+                      pInputStream = pInputStream);
+                   MODIFYING (pInputStream)
+                   RETURNING (extFlag)
+
+    IF (channel_config == 0)
+    THEN
+        status = CALL get_prog_config(
+                        pVars = pVars,
+                        pScratchPCE = &pVars->scratch_prog_config);
+                   MODIFYING (pVars, pScratchPCE)
+                   RETURNING (status)
+
+    ELSE
+        channel_config--;
+        pVars->prog_config.front.ele_is_cpe[0] = channel_config;
+        pVars->prog_config.front.ele_tag[0] = 0;
+
+        status = CALL set_mc_info(
+                        pMC_Info =  &(pVars->mc_info),
+                        audioObjectType = audioObjectType,
+                        sampling_rate_idx = pVars->prog_config.sampling_rate_idx,
+                        tag = pVars->prog_config.front.ele_tag[0],
+                        is_cpe = pVars->prog_config.front.ele_is_cpe[0],
+                        pWinSeqInfo = pVars->pWinSeqInfo,
+                        sfbwidth128 = pVars->SFBWidth128);
+                    MODIFYING (pMC_Info, pWinSeqInfo, sfbwidth128)
+                    RETURNING (SUCCESS)
+    ENDIF
+
+    IF ((audioObjectType == MP4AUDIO_AAC_SCALABLE) OR
+        (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE))
+    THEN
+        layer_num = CALL getbits(
+                            neededBits = LEN_LAYER_NUM,
+                            pInputStream = pInputStream);
+                        MODIFYING (pInputStream)
+                        RETURNING (layer_num)
+
+        status = 1;
+    ENDIF
+
+    IF (extFlag != FALSE)
+    THEN
+         IF (audioObjectType == MP4AUDIO_ER_BSAC)
+         THEN
+              numOfSubFrame = CALL getbits(
+                                     neededBits = LEN_SUB_FRAME,
+                                     pInputStream = pInputStream);
+                                MODIFYING (pInputStream)
+                                RETURNING (numOfSubFrame)
+
+              layer_len = CALL getbits(
+                                neededBits = LEN_LAYER_LEN,
+                                pInputStream = pInputStream);
+                               MODIFYING (pInputStream)
+                               RETURNING (layer_len)
+
+         ENDIF
+
+         IF (((audioObjectType > 16) AND (audioObjectType < 22)) OR
+             (audioObjectType == 23))
+         THEN
+             aacSectionDataResilienceFlag =
+                            CALL getbits(
+                                    neededBits = LEN_SECT_RES_FLAG,
+                                    pInputStream = pInputStream);
+                                MODIFYING (pInputStream)
+                                RETURNING (aacSectionDataResilienceFlag)
+
+             aacScalefactorDataResilienceFlag =
+                            CALL getbits(
+                                    neededBits = LEN_SFB_RES_FLAG,
+                                    pInputStream = pInputStream);
+                                MODIFYING (pInputStream)
+                                RETURNING (aacScalefactorDataResilienceFlag)
+
+             aacSpectralDataResilienceFlag =
+                            CALL getbits(
+                                    neededBits = LEN_SPEC_RES_FLAG,
+                                    pInputStream = pInputStream);
+                                MODIFYING (pInputStream)
+                                RETURNING (aacSpectralDataResilienceFlag)
+         ENDIF
+
+        status = 1;
+
+    ENDIF
+
+    RETURN status;
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "e_mp4ff_const.h"
+#include    "e_tmp4audioobjecttype.h"
+#include    "s_tdec_int_file.h"
+#include    "get_ga_specific_config.h"
+#include    "set_mc_info.h"
+#include    "get_prog_config.h"
+#include    "ibstream.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
+----------------------------------------------------------------------------*/
+Int get_GA_specific_config(
+    tDec_Int_File * const pVars,
+    BITS    *pInputStream,
+    UInt     channel_config,
+    const tMP4AudioObjectType audioObjectType
+)
+{
+
+    Int status = SUCCESS;
+    UInt dependsOnCoreCoder;
+    /* Int coreCoderDelay; */
+    UInt extFlag;
+
+    /* These variables are left for future implementation */
+    /* UInt layer_num; */
+    /* UInt numOfSubFrame; */
+    /* UInt layer_len; */
+    /* UInt aacSectionDataResilienceFlag; */
+    /* UInt aacScalefactorDataResilienceFlag; */
+    /* UInt aacSpectralDataResilienceFlag; */
+    Int  extFlag3;
+
+    /*
+     * frame length flag == 0, 1024 samples/frame
+     * frame length flag == 1,  960 samples/frame
+     */
+    get1bits(/*            LEN_FRAME_LEN_FLAG,*/
+        pInputStream);
+
+    /*
+     * dependsOnCoreCoder == 1, core coder has different sampling rate
+     * in a scalable bitstream
+     */
+    dependsOnCoreCoder =
+        get1bits(/*            LEN_DEPEND_ON_CORE,*/
+            pInputStream);
+
+    if (dependsOnCoreCoder != FALSE)
+    {
+        /*coreCoderDelay =
+         *    getbits(
+         *        LEN_CORE_DELAY,
+         *        pInputStream);
+         */
+
+        status = 1; /* do not support scalable coding in this release */
+    }
+
+    /*
+     * extension flag indicates if Amendment 1 objects are used or not
+     * extension flag == 0 objects = 1, 2, 3, 4, 6, 7
+     * extension flag == 1 objects = 17, 19, 20, 21, 22, 23
+     */
+    extFlag = get1bits(pInputStream);       /*  LEN_EXT_FLAG,*/
+
+
+    /* Force checks for implicit channel configuration */
+    pVars->mc_info.implicit_channeling = 1;
+
+    if (status == SUCCESS)
+    {
+
+        if (channel_config == 0)
+        {
+            status = get_prog_config(pVars,
+                                     &pVars->scratch.scratch_prog_config);
+
+            if (status != SUCCESS)
+            {
+                pVars->prog_config.front.ele_is_cpe[0] = 0; /* default to mono  */
+                pVars->mc_info.nch = 1;
+                pVars->prog_config.front.ele_tag[0] = 0;
+
+                status = SUCCESS;
+            }
+        }
+        else
+        {
+            /*
+             * dummy tag = 0 and
+             * set up decoding configurations
+             */
+            channel_config--;
+            pVars->prog_config.front.ele_is_cpe[0] = channel_config;
+            pVars->prog_config.front.ele_tag[0] = 0;
+
+            status =
+                set_mc_info(
+                    &(pVars->mc_info),
+                    audioObjectType, /* previously profile */
+                    pVars->prog_config.sampling_rate_idx,
+                    pVars->prog_config.front.ele_tag[0],
+                    pVars->prog_config.front.ele_is_cpe[0],
+                    pVars->winmap, /*pVars->pWinSeqInfo,*/
+                    pVars->SFBWidth128);
+
+        } /* if (channel_config) */
+
+    } /* if(status) */
+
+    /*
+     * This layer_num is not found in ISO/IEC specs,
+     * but it is defined in San Diego spec for scalable bitstream
+     */
+    if ((audioObjectType == MP4AUDIO_AAC_SCALABLE) ||
+            (audioObjectType == MP4AUDIO_ER_AAC_SCALABLE))
+    {
+        /*layer_num =
+         *    getbits(
+         *        LEN_LAYER_NUM,
+         *        pInputStream);
+         */
+
+        status = 1; /* for this release only */
+    }
+
+    if (extFlag)
+    {
+        /*
+         * currently do not implement these functionalities
+         * defined in Amendment 1
+         * keep it here for future release
+         */
+        if (audioObjectType == MP4AUDIO_ER_BSAC)
+        {
+            status = 1;     /* NOT SUPPORTED */
+            /*
+            numOfSubFrame = getbits( LEN_SUB_FRAME, pInputStream);
+
+            layer_len = getbits( LEN_LAYER_LEN, pInputStream);
+            */
+        }
+
+        /*
+         * The following code is equivalent to
+         * if ((audioObjectType == 17) || (audioObjectType == 18) ||
+         *     (audioObjectType == 19) || (audioObjectType == 20) ||
+         *     (audioObjectType == 21) || (audioObjectType == 23))
+         */
+
+        if (((audioObjectType > 16) && (audioObjectType < 22)) ||
+                (audioObjectType == 23))
+        {
+            status = 1;     /* NOT SUPPORTED */
+            /*
+            aacSectionDataResilienceFlag = getbits( LEN_SECT_RES_FLAG,
+                                                    pInputStream);
+
+            aacScalefactorDataResilienceFlag = getbits( LEN_SCF_RES_FLAG,
+                                                        pInputStream);
+
+            aacSpectralDataResilienceFlag = getbits( LEN_SPEC_RES_FLAG,
+                                                     pInputStream);
+            */
+        }
+        /*
+         * this flag is tbd in version 3 of ISO/IEC spec
+         * if the encoder generates this bit, then it has to be read
+         * current adif2mp4ff does not write this bit. If this bit is to
+         * be read, it can be done by the following code:
+         */
+
+        extFlag3 = get1bits(pInputStream);       /*  LEN_EXT_FLAG3 */
+
+        if (extFlag3)
+        {
+            status = 1;     /* NOT SUPPORTED */
+        }
+
+    }
+
+    return status;
+}
diff --git a/media/libstagefright/codecs/aacdec/get_ga_specific_config.h b/media/libstagefright/codecs/aacdec/get_ga_specific_config.h
new file mode 100644
index 0000000..7c77da5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ga_specific_config.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_GA_specific_config.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) use enum type for audioObjectType
+              (2) update revision history
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes the function declaration for get_GA_specific_config.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_GA_SPECIFIC_CONFIG_H
+#define GET_GA_SPECIFIC_CONFIG_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_tdec_int_file.h"
+#include    "s_bits.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
+----------------------------------------------------------------------------*/
+Int get_GA_specific_config(
+    tDec_Int_File * const pVars,
+    BITS    *pInputStream,
+    UInt     channel_config,
+    const tMP4AudioObjectType audioObjectType
+);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_ics_info.cpp b/media/libstagefright/codecs/aacdec/get_ics_info.cpp
new file mode 100644
index 0000000..17204cc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ics_info.cpp
@@ -0,0 +1,608 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/get_ics_info.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Clean up code.
+
+ Description:  Fix comments before review, remove lpflag[]
+
+ Description:  Update per review comments, and match ISO/IEC 14496-3
+
+ Description:  Update per peer review comments.
+
+ Description:  Remove "rollback" of used bits, since lt_decode is to change.
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    audioObjectType = MP4 Audio Object Type for the current song. Only if
+                    this is set to LTP (MP4AUDIO_LTP) will long term
+                    prediction bits be retrieved. Data type
+                    tMP4AudioObjectType, which is an enumeration, which in
+                    turn is an Int.
+
+    pInputStream  = pointer to a BITS structure, used by the function getbits
+                    to provide data. This is the second parameter to this
+                    function to match its position in getbits().
+                    Data type pointer to BITS structure
+
+    common_window = field read in huffdecode, which tells whether information
+                    is shared between the left and right channel. Long term
+                    prediction (LTP) data is NOT shared even if its a common
+                    window, so this flag is needed to see if another set of
+                    LTP possibly needs to be read. If this flag is false,
+                    pSecondLTPStatus is not touched, it could be NULL if
+                    need be. Data type Bool, which is Int.
+
+    pWindowSequence = pointer to where the the window type of the current
+                    frame and channel should be placed, of data type
+                    WINDOW_SEQUENCE, which is Int. It can take on one
+                    of four values: ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE,
+                    EIGHT_SHORT_SEQUENCE, LONG_STOP_SEQUENCE,
+
+    pWindowShape =  pointer to where the window shape for the current frame
+                    and channel should be placed, of data type WINDOW_SHAPE,
+                    which is Int. It can take on the one of these two values:
+                    SINE_WINDOW, KAISER_BESSEL_WINDOW. It is used in the
+                    "filterbank" section of decoding.
+
+    group         = array that holds the index of the first window in each
+                    group. Data type array of Int, eight elements.
+
+    p_max_sfb     = pointer to where the maximum number of scale factor bands
+                    for the current frame and channel will be placed. Data
+                    type of pointer to Int.
+
+    p_winmap      = array of pointers to all of the possible four window
+                    configurations. This parameter did not need to be pointers,
+                    and could be changed in the future. Data type array of pointers
+                    to FrameInfo structures, length 4.
+
+    pFirstLTPStatus = pointer to a structure where the first LTP
+                    information will be stored. It would be confusing and wrong
+                    to call this left LTP status since if common_window = FALSE,
+                    this function will be called twice - once for the left, once
+                    for the right. It could be done, but extra conditional code
+                    would need to be done.
+                    Data type pointer to LT_PRED_STATUS structure.
+
+    pSecondLTPStatus = pointer to where the right channel of LTP
+                    information will be stored only if common_window is non-zero.
+                    Data type pointer to LT_PRED_STATUS structure.
+
+ Local Stores/Buffers/Pointers Needed: None.
+
+ Global Stores/Buffers/Pointers Needed: None.
+
+ Outputs:
+    status  = 0 implies no error occurred, non-zero otherwise.
+
+ Pointers and Buffers Modified:
+    pInputStream contents are modified in such a way that the number of bits
+        read increases.
+    pWindowSequence contents are updated with the current window for this
+        frame and channel
+    group[] contents will be modified to grouping information. See getgroup
+        source code for a better description of what this is.
+    p_max_sfb contents will be updated with the maximum scale factor bands
+        for this frame and channel.
+    pFirstLTPStatus contents may be updated if the stream has long term
+        prediction information.
+    pSecondLTPStatus contents may be updated if common_window != 0 and LTP data
+        is present.
+
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function retrieves the individual channel stream (ICS) information
+ from the bitstream. The information read for the current
+ frame and channel is:
+ - window sequence
+ - window shape for use in the filter bank
+ - number of scale factor bands
+ - long term predication (LTP) information
+ - grouping information
+
+ This function does NOT support MPEG2 style AAC Frequency Domain Predictor,
+ not to be confused with LTP (Long Term Prediction). If such data is found
+ to be on the file an error is generated.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function is not to use static or global data.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+  (1) ISO/IEC 14496-3:1999(E) Titled "Information technology - Coding
+      of audio-visual objects Part 3: Audio Subpart 4:"
+      Table 4.4.6 - Syntax of ics_info(), page 16.
+
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    status = 0;
+    first_ltp_data_present = FALSE;
+    second_ltp_data_present = FALSE;
+
+
+    CALL getbits(
+        neededBits = LEN_ICS_RESERV + LEN_WIN_SEQ + LEN_WIN_SH,
+        pInputStream = pInputStream)
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    windowSequence = (temp >> LEN_WIN_SH) & ((0x1<<LEN_WIN_SEQ)-1);
+
+    *pWindowShape = (temp) & ((0x1<<LEN_WIN_SH)-1);
+
+    IF (windowSequence == EIGHT_SHORT_SEQUENCE)
+    THEN
+        CALL getbits(
+            neededBits = LEN_MAX_SFBS,
+            pInputStream = pInputStream)
+        MODIFYING(pInputStream)
+        RETURNING(local_max_sfb = returnValue)
+
+        CALL getgroup(
+            group = group,
+            pInputStream = pInputStream)
+        MODIFYING(group)
+        MODIFYING(pInputStream)
+        RETURNING(nothing)
+
+
+    ELSE
+
+        group[0] = 1;
+
+        CALL getbits(
+            neededBits = LEN_MAX_SFBL + LEN_PREDICTOR_DATA_PRESENT,
+            pInputStream = pInputStream)
+        MODIFYING(pInputStream)
+        RETURNING(temp = returnValue)
+
+        predictor_data_present =
+            (Bool) getbits(
+                LEN_BOOLEAN,
+                pInputStream);
+
+        local_max_sfb = (Int)(temp >> LEN_PREDICTOR_DATA_PRESENT);
+
+        predictor_data_present =
+            (Bool) (temp & ((0x1 << LEN_PREDICTOR_DATA_PRESENT)-1));
+
+        IF (local_max_sfb > allowed_max_sfb)
+        THEN
+            status = 1
+        ELSEIF (audioObjectType == MP4AUDIO_LTP)
+        THEN
+            IF (predictor_data_present != FALSE)
+            THEN
+                CALL getbits(
+                    neededBits = LEN_LTP_DATA_PRESENT,
+                    pInputStream = pInputStream)
+                MODIFYING(pInputStream)
+                RETURNING(first_ltp_data_present = returnValue)
+
+                IF (ltp_data_present != FALSE)
+                THEN
+
+                    CALL lt_decode(
+                        win_type = windowSequence,
+                        pInputStream  = pInputStream,
+                        max_sfb = local_max_sfb,
+                        pLt_pred = pFirstLTPStatus)
+                    MODIFYING(pInputStream)
+                    MODIFYING(pFirstLTPStatus)
+                    RETURNING(nothing)
+
+                ENDIF
+
+                IF (common_window != FALSE)
+                THEN
+                    CALL getbits(
+                        neededBits = LEN_LTP_DATA_PRESENT,
+                        pInputStream = pInputStream)
+                    MODIFYING(pInputStream)
+                    RETURNING(second_ltp_data_present = returnValue)
+
+                    IF (second_ltp_data_present != FALSE)
+                    THEN
+
+                        CALL lt_decode(
+                            win_type = windowSequence,
+                            pInputStream  = pInputStream,
+                            max_sfb = local_max_sfb,
+                            pLt_pred = pSecondLTPStatus)
+                        MODIFYING(pInputStream)
+                        MODIFYING(pSecondLTPStatus)
+                        RETURNING(nothing)
+                    ENDIF
+                ENDIF
+            ENDIF
+        ELSE
+            IF  (predictor_data_present != FALSE)
+            THEN
+                status = 1
+            ENDIF
+        END IF
+    ENDIF
+
+    pFirstLTPStatus->ltp_data_present = first_ltp_data_present;
+
+    IF (common_window != FALSE)
+    THEN
+        pSecondLTPStatus->ltp_data_present = second_ltp_data_present;
+    ENDIF
+
+    pFrameInfo = p_winmap[*p_wnd];
+    IF (local_max_sfb > pFrameInfo->sfb_per_frame)
+    THEN
+        status = 1;
+    ENDIF
+
+    *(p_max_sfb) = local_max_sfb;
+
+    MODIFY(*(pWindowSequence))
+    MODIFY(*(pWinShape))
+    MODIFY(*(p_max_sfb))
+    MODIFY(group[])
+    MODIFY(*pInputStream)
+    MODIFY(*pFirstLTPStatus)
+    MODIFY(*pSecondLTPStatus)
+    RETURN (status);
+
+
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+
+#include "e_rawbitstreamconst.h"
+#include "e_tmp4audioobjecttype.h"
+
+#include "s_bits.h"
+#include "s_frameinfo.h"
+#include "s_lt_pred_status.h"
+
+#include "ibstream.h"
+#include "lt_decode.h"
+#include "ltp_common_internal.h" /* For LEN_LTP_DATA_PRESENT constant */
+
+#include "get_ics_info.h"
+#include "huffman.h"        /* For the declaration of getgroup */
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define LEN_PREDICTOR_DATA_PRESENT (1)
+
+/*----------------------------------------------------------------------------
+; 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 CODE
+----------------------------------------------------------------------------*/
+
+Int get_ics_info(
+    const tMP4AudioObjectType  audioObjectType,
+    BITS                      *pInputStream,
+    const Bool                 common_window,
+    WINDOW_SEQUENCE           *pWindowSequence,
+    WINDOW_SHAPE              *pWindowShape,
+    Int                        group[],
+    Int                       *p_max_sfb,
+    FrameInfo                 *p_winmap[],
+    LT_PRED_STATUS            *pFirstLTPStatus,
+    LT_PRED_STATUS            *pSecondLTPStatus)
+{
+    WINDOW_SEQUENCE       windowSequence;
+    UInt                  temp;
+    Bool                  predictor_data_present;
+    UInt                   local_max_sfb;
+    UInt                   allowed_max_sfb;
+    Int                   status = SUCCESS;
+    Bool                  first_ltp_data_present = FALSE;
+    Bool                  second_ltp_data_present = FALSE;
+
+    /*
+     * The following three calls to getbits have been replaced with one
+     * call for speed:
+     *
+     *                  getbits(LEN_ICS_RESERV, pInputStream);
+     * windowSequence = getbits(LEN_WIN_SEQ, pInputStream);
+     * *pWindowShape  = getbits(LEN_WIN_SH, pInputStream);
+     *
+     */
+
+    temp =
+        get9_n_lessbits(
+            LEN_ICS_RESERV + LEN_WIN_SEQ + LEN_WIN_SH,
+            pInputStream);
+
+
+    windowSequence = (WINDOW_SEQUENCE)((temp >> LEN_WIN_SH) & ((0x1 << LEN_WIN_SEQ) - 1));
+
+    *pWindowShape = (WINDOW_SHAPE)((temp) & ((0x1 << LEN_WIN_SH) - 1));
+
+    /*
+     * This pointer should not be NULL as long as the initialization code
+     * has been run, so the test for NULL has been removed.
+     */
+    allowed_max_sfb = p_winmap[windowSequence]->sfb_per_win[0];
+
+    if (windowSequence == EIGHT_SHORT_SEQUENCE)
+    {
+        local_max_sfb =  get9_n_lessbits(LEN_MAX_SFBS,
+                                         pInputStream);
+
+        getgroup(
+            group,
+            pInputStream);
+
+        if (local_max_sfb > allowed_max_sfb)
+        {
+            status = 1;  /* ERROR CODE - needs to be updated */
+        }
+
+    } /* end of TRUE of if (windowSequence == EIGHT_SHORT_SEQUENCE) */
+    else
+    {
+        /* There is only one group for long windows. */
+        group[0] = 1;
+
+        /*
+         * The window is long, get the maximum scale factor bands,
+         * and get long term prediction info.
+         *
+         * Reference [1] states that the audioObjectType is first tested,
+         * then the predictor_data_present is read on either branch of the
+         * if (audioObjectType == MP4AUDIO_LTP). Instead, this code combines
+         * the two calls on both branches into one before the
+         * if, and then in turn combines with another call to getbits, all
+         * in the name of speed.
+         *
+         * This would be the individual calls, without checking the number
+         * of scale factor bands:
+         *
+         *   local_max_sfb =
+         *      (Int) getbits(
+         *          LEN_MAX_SFBL,
+         *           pInputStream);
+         *
+         *  if (audioObjectType == MP4AUDIO_LTP)
+         *  {
+         *        predictor_data_present =
+         *           (Bool) getbits(
+         *              LEN_PREDICTOR_DATA_PRESENT,
+         *              pInputStream);
+         *
+         *     .....   (read LTP data)
+         *
+         *    }
+         *    else
+         *    {
+         *
+         *        predictor_data_present =
+         *           (Bool) getbits(
+         *              LEN_PREDICTOR_DATA_PRESENT,
+         *              pInputStream);
+         *
+         *     .....   (its an error for this library)
+         *     }
+         */
+        temp =
+            get9_n_lessbits(
+                LEN_MAX_SFBL + LEN_PREDICTOR_DATA_PRESENT,
+                pInputStream);
+
+        local_max_sfb = (Int)(temp >> LEN_PREDICTOR_DATA_PRESENT);
+
+        predictor_data_present =
+            (Bool)(temp & ((0x1 << LEN_PREDICTOR_DATA_PRESENT) - 1));
+
+        if (local_max_sfb > allowed_max_sfb)
+        {
+            status = 1;  /* ERROR CODE - needs to be updated */
+        }
+        else if (audioObjectType == MP4AUDIO_LTP)
+        {
+            /*
+             * Note that the predictor data bit has already been
+             * read.
+             */
+
+            /*
+             * If the object type is LTP, the predictor data is
+             * LTP. If the object type is not LTP, the predictor data
+             * is so called "frequency predictor data", which is not
+             * supported by this implementation. Refer to (1)
+             */
+            if (predictor_data_present != FALSE)
+            {
+                first_ltp_data_present =
+                    (Bool) get1bits(/*                        LEN_LTP_DATA_PRESENT,*/
+                        pInputStream);
+
+                if (first_ltp_data_present != FALSE)
+                {
+                    lt_decode(
+                        windowSequence,
+                        pInputStream,
+                        local_max_sfb,
+                        pFirstLTPStatus);
+                }
+                if (common_window != FALSE)
+                {
+                    second_ltp_data_present =
+                        (Bool) get1bits(/*                            LEN_LTP_DATA_PRESENT,*/
+                            pInputStream);
+
+                    if (second_ltp_data_present != FALSE)
+                    {
+                        lt_decode(
+                            windowSequence,
+                            pInputStream,
+                            local_max_sfb,
+                            pSecondLTPStatus);
+                    }
+                } /* if (common_window != FALSE) */
+
+            } /* if (predictor_data_present != FALSE) */
+
+        } /* else if (audioObjectType == MP4AUDIO_LTP) */
+        else
+        {
+            /*
+             * Note that the predictor data bit has already been
+             * read.
+             */
+
+            /*
+             * The object type is not LTP. If there is data, its
+             * frequency predictor data, not supported by this
+             * implementation.
+             */
+            if (predictor_data_present != FALSE)
+            {
+                status = 1; /* ERROR CODE UPDATE LATER */
+            } /* if (predictor_data_present != FALSE) */
+
+        } /* end of "else" clause of if (audioObjectType == MP4AUDIO_LTP) */
+
+    } /*  if (windowSequence == EIGHT_SHORT_SEQUENCE) [FALSE branch] */
+
+
+    /*
+     * Save all local copies.
+     */
+    pFirstLTPStatus->ltp_data_present = first_ltp_data_present;
+    if (common_window != FALSE)
+    {
+        pSecondLTPStatus->ltp_data_present = second_ltp_data_present;
+    }
+
+    *p_max_sfb = local_max_sfb;
+
+    *pWindowSequence = windowSequence;
+
+    return (status);
+
+}  /* get_ics_info */
+
diff --git a/media/libstagefright/codecs/aacdec/get_ics_info.h b/media/libstagefright/codecs/aacdec/get_ics_info.h
new file mode 100644
index 0000000..b94ef8e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_ics_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/get_ics_info.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Contains the declaration for the function get_ics_info()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_ICS_INFO_H
+#define GET_ICS_INFO_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_tmp4audioobjecttype.h"
+#include "s_bits.h"
+#include "e_window_sequence.h"
+#include "e_window_shape.h"
+#include "s_frameinfo.h"
+#include "s_lt_pred_status.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
+    ----------------------------------------------------------------------------*/
+    Int get_ics_info(
+        const tMP4AudioObjectType  audioObjectType,
+        BITS                      *pInputStream,
+        const Bool                 common_window,
+        WINDOW_SEQUENCE           *p_wnd,
+        WINDOW_SHAPE              *pWindowShape,
+        Int                        group[],
+        Int                       *p_max_sfb,
+        FrameInfo                 *p_winmap[],
+        LT_PRED_STATUS            *pFirstLTPStatus,
+        LT_PRED_STATUS            *pSecondLTPStatus);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif /* GET_ICS_INFO_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_prog_config.cpp b/media/libstagefright/codecs/aacdec/get_prog_config.cpp
new file mode 100644
index 0000000..6bddd57
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_prog_config.cpp
@@ -0,0 +1,739 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_prog_config.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Move functionality from get_adif_header for when to change
+               the current program configuration, add a temporary config
+               to read into, clean up code, change function prototype.
+
+ Description:  Clean up
+
+ Description:  Update per review comments
+
+ Description:  Fix double 'could'
+
+ Description:  change enter_mc_info to set_mc_info
+
+ Description:  update comments
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pVars      = pointer to the structure that holds all information for
+                 this instance of the library. pVars->prog_config is directly
+                 used, and pVars->mc_info, pVars->prog_config, pVars->winmap,
+                 pVars->SFBWidth128 are needed indirectly for calling
+                 set_mc_info. Data type  pointer to tDec_Int_File structure.
+
+    pScratchPCE = pointer to a temporary ProgConfig structure to be used
+                  to read in the program configuration element.
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+    status     = zero if no error was found, non-zero otherwise.
+
+ Pointers and Buffers Modified:
+    pVars->prog_config contents are updated with the PCE read in.
+    pVars->mc_info contents are updated with channel information.
+    pVars->winmap contents are updated with window information.
+    pVars->SFBWidth128 contents are updated with scale factor band width data.
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads from the input stream to memory for a temporary
+ program configuration element (PCE). If the PCE read is the first
+ encountered it is saved. Or, if the tag of the PCE read matches the tag of
+ the first PCE encounted, it is saved as well. This is a mechanism for
+ changing the sampling rate.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall not use static or global variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+   of moving pictures and associated audio information - Part 7: Advanced
+   Audio Coding (AAC)", Table 6.21 - Syntax of program_config_element(),
+   page 16, and section 8.5 "Program Config Element (PCE)", page 30.
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    status          = SUCCESS;
+    pInputStream   = &(pVars->inputStream);
+
+
+    CALL getbits(
+        neededBits = LEN_TAG,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( tag = returnValue )
+
+    CALL getbits(
+        neededBits = LEN_PROFILE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( pScratchPCE->profile = returnValue )
+
+    CALL getbits(
+        neededBits = LEN_PROFILE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( pScratchPCE->sampling_rate_idx = returnValue )
+
+    CALL getbits(
+        neededBits = LEN_NUM_ELE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->front.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_NUM_ELE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->side.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_NUM_ELE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->back.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_NUM_LFE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->lfe.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_NUM_DAT,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->data.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_NUM_CCE,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( temp = returnValue )
+
+    pScratchPCE->coupling.num_ele = temp;
+
+    CALL getbits(
+        neededBits = LEN_MIX_PRES,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( flag = returnValue )
+
+    pScratchPCE->mono_mix.present = flag;
+
+    IF (flag != FALSE)
+    THEN
+        CALL getbits(
+            neededBits = LEN_TAG,
+            pInputStream = pInputStream )
+        MODIFYING( pInputStream )
+        RETURNING( temp = returnValue )
+
+        pScratchPCE->mono_mix.ele_tag = temp;
+
+    ENDIF
+
+    CALL getbits(
+        neededBits = LEN_MIX_PRES,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( flag = returnValue )
+
+    pScratchPCE->stereo_mix.present = flag;
+
+    IF (flag != FALSE)
+    THEN
+
+        CALL getbits(
+            neededBits = LEN_TAG,
+            pInputStream = pInputStream )
+        MODIFYING( pInputStream )
+        RETURNING( temp = returnValue )
+
+        pScratchPCE->stereo_mix.ele_tag = temp;
+
+    ENDIF
+
+    CALL getbits(
+        neededBits = LEN_MIX_PRES,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( flag = returnValue )
+
+    flag =
+        getbits(
+            LEN_MIX_PRES,
+            pInputStream);
+
+    pScratchPCE->matrix_mix.present = flag;
+
+    IF (flag != FALSE)
+    THEN
+        CALL getbits(
+            neededBits = LEN_MMIX_IDX,
+            pInputStream = pInputStream )
+        MODIFYING( pInputStream )
+        RETURNING( temp = returnValue )
+
+        pScratchPCE->matrix_mix.ele_tag = temp;
+
+        CALL getbits(
+            neededBits = LEN_PSUR_ENAB,
+            pInputStream = pInputStream )
+        MODIFYING( pInputStream )
+        RETURNING( temp = returnValue )
+
+        pScratchPCE->matrix_mix.pseudo_enab = temp;
+
+    ENDIF
+
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->front,
+        pInputStream = pInputStream,
+        enableCPE    = TRUE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->front )
+    RETURNING( nothing )
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->side,
+        pInputStream = pInputStream,
+        enableCPE    = TRUE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->side )
+    RETURNING( nothing )
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->back,
+        pInputStream = pInputStream,
+        enableCPE    = TRUE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->back )
+    RETURNING( nothing )
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->lfe,
+        pInputStream = pInputStream,
+        enableCPE    = FALSE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->lfe )
+    RETURNING( nothing )
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->data,
+        pInputStream = pInputStream,
+        enableCPE    = FALSE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->data )
+    RETURNING( nothing )
+
+    CALL get_ele_list(
+        pElementList = &pScratchPCE->coupling,
+        pInputStream = pInputStream,
+        enableCPE    = TRUE )
+    MODIFYING( pInputStream )
+    MODIFYING( pScratchPCE->coupling )
+    RETURNING( nothing )
+
+
+    CALL byte_align(
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( nothing )
+
+    CALL getbits(
+        neededBits = LEN_COMMENT_BYTES,
+        pInputStream = pInputStream )
+    MODIFYING( pInputStream )
+    RETURNING( numChars = returnValue )
+
+    FOR (i = numChars; i > 0; i--)
+
+        CALL getbits(
+            neededBits = LEN_COMMENT_BYTES,
+            pInputStream = pInputStream )
+        MODIFYING( pInputStream )
+        RETURNING( nothing )
+
+    ENDFOR
+
+    IF (pVars->current_program < 0)
+    THEN
+        pVars->current_program = tag;
+    ENDIF
+
+
+    IF (tag == pVars->current_program)
+    THEN
+
+        CALL pv_memcpy(
+            to = &pVars->prog_config,
+            from = pScratchPCE,
+            n = sizeof(ProgConfig))
+        MODIFYING( pVars->prog_config )
+        RETURNING( nothing )
+
+        CALL set_mc_info(
+            pMC_Info = &pVars->mc_info,
+            objectType = pVars->prog_config.profile + 1,
+            samplin_rate_idx = pVars->prog_config.sampling_rate_idx,
+            tag = pVars->prog_config.front.ele_tag[0],
+            is_cpe = pVars->prog_config.front.ele_is_cpe[0],
+            pWinSeqInfo = pVars->winmap,
+            pSfbwidth128 = pVars->SFBWidth128)
+        MODIFYING( pVars->mc_info )
+        MODIFYING( pVars->winmap )
+        MODIFYING( pVars->SFBWidth128 )
+        RETURN( status = return_value )
+
+    ENDIF
+
+    MODIFY( pVars->mc_info )
+    MODIFY( pVars->winmap )
+    MODIFY( pVars->SFBWidth128 )
+    RETURN (status)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_bits.h"
+#include "s_elelist.h"
+#include "s_tdec_int_file.h"
+#include "s_tdec_int_chan.h"
+#include "e_progconfigconst.h"
+#include "ibstream.h"
+#include "get_ele_list.h"
+#include "aac_mem_funcs.h"
+#include "set_mc_info.h"
+#include "get_prog_config.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
+----------------------------------------------------------------------------*/
+
+Int get_prog_config(
+    tDec_Int_File *pVars,
+    ProgConfig    *pScratchPCE)
+{
+    Int    i;
+    UInt    tag;
+    Int    numChars;
+    UInt    temp;
+    Bool   flag;
+    Int    status          = SUCCESS;
+    BITS  *pInputStream   = &(pVars->inputStream);
+
+
+    /*
+     * The tag is used at the very end to see if this PCE is
+     * the one to be used. Otherwise it does not need to be saved for the
+     * the simple configurations to be used in this version of an AAC
+     * decoder.
+     *
+     * All of the bits of this PCE must be read even if this PCE will not
+     * be used. They are read into a temporary PCE, then later it is decided
+     * whether to keep this PCE.
+     *
+     * To allow quick removal of the fields from the ProgConfig structure
+     * that will probably not be used at a later date,
+     * while still advancing the bitstream pointer,the return value of
+     * getbits is saved into a temporary variable, then transfered to
+     * the structure item.
+     */
+    tag =
+        get9_n_lessbits(
+            LEN_TAG,
+            pInputStream);
+
+    pScratchPCE->profile =
+        get9_n_lessbits(
+            LEN_PROFILE,
+            pInputStream);
+
+    pScratchPCE->sampling_rate_idx =
+        get9_n_lessbits(
+            LEN_SAMP_IDX,
+            pInputStream);
+
+    if (!pVars->adif_test && pScratchPCE->sampling_rate_idx != pVars->prog_config.sampling_rate_idx)
+    {
+        /* rewind the pointer as implicit channel configuration maybe the case */
+        pInputStream->usedBits -= (LEN_TAG + LEN_PROFILE + LEN_SAMP_IDX);
+
+        return (1); /*  mismatch cannot happen */
+    }
+
+
+    /*
+     * Retrieve the number of element lists for each of
+     * front, side, back, lfe, data, and coupling.
+     *
+     * For two-channel stereo or mono, only the data in the front needs
+     * to be saved. However, ALL fields need to be skipped over in some
+     * fashion. Also, the number of elements needs to be temporarily saved
+     * to call get_ele_list(). If that function was changed to pass in
+     * the number of points to be read, the memory set aside inside the
+     * ProgConfig structure could be removed.
+     */
+
+    /*
+     * The next six function calls could be combined into one, then use
+     * shifts and masks to retrieve the individual fields.
+     */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_ELE,
+            pInputStream);
+
+    pScratchPCE->front.num_ele = temp;
+
+    /* Needed only to read in the element list. */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_ELE,
+            pInputStream);
+
+    pScratchPCE->side.num_ele = temp;
+
+    /* Needed only to read in the element list. */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_ELE,
+            pInputStream);
+
+    pScratchPCE->back.num_ele = temp;
+
+    /* Needed only to read in the element list. */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_LFE,
+            pInputStream);
+
+    pScratchPCE->lfe.num_ele = temp;
+
+    /* Needed only to read in the element list. */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_DAT,
+            pInputStream);
+    pScratchPCE->data.num_ele = temp;
+
+    /* Needed only to read in the element list. */
+    temp =
+        get9_n_lessbits(
+            LEN_NUM_CCE,
+            pInputStream);
+
+    pScratchPCE->coupling.num_ele = temp;
+
+    /*
+     * Read in mix down data.
+     *
+     * Whether these fields can be removed and have proper operation
+     * will be determined at a later date.
+     */
+
+    /* Read presence of mono_mix */
+    flag =
+        get1bits(/*            LEN_MIX_PRES,*/
+            pInputStream);
+
+    pScratchPCE->mono_mix.present = flag;
+
+    if (flag != FALSE)
+    {
+        temp =
+            get9_n_lessbits(
+                LEN_TAG,
+                pInputStream);
+
+        pScratchPCE->mono_mix.ele_tag = temp;
+
+    } /* end if (flag != FALSE) */
+
+    /* Read presence of stereo mix */
+    flag =
+        get1bits(/*            LEN_MIX_PRES,*/
+            pInputStream);
+
+    pScratchPCE->stereo_mix.present = flag;
+
+    if (flag != FALSE)
+    {
+        temp =
+            get9_n_lessbits(
+                LEN_TAG,
+                pInputStream);
+
+        pScratchPCE->stereo_mix.ele_tag = temp;
+
+    } /* end if (flag != FALSE) */
+
+    /* Read presence of matrix mix */
+    flag =
+        get1bits(/*            LEN_MIX_PRES,*/
+            pInputStream);
+
+    pScratchPCE->matrix_mix.present = flag;
+
+    if (flag != FALSE)
+    {
+        temp =
+            get9_n_lessbits(
+                LEN_MMIX_IDX,
+                pInputStream);
+
+        pScratchPCE->matrix_mix.ele_tag = temp;
+
+        temp =
+            get1bits(/*                LEN_PSUR_ENAB,*/
+                pInputStream);
+
+        pScratchPCE->matrix_mix.pseudo_enab = temp;
+
+    } /* end if (flag != FALSE) */
+
+    /*
+     * Get each of the element lists. Only the front information will be
+     * used for the PV decoder, but the usedBits field of pInputStream must
+     * be advanced appropriately.
+     *
+     * This could be optimized by advancing the bit stream for the
+     * elements that do not need to be read.
+     */
+    get_ele_list(
+        &pScratchPCE->front,
+        pInputStream,
+        TRUE);
+
+    get_ele_list(
+        &pScratchPCE->side,
+        pInputStream,
+        TRUE);
+
+    get_ele_list(
+        &pScratchPCE->back,
+        pInputStream,
+        TRUE);
+
+    get_ele_list(
+        &pScratchPCE->lfe,
+        pInputStream,
+        FALSE);
+
+    get_ele_list(
+        &pScratchPCE->data,
+        pInputStream,
+        FALSE);
+
+    get_ele_list(
+        &pScratchPCE->coupling,
+        pInputStream,
+        TRUE);
+
+    /*
+     * The standard requests a byte alignment before reading in the
+     * comment. This can be done because LEN_COMMENT_BYTES == 8.
+     */
+    byte_align(pInputStream);
+
+    numChars =
+        get9_n_lessbits(
+            LEN_COMMENT_BYTES, pInputStream);
+
+    /*
+     * Ignore the comment - it requires 65 bytes to store (or worse on DSP).
+     * If this field is restored, make sure to append a trailing '\0'
+     */
+    for (i = numChars; i > 0; i--)
+    {
+        pScratchPCE->comments[i] = (Char) get9_n_lessbits(LEN_BYTE,
+                                   pInputStream);
+
+    } /* end for */
+
+    if (pVars->current_program < 0)
+    {
+        /*
+         * If this is the first PCE, it becomes the current, regardless of
+         * its tag number.
+         */
+        pVars->current_program = tag;
+
+    } /* end if (pVars->current_program < 0) */
+
+
+    if (tag == (UInt)pVars->current_program)
+    {
+        /*
+         * This branch is reached under two conditions:
+         * 1) This is the first PCE found, it was selected in the above if
+         *    block. In all encoders found thus far, the tag value has been
+         *    zero.
+         * 2) A PCE has been sent by the encoder with a tag that matches the
+         *    the first one sent. It will then be re-read. No encoder found
+         *    thus far re-sends a PCE, when looking at ADIF files.
+         *
+         * Regardless, the temporary PCE will now be copied into the
+         * the one official program configuration.
+         */
+        pv_memcpy(
+            &pVars->prog_config,
+            pScratchPCE,
+            sizeof(ProgConfig));
+
+        /* enter configuration into MC_Info structure */
+        status =
+            set_mc_info(
+                &pVars->mc_info,
+                (tMP4AudioObjectType)(pVars->prog_config.profile + 1),
+                pVars->prog_config.sampling_rate_idx,
+                pVars->prog_config.front.ele_tag[0],
+                pVars->prog_config.front.ele_is_cpe[0],
+                pVars->winmap,
+                pVars->SFBWidth128);
+
+    } /* end if (tag == pVars->current_program) */
+
+    return (status);
+}
+
diff --git a/media/libstagefright/codecs/aacdec/get_prog_config.h b/media/libstagefright/codecs/aacdec/get_prog_config.h
new file mode 100644
index 0000000..646ba46
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_prog_config.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_prog_config.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                      Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for get_prog_config.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_PROG_CONFIG_H
+#define GET_PROG_CONFIG_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_progconfig.h"
+#include "s_tdec_int_file.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
+----------------------------------------------------------------------------*/
+Int get_prog_config(
+    tDec_Int_File *pVars,
+    ProgConfig    *pTempPCE);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_pulse_data.cpp b/media/libstagefright/codecs/aacdec/get_pulse_data.cpp
new file mode 100644
index 0000000..f9c24f4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_pulse_data.cpp
@@ -0,0 +1,286 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_pulse_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description: Put into PV format
+
+ Description: 1) Change loop to use pointers.
+              2) Rename to from get_nec_nc to get_pulse_data
+
+ Description: Changes per code review
+              1) Fix pathname
+              2) Read in two fields to save call to getbits
+              3) Change how pPulseInfo->number_pulse is stored.
+
+ Description: Placed typecast to Int in places where UInt->Int
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9.
+
+ Who:                                  Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+     pInputStream = pointer to a BITS structure, used by the function getbits
+                   to provide data. Data type pointer to BITS structure
+
+     pPulseInfo   = pointer to pulse data structure to be filled with data
+                    concerning pulses in the frequency domain.
+                    Data type pointer to PulseInfo
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+     status       = return value, zero signifies success, non-zero otherwise.
+                    Presently this function only returns a success, error
+                    checking may be added later.
+                    Data type Int.
+
+ Pointers and Buffers Modified:
+
+    pPulseInfo contents are updated with pulse information. Specifically,
+    pPulseInfo->number_pulse with the number of pulses found, and
+    pPulseInfo->pulse_start_sfb is set to the first scale factor band.
+    Then pPulseInfo->pulse_offset and pPulseInfo->pulse_amp are filled
+    with data. For these array, only the number of pulses defined will be
+    set, those values beyond the number of pulses will retain their previous
+    value and should not be read from.
+    Note: The value in pPulseInfo->number_pulse is different by a value of
+          one from the original ISO code.
+
+    pInputBuffer contents are updated to the next location to be read from
+        the input stream.
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function fills in the pulse data structure with information to be used
+ later for restoring pulses in the spectrum.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall not use global or static variables.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+  (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+      of moving pictures and associated audio information - Part 7: Advanced
+      Audio Coding (AAC)", Table 6.17 - Syntax of pulse_data(),
+      page 15, and section 9.3 "Decoding process", starting on page 41.
+
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    status = SUCCESS;
+
+    CALL getbits(neededBits = LEN_PULSE_NPULSE + LEN_PULSE_ST_SFB,
+                 pInputStream = pInputStream)
+    MODIFYING(*pInputStream)
+    RETURNING(temp)
+
+    pPulseInfo->number_pulse = 1 + (temp >> LEN_PULSE_ST_SFB);
+    pPulseInfo->pulse_start_sfb = temp & ((1 << LEN_PULSE_ST_SFB) - 1);
+
+    pPulseOffset = &pPulseInfo->pulse_offset[0];
+    pPulseAmp    = &pPulseInfo->pulse_amp[0];
+
+    FOR (i = PulseInfo->number_pulse; i > 0; i--)
+        CALL getbits(neededBits = LEN_PULSE_POFF + LEN_PULSE_PAMP,
+                     pInputStream = pInputStream)
+        MODIFYING(*pInputStream)
+        RETURNING(temp)
+
+        *pPulseOffset++ = temp >> LEN_PULSE_PAMP;
+        *pPulseAmp++    = temp & ((1 << LEN_PULSE_PAMP) - 1);
+    END FOR
+
+    MODIFYING (*pInputStream)
+    MODIFYING (*pPulseInfo)
+
+    RETURN status
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "ibstream.h"
+#include "s_pulseinfo.h"
+#include "s_bits.h"
+#include "e_rawbitstreamconst.h"
+#include "get_pulse_data.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 CODE
+----------------------------------------------------------------------------*/
+Int get_pulse_data(
+    PulseInfo   *pPulseInfo,
+    BITS        *pInputStream)
+{
+    Int   i;
+    Int  *pPulseOffset;
+    Int  *pPulseAmp;
+    Int   status = SUCCESS;
+    UInt  temp;
+
+    /*
+     * Read in both field fields at once to save cycles. These are the
+     * original lines of code:
+     * pPulseInfo->number_pulse = getbits(LEN_PULSE_NPULSE, pInputStream);
+     * pPulseInfo->pulse_start_sfb = getbits(LEN_PULSE_ST_SFB, pInputStream);
+     */
+
+    temp =
+        get9_n_lessbits(
+            LEN_PULSE_NPULSE + LEN_PULSE_ST_SFB,
+            pInputStream);
+
+    pPulseInfo->number_pulse = (Int)(1 + (temp >> LEN_PULSE_ST_SFB));
+    pPulseInfo->pulse_start_sfb = (Int)(temp & ((1 << LEN_PULSE_ST_SFB) - 1));
+
+    pPulseOffset = &pPulseInfo->pulse_offset[0];
+    pPulseAmp    = &pPulseInfo->pulse_amp[0];
+
+    /*
+     * This loop needs to count one more than the number read in from
+     * the bitstream - look at reference [1].
+     */
+
+    for (i = pPulseInfo->number_pulse; i > 0; i--)
+    {
+        /*
+         * Read in both fields. Original lines:
+         *  *pPulseOffset++ = getbits(LEN_PULSE_POFF, pInputStream);
+         *  *pPulseAmp++    = getbits(LEN_PULSE_PAMP, pInputStream);
+         */
+
+        temp =
+            get9_n_lessbits(
+                LEN_PULSE_POFF + LEN_PULSE_PAMP,
+                pInputStream);
+
+        *pPulseOffset++ = (Int)(temp >> LEN_PULSE_PAMP);
+
+        *pPulseAmp++    = (Int)(temp & ((1 << LEN_PULSE_PAMP) - 1));
+    }
+
+    return (status);
+}
+
diff --git a/media/libstagefright/codecs/aacdec/get_pulse_data.h b/media/libstagefright/codecs/aacdec/get_pulse_data.h
new file mode 100644
index 0000000..267f534
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_pulse_data.h
@@ -0,0 +1,100 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_pulse_data.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change structure name.
+
+ Who:                                      Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for get_pulse_data.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_PULSE_DATA_H
+#define GET_PULSE_DATA_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_pulseinfo.h"
+#include "s_bits.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
+    ----------------------------------------------------------------------------*/
+    Int get_pulse_data(
+        PulseInfo   *pPulseInfo,
+        BITS        *pInputStream);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /*  GET_PULSE_DATA_H  */
+
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_bitstream.cpp b/media/libstagefright/codecs/aacdec/get_sbr_bitstream.cpp
new file mode 100644
index 0000000..b6ec365
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_bitstream.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_bitstream.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    INPUT
+
+    SBRDECODER self,
+    SBRBITSTREAM * stream,
+    float *timeData,
+    int numChannels
+
+    OUTPUT
+
+    errorCode, noError if successful
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        sbr decoder processing, set up SBR decoder phase 2 in case of
+        different cotrol data
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+#include "get_sbr_bitstream.h"
+#include "pv_audio_type_defs.h"
+#include    "sbr_crc_check.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 get_sbr_bitstream(SBRBITSTREAM *sbrBitStream, BITS *pInputStream)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    Int32 count;
+    Int32 esc_count;
+    Int32 Extention_Type;
+    Int32 i;
+
+    count = get9_n_lessbits(LEN_F_CNT, pInputStream);
+    if (count == 15)
+    {
+        esc_count = get9_n_lessbits(LEN_F_ESC, pInputStream);
+        count = esc_count + 14;
+    }
+
+
+
+    Extention_Type = get9_n_lessbits(LEN_F_CNT, pInputStream);
+
+
+    if (((Extention_Type == SBR_EXTENSION) || (Extention_Type == SBR_EXTENSION_CRC))
+            && (count < MAXSBRBYTES) && (count) && (sbrBitStream->NrElements < MAXNRELEMENTS))
+    {
+
+        sbrBitStream->sbrElement[sbrBitStream->NrElements].ExtensionType = Extention_Type;
+        sbrBitStream->sbrElement[sbrBitStream->NrElements].Payload       = count;
+        sbrBitStream->sbrElement[sbrBitStream->NrElements].Data[0]       = (UChar) get9_n_lessbits(LEN_F_CNT, pInputStream);
+        for (i = 1 ; i < count ; i++)
+        {
+            sbrBitStream->sbrElement[sbrBitStream->NrElements].Data[i] = (UChar) get9_n_lessbits(8, pInputStream);
+        }
+
+        sbrBitStream->NrElements += 1;
+
+    }
+    else
+    {
+        pInputStream->usedBits += (count - 1) * LEN_BYTE;
+        pInputStream->usedBits += 4;        /* compenste for LEN_F_CNT (=4) bits read for Extention_Type */
+
+    }
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_bitstream.h b/media/libstagefright/codecs/aacdec/get_sbr_bitstream.h
new file mode 100644
index 0000000..8094b1a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_bitstream.h
@@ -0,0 +1,126 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_bitstream.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_SBR_BITSTREAM_H
+#define GET_SBR_BITSTREAM_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_bits.h"
+#include "ibstream.h"
+#include "e_rawbitstreamconst.h"
+#include "s_sbrbitstream.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void get_sbr_bitstream(SBRBITSTREAM *sbrBitStream,
+    BITS *pInputStream);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_startfreq.cpp b/media/libstagefright/codecs/aacdec/get_sbr_startfreq.cpp
new file mode 100644
index 0000000..38ddc0b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_startfreq.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_startfreq.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "get_sbr_startfreq.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
+----------------------------------------------------------------------------*/
+const Int v_offset[7][16] =
+{
+    { -8, -7, -6, -5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7},
+    { -5, -4, -3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13},
+    { -5, -3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16},
+    { -6, -4, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16},
+    { -4, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16, 20},
+    { -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16, 20, 24},
+    { 0,  1,  2,  3,  4,  5,  6,  7,  9, 11, 13, 16, 20, 24, 28, 33}
+};
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int get_sbr_startfreq(const Int32 fs,
+                      const Int32 start_freq)
+{
+    Int k0_min = 0;
+    Int32 index;
+
+
+    switch (fs)
+    {
+        case 16000:
+            index = 0;
+            k0_min = 24;
+            break;
+        case 22050:
+            index = 1;
+            k0_min = 17;
+            break;
+        case 24000:
+            index = 2;
+            k0_min = 16;
+            break;
+        case 32000:
+            index = 3;
+            k0_min = 16;
+            break;
+        case 44100:
+            index = 4;
+            k0_min = 12;
+            break;
+        case 48000:
+            index = 4;
+            k0_min = 11;
+            break;
+        case 64000:
+            index = 4;
+            k0_min = 10;
+            break;
+        case 88200:
+        case 96000:
+            index = 5;
+            k0_min = 7;
+            break;
+
+        default:
+            index = 6;
+    }
+    return (k0_min + v_offset[index][start_freq]);
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_startfreq.h b/media/libstagefright/codecs/aacdec/get_sbr_startfreq.h
new file mode 100644
index 0000000..10fa160
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_startfreq.h
@@ -0,0 +1,85 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_startfreq.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_SBR_STARTFREQ_H
+#define GET_SBR_STARTFREQ_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+Int get_sbr_startfreq(const Int32 fs,
+                      const Int32 start_freq);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.cpp b/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.cpp
new file mode 100644
index 0000000..e32c61d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_stopfreq.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+     if(fs < 32000)
+     {
+         k1_min = (Int) ( ( (float) (6000 * 2 * 64) / fs ) + 0.5 );
+     }
+     else
+     {
+         if (fs < 64000)
+         {
+             k1_min = (Int) ( ( (float) (8000 * 2 * 64) / fs ) + 0.5 );
+         }
+         else
+         {
+             k1_min = (Int) ( ((float) (10000 * 2 * 64) / fs ) + 0.5);
+         }
+     }
+
+     return((Int)( k1_min * pow( 64.0 / k1_min,(stop_freq)/13.0) + 0.5));
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include    "get_sbr_stopfreq.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
+----------------------------------------------------------------------------*/
+
+const UChar sbr_stopfreq_tbl[6][13] =
+{
+
+    { 21, 23, 25, 27, 29, 32, 35, 38, 41, 45, 49, 54, 59},  /* 48000  */
+    { 23, 25, 27, 29, 31, 34, 37, 40, 43, 47, 51, 55, 59},  /* 44100  */
+    { 32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61},  /* 32000  and 24000 */
+    { 35, 36, 38, 40, 42, 44, 46, 48, 50, 52, 55, 58, 61},  /* 22050  */
+    { 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62}   /* 16000  */
+
+};
+
+Int get_sbr_stopfreq(const Int32 fs,
+                     const Int32 stop_freq)
+{
+
+    Int i;
+
+    switch (fs)
+    {
+        case 48000:
+            i = 0;
+            break;
+
+        case 32000:
+        case 24000:
+            i = 2;
+            break;
+
+        case 22050:
+            i = 3;
+            break;
+
+        case 16000:
+            i = 4;
+            break;
+
+        case 44100:
+        default:
+            i = 1;
+            break;
+    }
+
+    return((Int)sbr_stopfreq_tbl[i][stop_freq]);
+
+}
+
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.h b/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.h
new file mode 100644
index 0000000..341a3d4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sbr_stopfreq.h
@@ -0,0 +1,85 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: get_sbr_stopfreq.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_SBR_STOPFREQ_H
+#define GET_SBR_STOPFREQ_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+Int get_sbr_stopfreq(const Int32 fs,
+                     const Int32 stop_freq);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_sign_bits.h b/media/libstagefright/codecs/aacdec/get_sign_bits.h
new file mode 100644
index 0000000..445d2f2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_sign_bits.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_sign_bits.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Update comments for the structure
+
+ Description: Change include file. Above description probably from another
+              header file.
+
+ Description: Fix pathname above
+
+ Who:                                               Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for the function get_sign_bits()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_SIGN_BITS_H
+#define GET_SIGN_BITS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "ibstream.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
+----------------------------------------------------------------------------*/
+
+void get_sign_bits(
+    Int          q[],
+    BITS        *pInputStream,
+    const Int    q_len
+);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif /* GET_SIGN_BITS_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/get_tns.cpp b/media/libstagefright/codecs/aacdec/get_tns.cpp
new file mode 100644
index 0000000..e0b021b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_tns.cpp
@@ -0,0 +1,573 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_tns.c
+
+     Date: 10/25/2000
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Brought code in-line with PV standards.  Some minor
+               optimizations (count-down for loops, etc.) were made.
+
+ Description:  Made cosmetic changes as suggested during review.  Also,
+ changed calculation of s_mask and n_mask from table-based to being
+ calculated based on res_index.  Also, the flag coef_res was changed
+ from having a range of [3,4] to having a range of [0,1], which corresponds
+ exactly with the true value that is passed via the bitstream.
+
+ Description:  Modified to use more efficient TNS memory structure.
+
+ Description: Updated to reflect more efficient usage of memory by the TNS
+ filters.
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Description: Moved pInputStream to be the 2nd parameter, for a slight
+ optimization on some platforms.
+
+ Description: Moved pSfbTop outside of the loops, since its value does
+ not change.
+
+ Description: Replace some instances of getbits to get1bits
+              when only 1 bit is read.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    FrameInfo *pFrameInfo
+        Pointer to structure that holds information about each block.
+        (long block flag,
+         number of subblocks,
+         scalefactor bands per subblock, etc.)
+
+    BITS *pInputStream
+        Pointer to a BITS structure that is
+        passed on to function getbits to pull information from the bitstream.
+
+    TNS_Frame_info *pTnsFrameInfo
+        Pointer to filter data structure - to be populated by this function.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    TNS_frame_info *pTnsFrameInfo
+
+    pTnsFrameInfo->n_filt = Number of tns filters to be applied to the data.
+
+    pTnsFrameInfo->filt[]->order = The order of each individual TNS filter.
+
+    pTnsFrameInfo->filt[]->coef_res = The resolution of the filter coefficients
+
+    pTnsFrameInfo->filt[]->start_band = start of spectral band
+
+    pTnsFrameInfo->filt[]->stop_band = end of spectral band
+
+    pTnsFrameInfo->filt[]->coef[] = Each filter's coefficients are filled with
+    data read from the input bitstream.
+
+    pTnsFrameInfo->filt[]->direction = A flag is set for each TNS filter.
+
+    If the direction flag (on the bitstream) = 0, then the filter
+    is applied to the block of spectral data in normal (upward) fashion.
+
+    If the direction flag (on the bitstream) = 1, then the filter
+    is applied in a reverse (downward) fashion.
+    (Starting with the last element in the block of data.)
+
+    The value stored in filt[]->direction maps the values [0,1] to [1,-1] for
+    a more intuitive storage of this flag's meaning.
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads the TNS filter information from the bitstream, and stores
+ the filter order, LPC coefficients, and the number of TNS filters to
+ be applied in the structure TNS_frame_info.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This code should match the ISO code in functionality, with the exception
+ that coef_res has range of [0,1] (PV code) instead of [3,4] (ISO code)
+
+ coef_res is only used by tns_decode_coef.
+
+------------------------------------------------------------------------------
+ REFERENCES
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.8 (Temporal Noise Shaping)
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor
+     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 "pv_audio_type_defs.h"
+#include "get_tns.h"
+#include "s_mc_info.h"
+#include "s_frameinfo.h"
+#include "s_tnsfilt.h"
+#include "s_tns_frame_info.h"
+#include "s_bits.h"
+#include "ibstream.h"
+#include "e_window_sequence.h"
+#include "e_progconfigconst.h"
+
+#include "tns_decode_coef.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#define SCALE_FACTOR_BAND_OFFSET(x) ( ((x) > 0) ? pSFB_top[(x)-1] : 0 )
+#define MINIMUM(x,y) ( ((x) < (y)) ? (x) : (y) )
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+/*
+ * The entries in the ensuing tables provide the maximum permissable
+ * number of scalefactor bands for each TNS filter.  This value is effected
+ * by the sampling rate, and window type.
+ */
+
+const Int tns_max_bands_tbl_long_wndw[(1<<LEN_SAMP_IDX)] =
+    {31,       /* 96000 Hz */
+     31,       /* 88200 Hz */
+     34,       /* 64000 Hz */
+     40,       /* 48000 Hz */
+     42,       /* 44100 Hz */
+     51,       /* 32000 Hz */
+     46,       /* 24000 Hz */
+     46,       /* 22050 Hz */
+     42,       /* 16000 Hz */
+     42,       /* 12000 Hz */
+     42,       /* 11025 Hz */
+     39,       /* 8000  Hz */
+     0,
+     0,
+     0,
+     0
+    };
+
+const Int tns_max_bands_tbl_short_wndw[(1<<LEN_SAMP_IDX)] =
+    {9,       /* 96000 Hz */
+     9,       /* 88200 Hz */
+     10,       /* 64000 Hz */
+     14,       /* 48000 Hz */
+     14,       /* 44100 Hz */
+     14,       /* 32000 Hz */
+     14,       /* 24000 Hz */
+     14,       /* 22050 Hz */
+     14,       /* 16000 Hz */
+     14,       /* 12000 Hz */
+     14,       /* 11025 Hz */
+     14,       /* 8000  Hz */
+     0,
+     0,
+     0,
+     0
+    };
+
+/*
+ * For completeness, here are the table entries for object types that make
+ * use of PQF filter bank.  We do not currently support this; these are
+ * given here only to ease future implementation.
+ *
+ *  const Int tns_max_bands_tbl_long_wndw_PQF[(1<<LEN_SAMP_IDX)] =
+ *         {28,       ; 96000
+ *          28,       ; 88200
+ *          27,       ; 64000
+ *          26,       ; 48000
+ *          26,       ; 44100
+ *          26,       ; 32000
+ *          29,       ; 24000
+ *          29,       ; 22050
+ *          23,       ; 16000
+ *          23,       ; 12000
+ *          23,       ; 11025
+ *          19,       ; 8000
+ *           0,
+ *           0,
+ *           0,
+ *           0};
+ *
+ *  const Int tns_max_bands_tbl_short_wndw_PQF[(1<<LEN_SAMP_IDX)] =
+ *         {7,       ; 96000
+ *          7,       ; 88200
+ *          7,       ; 64000
+ *          6,       ; 48000
+ *          6,       ; 44100
+ *          6,       ; 32000
+ *          7,       ; 24000
+ *          7,       ; 22050
+ *          8,       ; 16000
+ *          8,       ; 12000
+ *          8,       ; 11025
+ *          7,       ; 8000
+ *          0,
+ *          0,
+ *          0,
+ *          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 get_tns(
+    const Int               max_bands,
+    BITS            * const pInputStream,
+    const WINDOW_SEQUENCE   wnd_seq,
+    const FrameInfo * const pFrameInfo,
+    const MC_Info   * const pMC_Info,
+    TNS_frame_info  * const pTnsFrameInfo,
+    Int32                   scratchTnsDecCoefMem[])
+{
+
+    const Int16 * const pSFB_top = pFrameInfo->win_sfb_top[0];
+
+    Int f;
+    Int t;
+    Int win;
+    UInt tempInt;
+
+    Int num_filt_bits;
+    Int num_order_bits;
+    Int num_start_band_bits;
+
+    Int top;
+    Int res;
+    Int res_index;
+    Int compress;
+
+    Int sfb_per_win;
+
+    Int32 *pLpcCoef;
+    Int32 *pStartLpcCoef;
+    Int s_mask;
+    Int n_mask;
+
+    Int tns_bands;
+    UInt max_order;
+    Int coef_res;
+
+
+    TNSfilt *pFilt;
+
+    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
+    {
+        num_filt_bits  = 2;
+        num_order_bits = 5;
+        num_start_band_bits = 6;
+
+        tns_bands = tns_max_bands_tbl_long_wndw[pMC_Info->sampling_rate_idx];
+
+        /*
+         *  Definition from 14496-3:1999 doc. Our first encoder follows this rule,
+         *  later encoders don't
+         */
+
+        if (pMC_Info->sampling_rate_idx > 4)  /* if (sampling_rate <= 32000 */
+        {
+            max_order = 20;
+        }
+        else
+        {
+            max_order = 12;
+        }
+    }
+    else
+    {
+        num_filt_bits  = 1;
+        num_order_bits = 3;
+        num_start_band_bits = 4;
+
+        tns_bands = tns_max_bands_tbl_short_wndw[pMC_Info->sampling_rate_idx];
+
+        max_order = 7;
+    }
+
+    /*
+     * After this branch, tns_bands will be equal to the minimum of
+     * the passed in variable, nbands, and the result from the
+     * tns_max_bands_tbl
+     */
+
+    if (max_bands < tns_bands)
+    {
+        tns_bands = max_bands;
+    }
+
+    sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+    win = 0;
+
+    pLpcCoef = pTnsFrameInfo->lpc_coef;
+
+    pFilt = pTnsFrameInfo->filt;
+
+    do
+    {
+        tempInt = get9_n_lessbits(num_filt_bits,
+                                  pInputStream);
+
+        pTnsFrameInfo->n_filt[win] = tempInt;
+
+        if (tempInt != 0)
+        {
+            /*
+             * coef_res = [0, 1]
+             * Switch between a resolution of 3 and 4 bits respectively
+             *
+             * if coef_res = 0, the coefficients have a range of
+             *
+             *                 -4  -3  -2  -1  0   1   2   3
+             *
+             * if coef_res = 1, the coefficients have a range of
+             *
+             * -8  -7  -6  -5  -4  -3  -2  -1  0   1   2   3   4   5   6   7
+             *
+             * The arrays in ./src/tns_tab.c are completely based on
+             * the value of coef_res.
+             */
+            res = get1bits(
+                      pInputStream);
+
+            /* res is post-incremented for correct calculation of res_index */
+            coef_res = res++;
+
+            top = sfb_per_win;
+
+            for (f = pTnsFrameInfo->n_filt[win]; f > 0; f--)
+            {
+                tempInt = MINIMUM(top, tns_bands);
+
+                pFilt->stop_coef = SCALE_FACTOR_BAND_OFFSET(tempInt);
+
+                pFilt->stop_band = tempInt;
+
+                top -= get9_n_lessbits(num_start_band_bits,
+                                       pInputStream);
+
+                tempInt = MINIMUM(top, tns_bands);
+
+                pFilt->start_coef = SCALE_FACTOR_BAND_OFFSET(tempInt);
+
+                pFilt->start_band = tempInt;
+
+                tempInt = get9_n_lessbits(num_order_bits,
+                                          pInputStream);
+
+                pFilt->order = tempInt;
+
+                if (tempInt != 0)
+                {
+                    if (tempInt > max_order)
+                    {
+                        pFilt->order = max_order;
+                    }
+
+                    /*
+                     * This maps the bitstream's [0,1] to
+                     * pFilt->direction = [1,-1]
+                     */
+
+                    tempInt = get1bits(pInputStream);
+
+                    pFilt->direction = (-(Int)tempInt) | 0x1;
+
+                    /*
+                     * compress = [0,1]
+                     * If compress is true, the MSB has
+                     * been omitted from transmission (Ref. 1)
+                     *
+                     * For coef_res = 0, this limits the range of
+                     * transmitted coefficients to...
+                     *
+                     *         -2  -1  0   1
+                     *
+                     * For coef_res = 1, the coefficients have
+                     * a range of...
+                     *
+                     * -4  -3  -2  -1  0   1   2   3
+                     */
+                    compress = get1bits(pInputStream);
+
+                    /*
+                     * res has a range of [1,2]
+                     * compress has a range of [0,1]
+                     * So (res - compress) has range [0,2];
+                     */
+                    res_index = res - compress;
+
+                    s_mask =  2 << res_index;
+
+                    /*
+                     * If res_index = 0, grab 2 bits of data
+                     * If res_index = 1, grab 3 bits of data
+                     * If res_index = 2, grab 4 bits of data
+                     */
+                    res_index += 2;
+
+                    pStartLpcCoef = pLpcCoef;
+
+                    for (t = pFilt->order; t > 0; t--)
+                    {
+                        /*
+                         * These are the encoded coefficients, which will
+                         * later be decoded into LPC coefficients by
+                         * the function tns_decode_coef()
+                         */
+                        tempInt = get9_n_lessbits(res_index,
+                                                  pInputStream);
+
+                        n_mask  = -((Int)tempInt & s_mask);
+
+                        /*
+                         * n_mask is used to sign_extend the
+                         * value, if it is negative.
+                         *
+                         */
+                        *(pLpcCoef++) = tempInt | n_mask;
+                    }
+
+                    /* Decode the TNS coefficients */
+
+                    tempInt = pFilt->stop_coef - pFilt->start_coef;
+
+                    if (tempInt > 0)
+                    {
+                        pFilt->q_lpc =
+                            tns_decode_coef(
+                                pFilt->order,
+                                coef_res,
+                                pStartLpcCoef,
+                                scratchTnsDecCoefMem);
+                    }
+
+                } /* if (pTnsFilt->order != 0) */
+
+                pFilt++;
+
+            } /* END for (f=pTnsInfo->n_filt; f>0; f--, pTnsFilt++) */
+
+        } /* if (pTnsInfo->n_filt != 0) */
+
+        win++;
+
+    }
+    while (win < pFrameInfo->num_win);
+
+    return;
+
+} /* get_tns */
diff --git a/media/libstagefright/codecs/aacdec/get_tns.h b/media/libstagefright/codecs/aacdec/get_tns.h
new file mode 100644
index 0000000..731484f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/get_tns.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: get_tns.h
+
+   Author:
+     Date: 03/08/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description: Modified to include updated function declaration, which reflects
+ the combination of the get_tns and tns_setup_filter routines.  Also, moved
+ pInputStream to be the 2nd parameter, for a slight optimization.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+  This file includes the function definition for get_tns.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GET_TNS_H
+#define GET_TNS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_frameinfo.h"
+#include "s_mc_info.h"
+#include "s_tns_frame_info.h"
+#include "s_bits.h"
+#include "e_window_sequence.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
+    ----------------------------------------------------------------------------*/
+    void get_tns(
+        const Int               max_bands,
+        BITS            * const pInputStream,
+        const WINDOW_SEQUENCE   wnd_seq,
+        const FrameInfo * const pFrameInfo,
+        const MC_Info   * const pMC_Info,
+        TNS_frame_info  * const pTnsFrameInfo,
+        Int32                   scratchTnsDecCoefMem[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GET_TNS_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/getbits.h b/media/libstagefright/codecs/aacdec/getbits.h
new file mode 100644
index 0000000..e854be5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getbits.h
@@ -0,0 +1,346 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getbits.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Update comments for the structure
+
+ Description: Move structur to another file
+
+ Who:                                            Date: MM/DD/YYYY
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for the function getbits().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GETBITS_H
+#define GETBITS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "ibstream.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
+    ----------------------------------------------------------------------------*/
+
+#define INBUF_ARRAY_INDEX_SHIFT  (3)
+#define INBUF_BIT_WIDTH         (1<<(INBUF_ARRAY_INDEX_SHIFT))
+#define INBUF_BIT_MODULO_MASK   ((INBUF_BIT_WIDTH)-1)
+
+#define MAX_GETBITS             (25)
+
+#define  CHECK_INPUT_BUFFER_LIMITS  1
+
+    __inline UInt32 getbits(
+        const UInt  neededBits,
+        BITS       *pInputStream)
+    {
+        UInt32   returnValue = 0;
+        UInt     offset;
+        UInt     bitIndex;
+        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
+
+        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+        pElem = pInputStream->pBuffer + offset;
+
+#if CHECK_INPUT_BUFFER_LIMITS
+
+        offset =  pInputStream->inputBufferCurrentLength - offset;
+        /*  check if access to input buffer does not go beyond boundaries */
+        if (offset > 3)
+        {
+            returnValue = (((UInt32) * (pElem)) << 24) |
+                          (((UInt32) * (pElem + 1)) << 16) |
+                          (((UInt32) * (pElem + 2)) << 8) |
+                          ((UInt32) * (pElem + 3));
+        }
+        else  /*  then access only available bytes  */
+        {
+            /*  Access to the bitstream beyond frame boundaries are not allowed,
+             *  Here, only what was available before the end of the frame will
+             *  be processed. Non-accessible bytes will be filled in with zeros.
+             *  Zero values guarantees that the data structures are filled in with values
+             *  that eventually will signal an error (like invalid parameters) or that allow
+             *  completion of the parsing routine.
+             *  Overrun is detected on file pvmp4audiodecodeframe.cpp.
+             */
+            switch (offset)
+            {
+                case 3:
+                    returnValue  = (((UInt32) * (pElem + 2)) << 8);
+                case 2:
+                    returnValue |= (((UInt32) * (pElem + 1)) << 16);
+                case 1:
+                    returnValue |= (((UInt32) * (pElem)) << 24);
+                default:
+                    break;
+            }
+        }
+
+
+#else
+
+        returnValue = (((UInt32) * (pElem)) << 24) |
+                      (((UInt32) * (pElem + 1)) << 16) |
+                      (((UInt32) * (pElem + 2)) << 8) |
+                      ((UInt32) * (pElem + 3));
+#endif
+
+        /* Remove extra high bits by shifting up */
+        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
+
+        /* This line is faster way to mask off the high bits. */
+        returnValue = returnValue << (bitIndex);
+
+        /* Move the field down. */
+        returnValue = returnValue >> (32 - neededBits);
+
+        pInputStream->usedBits += neededBits;
+
+        return (returnValue);
+
+    }
+
+
+
+    __inline UInt get1bits(
+        BITS       *pInputStream)
+    {
+        UInt     returnValue;
+        UInt     offset;
+        UInt     bitIndex;
+        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
+
+        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+        pElem = pInputStream->pBuffer + offset;
+
+#if CHECK_INPUT_BUFFER_LIMITS
+        returnValue = (offset < pInputStream->inputBufferCurrentLength) ? ((UInt) * (pElem)) : 0;
+#else
+        returnValue = ((UInt32) * (pElem));
+#endif
+
+
+        /* Remove extra high bits by shifting up */
+        bitIndex = (UInt)((pInputStream->usedBits++) & INBUF_BIT_MODULO_MASK);
+
+        /* This line is faster way to mask off the high bits. */
+        returnValue = 0xFF & (returnValue << (bitIndex));
+
+        /* Move the field down. */
+
+        return ((UInt)(returnValue >> 7));
+
+    }
+
+
+
+    __inline UInt get9_n_lessbits(
+        const UInt  neededBits,
+        BITS       *pInputStream)
+
+    {
+        UInt     returnValue;
+        UInt     offset;
+        UInt     bitIndex;
+        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
+
+        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+        pElem = pInputStream->pBuffer + offset;
+
+#if CHECK_INPUT_BUFFER_LIMITS
+
+
+        offset =  pInputStream->inputBufferCurrentLength - offset;
+        /*  check if access to input buffer does not go beyond boundaries */
+        if (offset > 1)
+        {
+            returnValue = (((UInt32) * (pElem)) << 8) |
+                          ((UInt32) * (pElem + 1));
+        }
+        else  /*  then access only available bytes  */
+        {
+            /*  Access to the bitstream beyond frame boundaries are not allowed,
+             *  Here, only what was available before the end of the frame will
+             *  be processed. Non-accessible bytes will be filled in with zeros.
+             *  Zero values guarantees that the data structures are filled in with values
+             *  that eventually will signal an error (like invalid parameters) or that allow
+             *  completion of the parsing routine.
+             *  Overrun is detected on file pvmp4audiodecodeframe.cpp
+             */
+            switch (offset)
+            {
+                case 1:
+                    returnValue  = (((UInt32) * (pElem)) << 8);
+                    break;
+                default:
+                    returnValue = 0;
+                    break;
+            }
+        }
+
+
+#else
+        returnValue = (((UInt32) * (pElem)) << 8) |
+                      ((UInt32) * (pElem + 1)) ;
+#endif
+
+        /* Remove extra high bits by shifting up */
+        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
+
+        pInputStream->usedBits += neededBits;
+
+        /* This line is faster way to mask off the high bits. */
+        returnValue = 0xFFFF & (returnValue << (bitIndex));
+
+        /* Move the field down. */
+
+        return (UInt)(returnValue >> (16 - neededBits));
+
+    }
+
+    __inline UInt32 get17_n_lessbits(
+        const UInt  neededBits,
+        BITS       *pInputStream)
+    {
+        UInt32   returnValue;
+        UInt     offset;
+        UInt     bitIndex;
+        UChar    *pElem;        /* Needs to be same type as pInput->pBuffer */
+
+        offset = (pInputStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+        pElem = pInputStream->pBuffer + offset;
+
+#if CHECK_INPUT_BUFFER_LIMITS
+
+        offset =  pInputStream->inputBufferCurrentLength - offset;
+        /*  check if access to input buffer does not go beyond boundaries */
+
+        if (offset > 2)
+        {
+            returnValue = (((UInt32) * (pElem)) << 16) |
+                          (((UInt32) * (pElem + 1)) << 8) |
+                          ((UInt32)  * (pElem + 2));
+        }
+        else   /*  then access only available bytes  */
+        {
+            /*  Access to the bitstream beyond frame boundaries are not allowed,
+             *  Here, only what was available before the end of the frame will
+             *  be processed. Non-accessible bytes will be filled in with zeros.
+             *  Zero values guarantees that the data structures are filled in with values
+             *  that eventually will signal an error (like invalid parameters) or that allow
+             *  completion of the parsing routine.
+             *  Overrun is detected on file pvmp4audiodecodeframe.cpp
+             */
+            returnValue = 0;
+            switch (offset)
+            {
+                case 2:
+                    returnValue  = (((UInt32) * (pElem + 1)) << 8);
+                case 1:
+                    returnValue |= (((UInt32) * (pElem)) << 16);
+                default:
+                    break;
+            }
+        }
+
+#else
+
+        returnValue = (((UInt32) * (pElem)) << 16) |
+                      (((UInt32) * (pElem + 1)) << 8) |
+                      ((UInt32)  * (pElem + 2));
+#endif
+
+        /* Remove extra high bits by shifting up */
+        bitIndex = (UInt)((pInputStream->usedBits) & INBUF_BIT_MODULO_MASK);
+
+        /* This line is faster way to mask off the high bits. */
+        returnValue = 0xFFFFFF & (returnValue << (bitIndex));
+
+        /* Move the field down. */
+        returnValue = returnValue >> (24 - neededBits);
+
+        pInputStream->usedBits += neededBits;
+
+        return (returnValue);
+
+    }
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif /* GETBITS_H*/
+
+
diff --git a/media/libstagefright/codecs/aacdec/getfill.cpp b/media/libstagefright/codecs/aacdec/getfill.cpp
new file mode 100644
index 0000000..3c4fc4c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getfill.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getfill.c
+ Funtions: getfill
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  1. Used template to re-organize function and filled out
+                  Input/Output and Function definition section.
+               2. Optimized code.
+
+ Description:  Made the following changes based on review comments.
+               1. Exchanging MODIFYING and RETURNING on line 87, 88.
+               2. Added MPEG reference.
+               3. Changed "fill" to "pass over", "bitstreams are" to
+                  "bitstream is" in FUNCTION DESCRIPTION section.
+               4. Fixed tabs.
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pInputStream = pointer to structure BITS containing input stream
+                   information.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    pInputStream->usedBits is updated to the newly calculated value.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function passes over fill bits in the raw data block to adjust the
+ instantaneous bit rate when the bitstream is to be transmitted over a
+ constant rate channel.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+     Subpart 4      p15     (Table 4.4.11)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    CALL getbits(
+            LEN_F_CNT,
+            pInputStream);
+    MODIFYING (pInputStream)
+    RETURNING (cnt)
+
+    IF ( cnt == (1<<LEN_F_CNT)-1 )
+
+        CALL getbits(
+                LEN_F_ESC,
+                pInputStream);
+        MODIFYING (pInputStream)
+        RETURNING (esc_cnt)
+
+        cnt +=  esc_cnt - 1;
+
+    ENDIF
+
+    pInputStream->usedBits += cnt * LEN_BYTE;
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_bits.h"
+#include "ibstream.h"
+#include "e_rawbitstreamconst.h"
+#include "getfill.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 GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void getfill(BITS *pInputStream)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Int cnt;
+    Int esc_cnt;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    cnt = get9_n_lessbits(
+              LEN_F_CNT,
+              pInputStream);
+
+    if (cnt == (1 << LEN_F_CNT) - 1)  /* if (cnt == 15) */
+    {
+        esc_cnt = get9_n_lessbits(
+                      LEN_F_ESC,
+                      pInputStream);
+
+        cnt +=  esc_cnt - 1;
+    }
+
+    /*
+     * The following codes are replaced by directly updating usedBits
+     * in BITS structure. This will save one call for getbits().
+     *
+     * for (i=0; i<cnt; i++)
+     * { getbits(LEN_BYTE, pInputStream); }
+     */
+
+    pInputStream->usedBits += cnt * LEN_BYTE;
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+
+} /* getfill */
+
diff --git a/media/libstagefright/codecs/aacdec/getfill.h b/media/libstagefright/codecs/aacdec/getfill.h
new file mode 100644
index 0000000..3ba976a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getfill.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getfill.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed "definition" to "declaration" on line 28 per
+              review comments.
+
+ Who:                           Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file contains prototype declaration for getfill function.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef GETFILL_H
+#define GETFILL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_bits.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
+----------------------------------------------------------------------------*/
+void getfill(BITS    *pInputStream);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/getgroup.cpp b/media/libstagefright/codecs/aacdec/getgroup.cpp
new file mode 100644
index 0000000..0f909cd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getgroup.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getgroup.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description: (1) Modified to bring code in-line with PV standards
+              (2) Eliminated if(first_short) statement, move for-loop
+                  inside if statement
+              (3) Modified UChar -> Int on data types of group
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less.
+
+ Who:                       Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pInputStream = pointer to structure that holds input bitstream
+                   information. Type BITS
+
+    group[]     = array that holds the index of the first window in each
+                  group. Type Int
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    group   contains the index of first windows in each group
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads the window grouping information associated with an
+ Individual Channel Stream (ICS). If the window sequence is
+ EIGHT_SHORT_SEQUENCE, scalefactor grouping information is transmitted. If a
+ set of short windows form a group then they share scalefactors, intensity
+ positions and PNS information. The first short window is always a new group
+ so no grouping bit is transmitted. Subsequent short windows are in the same
+ group if the associated grouping bit is 1. A new group is started if the
+ associated grouping bit is 0.
+ The pointer pGroup points to an array that stores the first window index
+ of next group. For example, if the window grouping is:
+
+ window index:    |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |
+ grouping    :    |<-   0   ->|  1  |<-    2        ->|<-   3   ->|
+
+ Then:
+
+    group[]  :    |     2     |  3  |        6        |     8     |
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should replace the contents of the array pointed to by pGroup
+ with the first window indexes of groups starting from the second group.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4
+                    p16 (Table 4.4.6)
+                    p55 (Recovering ics_info)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF (pFrameInfo->coef_per_win[0] > SN2)
+
+        *pGroup++ = 1;
+        *pGroup   = 1;
+
+    ELSE
+
+        FOR (win = 1; win < pFrameInfo->num_win; win++)
+
+            IF (getbits(1,pInputStream) == 0)
+
+                *pGroup++ = win;
+
+            ENDIF
+
+        ENDFOR (win)
+
+        *pGroup = win;
+
+    ENDIF(pFrameInfo)
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "huffman.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define     SEVEN   7
+
+/*----------------------------------------------------------------------------
+; 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 getgroup(
+    Int         group[],
+    BITS        *pInputStream)
+{
+    Int      win;
+    Int     *pGroup;
+    UInt     mask;
+    UInt     groupBits;
+
+    pGroup      = group;
+
+    mask        = 0x40;
+
+    /* only short-window sequences are grouped!
+     * first short window is always a new group,
+     * start reading bitstream from the second
+     * window, a new group is indicated by an
+     * "0" bit in the input stream
+     */
+    groupBits =
+        get9_n_lessbits(
+            SEVEN,
+            pInputStream);
+
+    for (win = 1; win < NUM_SHORT_WINDOWS; win++)
+    {
+        if ((groupBits & mask) == 0)
+        {
+            *pGroup++ = win;
+
+        } /* if (groupBits) */
+
+        mask >>= 1;
+
+    } /* for (win) */
+
+    *pGroup = win;
+
+} /* getgroup */
diff --git a/media/libstagefright/codecs/aacdec/getics.cpp b/media/libstagefright/codecs/aacdec/getics.cpp
new file mode 100644
index 0000000..8d76744
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getics.cpp
@@ -0,0 +1,674 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getics.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables
+
+ Description: Remove pass-in parameter global_gain, define it on stack.
+
+ Description: (1) Modified to bring in-line with PV standards
+              (2) Modified pass in parameters
+              (3) Removed multiple returns, removed some if branch
+              (4) Replace for loop with pv_memset
+
+ Description: Remove prstflag, fix copyright.
+
+ Description: Fix pseudo-code
+
+ Description: Remove lpflag from get_ics_info
+
+ Description: (1) Removed widx, therefore, pChVarsWin is eliminated from
+                  pass in parameter
+
+ Description: merged the above changes from Michael and Wen
+
+ Description: Removed initialization of "pTnsFrameInfo->num_subblocks" since
+ this element was removed from that structure, as a part of
+ rearchitecting the TNS routines to use memory more efficiently.
+
+ Description:
+ (1) Added #include of "e_HuffmanConst.h"
+     Previously, this function was relying on another include file
+     to include "e_HuffmanConst.h"
+
+ (2) Updated the copyright header.
+
+ (3) Added #include of <stdlib.h> for NULL macro definition.
+
+ Description:
+ (1) Removed the first parameter to getics.c  This extra
+     FrameInfo was not needed, the contents of winmap can be used.
+ (2) Removed the memcpy of the data from winmap to the temporary
+     FrameInfo.
+
+ Description: Replace some instances of getbits to get1bits
+              when only 1 bit is read.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pInputStream    =   pointer to structure that holds input stream,
+                        Type BITS
+
+    common_window   =   flag that indicates whether left and right channel
+                        share the same window sequence & shape, Type Int
+
+    pVars           =   pointer to structure that holds decoder information
+                        Type tDec_Int_File
+
+    pChVarsCh       =   pointer to structure that holds channel related
+                        decoding information, Type tDec_Int_Chan
+
+    group[]         =   pointer to array that contains window grouping
+                        information of current frame, Type UChar
+
+    pMax_sfb        =   pointer to variable that stores maximum active
+                        scalefactor bands of current frame, Type UChar
+
+    pCodebookMap    =   pointer to array that holds the indexes of all
+                        Huffman codebooks used for current frame, ordered
+                        from section 0 to last section. Type UChar
+
+    pTnsFrameInfo   =   pointer to structure that holds TNS information.
+                        Type TNS_frame_info
+
+    pWinMap         =   array of pointers which points to structures that
+                        hold information of long and short window sequences
+                        Type FrameInfo
+
+    pPulseInfo       =   pointer to structure that holds pulse data decoding
+                        information, Type Nec_info
+
+    sect[]          =   array of structures that hold section codebook and
+                        section length in current frame, Type SectInfo
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    status = 0  if success
+             1  otherwise
+
+ Pointers and Buffers Modified:
+    pCodebookMap    contents are replaced by the indexes of all the huffman
+                    codebooks used for current frame
+
+    pWinMap         For short windows, the contents of frame_sfb_top are
+                    modified by calc_gsfb_table, with the top coefficient
+                    index of each scalefactor band.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function decodes individual channel stream by calling other Huffman
+ decoding functions.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function replaces the contents of pCodebookMap with the decoded
+ codebook indexes. By calling hufffac, it decodes scale factor data. Call
+ huffspec_fxp to decode spectral coefficients of current frame.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4           p24 (Table 4.4.24)
+                        p54 (4.5.2.3.2)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pGroup = group;
+
+    global_gain = CALL getbits(
+                            neededBits   = LEN_SCL_PCM,
+                            pInputStream = pInputStream)
+                        MODIFYING(pInputStream)
+                        ReTURNING(global_gain)
+
+    IF (common_window == FALSE)
+    THEN
+        status = CALL get_ics_info(
+                        pVars->mc_info.audioObjectType,
+                        pInputStream,
+                        common_window,
+                       &pChVars->wnd,
+                       &pChVars->wnd_shape_this_bk,
+                        group,
+                        pMax_sfb,
+                        pWinMap,
+                        &pChVars->lt_status,
+                        NULL)
+                    MODIFYING(pInputStream,pChVars,group,max_sfb,lt_status)
+                    RETURNING(status)
+    ENDIF
+
+    memcpy(pFrameInfo, pWinMap[pChVars->wnd], sizeof(FrameInfo))
+
+    IF (*pMax_sfb > 0)
+    THEN
+
+        i      = 0;
+        totSfb = 0;
+
+        DO
+
+            totSfb++;
+
+        WHILE( *pGroup++ < pFrameInfo->num_win);
+
+        totSfb  *=  pFrameInfo->sfb_per_win[0];
+
+        nsect = CALL huffcb(
+                        sect,
+                        pInputStream,
+                        pFrameInfo->sectbits,
+                        totSfb,
+                        pFrameInfo->sfb_per_win[0],
+                       *pMax_sfb)
+                    MODIFYING(sect,pInputStream,sectbits)
+                    RETURNING(nsect)
+
+        IF (nsect == 0)
+        THEN
+            status = 1
+
+        ENDIF
+
+        sectStart = 0;
+        FOR (i = 0; i < nsect; i++)
+
+            cb  = sect[i].sect_cb;
+            sectWidth =  sect[i].sect_end - sectStart;
+            sectStart += sectWidth;
+
+            WHILE (sectWidth > 0)
+
+                *pCodebookMap++ = cb
+                 sectWidth--
+            ENDWHILE
+
+        ENDFOR (i)
+
+    ELSE
+
+        memset(pCodebookMap,ZERO_HCB,MAXBANDS*sizeof(*pCodebookMap));
+
+    ENDIF (*pMax_sfb)
+
+    IF (pFrameInfo->islong == FALSE)
+    THEN
+        CALL calc_gsfb_table(
+                pFramInfo = pFrameInfo,
+                group[]   = group)
+              MODIFYING(pFrameInfo->frame_sfb_top)
+              RETURNING(void)
+    ENDIF
+
+    IF (status == SUCCESS)
+    THEN
+        status = CALL hufffac(
+                        pFrameInfo,
+                        pInputStream,
+                        group,
+                        nsect,
+                        sect,
+                        global_gain,
+                        pChVars->factors,
+                        pVars->huffBookUsed)
+                    MODIFYING(pInputStream,factors)
+                    RETURNING(status)
+
+    ENDIF (status)
+
+    IF (status == SUCCESS)
+    THEN
+        present = CALL getbits(
+                        neededBits   = LEN_PULSE_PRES,
+                        pInputStream = pInputStream)
+                    MODIFYING(pInputStream)
+                    RETURNING(present)
+
+        pPulseInfo->pulse_data_present = present;
+
+        IF (present != FALSE)
+        THEN
+            IF (pFrameInfo->islong == 1)
+            THEN
+                CALL get_pulse_data(
+                          pPulseInfo = pPulseInfo,
+                          pInputStream = pInputStream)
+                    MODIFYING(pInputStream,pPulseInfo)
+                    RETURNING(void)
+
+            ELSE
+
+                status = 1;
+
+            ENDIF (pFrameInfo)
+        ENDIF (present)
+
+    ENDIF (status)
+
+    IF (status == SUCCESS)
+    THEN
+        present = CALL getbits(
+                        neededBits = LEN_TNS_PRES,
+                        pInputStream = pInputStream)
+                    MODIFYING(pInputStream)
+                    RETURNING(present)
+
+        pTnsFrameInfo->tns_data_present = present;
+
+        IF (present != FALSE)
+        THEN
+            CALL get_tns(
+                    pFrameInfo = pFrameInfo,
+                    pTnsFrameInfo = pTnsFrameInfo,
+                    pInputStream = pInputStream)
+                MODIFYING(pInputStream, pTnsFrameInfo)
+                RETURNING(void)
+        ELSE
+
+            FOR (i = pTnsFrameInfo->n_subblocks - 1; i >= 0 ; i--)
+
+                pTnsFrameInfo->info[i].n_filt = 0;
+            ENDFOR
+
+        ENDIF(present)
+
+    ENDIF (status)
+
+    IF (status == SUCCESS)
+    THEN
+        present = CALL getbits(
+                        neededBits = LEN_GAIN_PRES,
+                        pInputStream = pInputStream)
+                MODIFYING(pInputStream)
+                RETURNING(present)
+
+        IF (present != FALSE)
+        THEN
+            status = 1;
+        ENDIF
+    ENDIF (status)
+
+    IF (status == SUCCESS)
+    THEN
+        status = CALL huffspec_fxp(
+                        pFrameInfo,
+                        pInputStream,
+                        nsect,
+                        sect,
+                        pChVars->factors,
+                        pChVars->fxpCoef,
+                        pVars->quantSpec,
+                        pVars->tmp_spec,
+                        pWinMap[ONLY_LONG_WINDOW],
+                        pPulseInfo,
+                        pChVars->qFormat)
+                MODIFYING(pInputStream,fxpCoef,quantSpec,tmp_spec,qFormat)
+                RETURNING(status)
+    ENDIF
+
+    RETURN status
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "e_huffmanconst.h"
+#include    "huffman.h"
+#include    "aac_mem_funcs.h"
+#include    "get_tns.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
+----------------------------------------------------------------------------*/
+Int getics(
+    BITS            *pInputStream,
+    Int             common_window,
+    tDec_Int_File   *pVars,
+    tDec_Int_Chan   *pChVars,
+    Int             group[],
+    Int             *pMax_sfb,
+    Int             *pCodebookMap,
+    TNS_frame_info  *pTnsFrameInfo,
+    FrameInfo       **pWinMap,
+    PulseInfo       *pPulseInfo,
+    SectInfo        sect[])
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Int     status = SUCCESS;
+
+    Int     nsect = 0;
+    Int     i;
+    Int     cb;
+    Int     sectWidth;
+    Int     sectStart;
+    Int     totSfb;
+    Int     *pGroup;
+
+    FrameInfo *pFrameInfo;
+
+    Int     global_gain; /* originally passed in from huffdecode */
+    Bool    present;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    pGroup = group;
+
+    /* read global gain from Input bitstream */
+    global_gain =
+        get9_n_lessbits(
+            LEN_SCL_PCM,
+            pInputStream);
+
+    if (common_window == FALSE)
+    {
+        status = get_ics_info(
+                     pVars->mc_info.audioObjectType,
+                     pInputStream,
+                     common_window,
+                     &pChVars->wnd,
+                     &pChVars->wnd_shape_this_bk,
+                     group,
+                     pMax_sfb,
+                     pWinMap,
+                     &pChVars->pShareWfxpCoef->lt_status,
+                     NULL);
+    }
+
+    pFrameInfo = pWinMap[pChVars->wnd];
+
+    /* First, calculate total number of scalefactor bands
+     * for this grouping. Then, decode section data
+     */
+    if (*pMax_sfb > 0)
+    {
+
+        /* calculate total number of sfb */
+        i      = 0;
+        totSfb = 0;
+
+        do
+        {
+            totSfb++;
+
+        }
+        while (*pGroup++ < pFrameInfo->num_win);
+
+        totSfb  *=  pFrameInfo->sfb_per_win[0];
+
+        /* decode section data */
+        nsect =
+            huffcb(
+                sect,
+                pInputStream,
+                pFrameInfo->sectbits,
+                totSfb,
+                pFrameInfo->sfb_per_win[0],
+                *pMax_sfb);
+
+        if (nsect == 0)
+        {
+            status = 1;     /* decode section data error */
+
+        }/* if (nsect) */
+
+        /* generate "linear" description from section info
+         * stored as codebook for each scalefactor band and group
+         * when nsect == 0, for-loop does not execute
+         */
+        sectStart = 0;
+        for (i = 0; i < nsect; i++)
+        {
+            cb  = sect[i].sect_cb;
+            sectWidth =  sect[i].sect_end - sectStart;
+            sectStart += sectWidth;
+
+            while (sectWidth > 0)
+            {
+                *pCodebookMap++ = cb;   /* cannot use memset for Int */
+                sectWidth--;
+            }
+
+        } /* for (i) */
+
+    }
+    else
+    {
+        /* set all sections with ZERO_HCB */
+        pv_memset(
+            pCodebookMap,
+            ZERO_HCB,
+            MAXBANDS*sizeof(*pCodebookMap));
+        /*
+                for (i=MAXBANDS; i>0; i--)
+                {
+                    *(pCodebookMap++) = ZERO_HCB;
+                }
+        */
+
+    } /* if (*pMax_sfb) */
+
+    /* calculate band offsets
+     * (because of grouping and interleaving this cannot be
+     * a constant: store it in pFrameInfo->frame_sfb_top)
+     */
+    if (pFrameInfo->islong == FALSE)
+    {
+        calc_gsfb_table(
+            pFrameInfo,
+            group);
+    }
+
+    /* decode scale factor data */
+    if (status == SUCCESS)
+    {
+        status =
+            hufffac(
+                pFrameInfo,
+                pInputStream,
+                group,
+                nsect,
+                sect,
+                global_gain,
+                pChVars->pShareWfxpCoef->factors,
+                pVars->scratch.huffbook_used);
+
+    } /* if (status) */
+
+    /* noiseless coding */
+    if (status == SUCCESS)
+    {
+        present =
+            get1bits(pInputStream);
+
+        pPulseInfo->pulse_data_present = present;
+
+        if (present != FALSE)
+        {
+            if (pFrameInfo->islong == 1)
+            {
+                status = get_pulse_data(
+                             pPulseInfo,
+                             pInputStream);
+            }
+            else
+            {
+                /* CommonExit(1,"Pulse data not allowed for short blocks"); */
+                status = 1;
+
+            } /* if (pFrameInfo) */
+        } /* if (present) */
+
+    } /* if (status) */
+
+
+    /* decode tns data */
+    if (status == SUCCESS)
+    {
+        present =
+            get1bits(pInputStream);
+
+        pTnsFrameInfo->tns_data_present = present;
+
+        if (present != FALSE)
+        {
+            get_tns(
+                pChVars->pShareWfxpCoef->max_sfb,
+                pInputStream,
+                pChVars->wnd,
+                pFrameInfo,
+                &pVars->mc_info,
+                pTnsFrameInfo,
+                pVars->scratch.tns_decode_coef);
+        }
+        else
+        {
+            for (i = pFrameInfo->num_win - 1; i >= 0 ; i--)
+            {
+                pTnsFrameInfo->n_filt[i] = 0;
+            }
+
+        } /* if(present) */
+
+    } /* if (status) */
+
+    /* gain control */
+    if (status == SUCCESS)
+    {
+        present =
+            get1bits(pInputStream);
+
+        if (present != FALSE)
+        {
+            /* CommonExit(1, "Gain control not implemented"); */
+            status = 1;
+        }
+    } /* if (status) */
+
+    if (status == SUCCESS)
+    {
+        status =
+            huffspec_fxp(
+                pFrameInfo,
+                pInputStream,
+                nsect,
+                sect,
+                pChVars->pShareWfxpCoef->factors,
+                pChVars->fxpCoef,
+                pVars->share.a.quantSpec,
+                pVars->scratch.tmp_spec,
+                pWinMap[ONLY_LONG_WINDOW],
+                pPulseInfo,
+                pChVars->pShareWfxpCoef->qFormat);
+    }
+
+    /*----------------------------------------------------------------------------
+    ; Return status
+    ----------------------------------------------------------------------------*/
+
+    return status;
+
+} /* getics */
diff --git a/media/libstagefright/codecs/aacdec/getmask.cpp b/media/libstagefright/codecs/aacdec/getmask.cpp
new file mode 100644
index 0000000..2fd34f1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/getmask.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: getmask.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+               Replaced for-loop style memory initialization with memset()
+
+ Description: (1) Modified to bring code in-line with PV standard
+              (2) Removed multiple returns, Replaced multiple 'if's with
+                  switch
+
+ Description: (1) Modified per review comments
+              (2) increment pointer pMask after memset
+
+ Description: Make the maximum number of bits requested from getbits
+              become a constant.
+
+ Description: Typecast 1 to UInt32 for bitmask to avoid masking on a 16-bit
+              platform
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less.
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+        pFrameInfo  = pointer to structure that holds information for current
+                      frame, Type FrameInfo
+
+        pInputStream= pointer to structure that holds input stream information
+                      Type BITS
+
+        pGroup      = pointer to array that holds the stop window index for
+                      each group in current frame, Type Int
+
+        max_sfb     = number of active sfbs for each window, Type Int
+
+        mask[]      = array that holds the MS_mask information
+                      Type Int
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    mask_present = 0    (no Mid/Side mixed)
+                   2    (Mid/Side mixed present for entire frame)
+                   1    (Mid/Side mixed information read from bitstream)
+                   -1   (invalid mask_present read from bitstream)
+
+ Pointers and Buffers Modified:
+    pMask   contents replaced by MS information of each scalefactor band
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function reads the Mid/Side(MS) mask information from the input
+ bitstream. If the mask_present field is equal to 2, the mask bits is set to
+ 1 for the entire frame. If mask_present has a value of 0, the function
+ returns 0, If mask_present is set to 1, the Mid/Side(MS) information is
+ read from the input stream. When mask_present is 3, an error code (-1) is
+ generated.
+ The Mid/Side(MS) information is later used for mixing the left and right
+ channel sounds. Each scalefactor band has its own MS information.
+
+ (ISO comments: read a synthesis mask,  read a synthesis mask uses
+                EXTENDED_MS_MASK and grouped mask )
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall replace the contents of pMask with the MS information
+ of each scalefactor band
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4
+                    p15     (Table 4.4.5    getmask)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    CALL getbits(LEN_MASK_PRES, pInputStream)
+    MODIFYING (pInputStream)
+    RETURNING (mask present information)
+    mask_present = mask present information
+
+    SWITCH (mask_present)
+
+        CASE (0):
+            BREAK;
+
+        CASE (2):
+            nwin = pFrameInfo->num_win;
+            FOR(win = 0; win < nwin; win = *(pGroup++))
+
+                FOR(sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
+                    *(pMask++) = 1;
+                ENDFOR
+
+            ENDFOR
+
+            BREAK;
+
+        CASE(1):
+
+            nwin = pFrameInfo->num_win;
+
+                nToDo = max_sfb;
+
+                WHILE (nToDo > 0)
+                    nCall = nToDo;
+
+                    IF (nCall > MAX_GETBITS)
+                    THEN
+                        nCall = MAX_GETBITS;
+                    ENDIF
+
+                    tempMask =
+                        getbits(
+                            nCall,
+                            pInputStream);
+
+                    bitmask = 1 << (nCall - 1);
+                    FOR (sfb = nCall; sfb > 0; sfb--)
+                       *(pMask++) = (tempMask & bitmask) >> (sfb - 1);
+                        bitmask >>= 1;
+                    ENDFOR
+
+                    nToDo -= nCall;
+                END WHILE
+
+                pv_memset(
+                    pMask,
+                    0,
+                    (pFrameInfo->sfb_per_win[win]-max_sfb)*sizeof(*pMask));
+
+            ENDFOR (win)
+
+            BREAK
+
+        DEFAULT:
+            mask_present = -1
+
+    ENDSWITCH
+
+    RETURN  mask_present
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "huffman.h"
+#include    "aac_mem_funcs.h"
+#include    "e_maskstatus.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
+----------------------------------------------------------------------------*/
+Int getmask(
+    FrameInfo   *pFrameInfo,
+    BITS        *pInputStream,
+    Int         group[],
+    Int         max_sfb,
+    Int         mask[])
+{
+
+    Int     win; /* window index */
+    Int     sfb;
+    Int     mask_present;
+    Int    *pMask;
+    Int    *pGroup;
+    Int     nwin;
+    Int     nCall;
+    Int     nToDo;
+    UInt32  tempMask;
+    UInt32  bitmask;
+
+    pMask  = mask;
+    pGroup = group;
+
+    mask_present =
+        get9_n_lessbits(
+            LEN_MASK_PRES,
+            pInputStream);
+
+    switch (mask_present)
+    {
+        case(MASK_NOT_PRESENT):
+            /* special EXTENDED_MS_MASK cases */
+            /* no ms at all */
+            break;
+
+        case(MASK_ALL_FRAME):
+            /* MS for whole spectrum on, mask bits set to 1 */
+            nwin = pFrameInfo->num_win;
+            for (win = 0; win < nwin; win = *(pGroup++))
+            {
+                for (sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
+                {
+                    *(pMask++) = 1; /* cannot use memset for Int type */
+                }
+
+            }
+
+            break;
+
+        case(MASK_FROM_BITSTREAM):
+            /* MS_mask_present==1, get mask information*/
+            nwin = pFrameInfo->num_win;
+            for (win = 0; win < nwin; win = *(pGroup++))
+            {
+                /*
+                 * the following code is equivalent to
+                 *
+                 * for(sfb = max_sfb; sfb > 0; sfb--)
+                 * {
+                 *   *(pMask++) =
+                 *       getbits(
+                 *           LEN_MASK,
+                 *           pInputStream);
+                 * }
+                 *
+                 * in order to save the calls to getbits, the above
+                 * for-loop is broken into two parts
+                 */
+
+                nToDo = max_sfb;
+
+                while (nToDo > 0)
+                {
+                    nCall = nToDo;
+
+                    if (nCall > MAX_GETBITS)
+                    {
+                        nCall = MAX_GETBITS;
+                    }
+
+                    tempMask =
+                        getbits(
+                            nCall,
+                            pInputStream);
+
+                    bitmask = (UInt32) 1 << (nCall - 1);
+                    for (sfb = nCall; sfb > 0; sfb--)
+                    {
+                        *(pMask++) = (Int)((tempMask & bitmask) >> (sfb - 1));
+                        bitmask >>= 1;
+                    }
+
+                    nToDo -= nCall;
+                }
+
+                /*
+                 * set remaining sfbs to zero
+                 * re-use nCall to save one variable on stack
+                 */
+
+                nCall = pFrameInfo->sfb_per_win[win] - max_sfb;
+
+
+                if (nCall >= 0)
+                {
+                    pv_memset(pMask,
+                              0,
+                              nCall*sizeof(*pMask));
+
+                    pMask += nCall;
+                }
+                else
+                {
+                    mask_present = MASK_ERROR;
+                    break;
+                }
+
+
+            } /* for (win) */
+
+            break;
+
+        default:
+            /* error */
+            break;
+
+    } /* switch (mask_present) */
+
+    return mask_present;
+
+} /* getmask */
diff --git a/media/libstagefright/codecs/aacdec/hcbtables.h b/media/libstagefright/codecs/aacdec/hcbtables.h
new file mode 100644
index 0000000..a35fed0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/hcbtables.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: hcbtables.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) Add declaration of binary tree tables
+              (2) #if optimized Linear Search Huffman decoding
+
+ Description: Modified per review comments
+              (1) delete #if optimized Linear Search Huffman decoding
+              (2) modified copyright header
+
+ Description: (1) Add declaration different huffman tables
+
+ Who:                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Declare the structure array for Huffman Codebooks information.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef _HCBTABLES_H
+#define _HCBTABLES_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include    "s_hcb.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
+    ----------------------------------------------------------------------------*/
+
+    /* ISO: Hcb book[NSPECBOOKS + 2]; */
+
+    extern const Hcb hcbbook_binary[13];
+    extern const Int32 huff_tab1[88];
+    extern const Int32 huff_tab2[90];
+    extern const Int32 huff_tab3[151];
+    extern const Int32 huff_tab4[119];
+    extern const Int32 huff_tab5[110];
+    extern const Int32 huff_tab6[113];
+    extern const Int32 huff_tab7[107];
+    extern const Int32 huff_tab8[90];
+    extern const Int32 huff_tab9[204];
+    extern const Int32 huff_tab10[186];
+    extern const Int32 huff_tab11[301];
+    extern const UInt32 huff_tab_scl[188];
+
+    /*----------------------------------------------------------------------------
+    ; 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/aacdec/hcbtables_binary.cpp b/media/libstagefright/codecs/aacdec/hcbtables_binary.cpp
new file mode 100644
index 0000000..d097af1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/hcbtables_binary.cpp
@@ -0,0 +1,1938 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: hcbtables.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modifiy per review comments
+    (1) delete the following comments:
+        The LAV field has been deleted, since it is never used.
+
+ Description: Remove old structure of huffman table and add new table structure.
+
+ Description: Modified structure to avoid assigning addresses to constant
+              tables. This solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers
+              - Eliminated references to contant vector addresses in
+                hcbbook_binary
+
+
+ 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 file defines the 12 packed Huffman Tables and a structure that reference
+ to these tables.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ ISO/IEC 14496-3: 1999(E)
+ Subpart 4          p78 (Table 4.6.1 and Table 4.6.2)
+                    p77 (pseudo code)
+
+------------------------------------------------------------------------------
+ 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)
+
+------------------------------------------------------------------------------
+*/
+#include    "s_hcb.h"
+#include    "hcbtables.h"
+
+/* This file store packed Huffman tables for binary tree search */
+
+/*
+ * all tables are packed in the following way:
+ * right pointer (7 bits) idx (9 bits)
+ */
+
+
+const Hcb hcbbook_binary[13] =
+{
+
+    { 0, -1,  -1, -1, -1 },   /* ZERO_HCB */
+    { 1,  4,   3,  1,  1 },   /* codebook 1 */
+    { 2,  4,   3,  1,  1 },   /* codebook 2 */
+    { 3,  4,   3,  0,  0 },   /* codebook 3 */
+    { 4,  4,   3,  0,  0 },   /* codebook 4 */
+    { 5,  2,   9,  4,  1 },
+    { 6,  2,   9,  4,  1 },
+    { 7,  2,   8,  0,  0 },
+    { 8,  2,   8,  0,  0 },
+    { 9,  2,  13,  0,  0 },
+    {10,  2,  13,  0,  0 },
+    {11,  2,  17,  0,  0 },  /* codebook 11 ESC book */
+    {12, -1,  -1, -1, -1 }   /* scalefactor codebook */
+
+
+};
+
+
+/* New look-up table for huffman decoding
+   Created by ordering the codeword in the table according to their
+   normalized shifted binary value, i.e., all the codewords are left
+   shifted to meet the maximum codelength. Example, max codelength is
+   10, the codeword with lenth 3 will left shift by 7.
+   The binary values of after the shift are sorted.
+   Then the sorted table is divided into several partition.
+   At the VLC decoding period, input is read in at max codelenght.
+   The partition is decided using if-else logic.
+   Inside each partition, a look-up table is used to map the input value
+   to a correct symbol. Table entries can appear to be repeated according
+   to the humming distance between adjacent codewords.
+*/
+
+const Int32 huff_tab1[88] =
+{
+    0x430005,
+    0xd0005,
+    0x270005,
+    0x310005,
+    0x290005,
+    0x250005,
+    0x2b0005,
+    0x1f0005,
+    0x3a0007,
+    0x160007,
+    0x260007,
+    0x2e0007,
+    0x220007,
+    0x2a0007,
+    0x4c0007,
+    0x240007,
+    0x40007,
+    0x1c0007,
+    0x400007,
+    0x300007,
+    0x100007,
+    0x2c0007,
+    0x460007,
+    0x200007,
+    0x340007,
+    0x320007,
+    0xa0007,
+    0x440007,
+    0xc0007,
+    0x420007,
+    0xe0007,
+    0x1e0007,
+    0x490009,
+    0x130009,
+    0x3d0009,
+    0x330009,
+    0x2f0009,
+    0x230009,
+    0x210009,
+    0x370009,
+    0x410009,
+    0x2d0009,
+    0x190009,
+    0xf0009,
+    0x70009,
+    0x1d0009,
+    0x3b0009,
+    0x390009,
+    0x150009,
+    0x10009,
+    0x1b0009,
+    0x350009,
+    0x450009,
+    0x4d0009,
+    0x170009,
+    0x4f0009,
+    0x5000a,
+    0x5000a,
+    0x9000a,
+    0x9000a,
+    0x4b000a,
+    0x4b000a,
+    0x3f000a,
+    0x3f000a,
+    0xb000a,
+    0xb000a,
+    0x3000a,
+    0x3000a,
+    0x11000a,
+    0x11000a,
+    0x47000a,
+    0x47000a,
+    0x3c000b,
+    0x14000b,
+    0x18000b,
+    0x38000b,
+    0x50000b,
+    0x8000b,
+    0x48000b,
+    0x6000b,
+    0xb,
+    0x4a000b,
+    0x3e000b,
+    0x1a000b,
+    0x12000b,
+    0x2000b,
+    0x36000b,
+    0x4e000b
+};
+
+const Int32 huff_tab2[90] =
+{
+    0x430004,
+    0x430004,
+    0x430004,
+    0x430004,
+    0xd0005,
+    0xd0005,
+    0x290005,
+    0x290005,
+    0x250005,
+    0x250005,
+    0x270005,
+    0x270005,
+    0x1f0005,
+    0x1f0005,
+    0x2b0005,
+    0x2b0005,
+    0x310005,
+    0x310005,
+    0x220006,
+    0x160006,
+    0x2e0006,
+    0x2a0006,
+    0x300006,
+    0x260006,
+    0xc0006,
+    0x3a0006,
+    0x400006,
+    0x40006,
+    0x240006,
+    0x460006,
+    0x440006,
+    0x200006,
+    0x100006,
+    0x320006,
+    0x1c0006,
+    0xe0006,
+    0x1e0006,
+    0xa0006,
+    0x4c0006,
+    0x340006,
+    0x2c0006,
+    0x420006,
+    0x2f0007,
+    0x410007,
+    0x130007,
+    0x210007,
+    0x3d0007,
+    0x4b0007,
+    0x470007,
+    0x190007,
+    0x1d0007,
+    0x4f0007,
+    0xf0007,
+    0x10007,
+    0xb0007,
+    0x370007,
+    0x490007,
+    0x3b0008,
+    0x150008,
+    0x70008,
+    0x110008,
+    0x50008,
+    0x30008,
+    0x1b0008,
+    0x450008,
+    0x3f0008,
+    0x2d0008,
+    0x350008,
+    0x170008,
+    0x90008,
+    0x330008,
+    0x390008,
+    0x230008,
+    0x4d0008,
+    0x3c0008,
+    0x140008,
+    0x380009,
+    0x9,
+    0x180009,
+    0x1a0009,
+    0x500009,
+    0x60009,
+    0x3e0009,
+    0x120009,
+    0x80009,
+    0x480009,
+    0x360009,
+    0x20009,
+    0x4a0009,
+    0x4e0009
+};
+
+const Int32 huff_tab3[151] =
+{
+    0x1b0004,
+    0x1b0004,
+    0x1b0004,
+    0x1b0004,
+    0x10004,
+    0x10004,
+    0x10004,
+    0x10004,
+    0x90004,
+    0x90004,
+    0x90004,
+    0x90004,
+    0x30004,
+    0x30004,
+    0x30004,
+    0x30004,
+    0x240005,
+    0x240005,
+    0x40005,
+    0x40005,
+    0xc0006,
+    0xa0006,
+    0x1e0006,
+    0xd0006,
+    0x1c0006,
+    0x270006,
+    0x280007,
+    0x280007,
+    0x280007,
+    0x280007,
+    0x1f0007,
+    0x1f0007,
+    0x1f0007,
+    0x1f0007,
+    0x250007,
+    0x250007,
+    0x250007,
+    0x250007,
+    0x360008,
+    0x360008,
+    0x20008,
+    0x20008,
+    0x50008,
+    0x50008,
+    0x3f0008,
+    0x3f0008,
+    0x300008,
+    0x300008,
+    0x70009,
+    0x100009,
+    0x2d0009,
+    0xe0009,
+    0x420009,
+    0x60009,
+    0x150009,
+    0xf0009,
+    0x120009,
+    0xb0009,
+    0x390009,
+    0x310009,
+    0x160009,
+    0x2a0009,
+    0x2b0009,
+    0x2e000a,
+    0x21000a,
+    0x22000a,
+    0x13000a,
+    0x43000a,
+    0x29000a,
+    0x40000a,
+    0x20000a,
+    0x8000a,
+    0x11000a,
+    0x4b000a,
+    0x33000a,
+    0x1d000a,
+    0x37000a,
+    0x19000a,
+    0x48000b,
+    0x48000b,
+    0x34000b,
+    0x34000b,
+    0x26000b,
+    0x26000b,
+    0x3a000b,
+    0x3a000b,
+    0x2c000b,
+    0x2c000b,
+    0x4c000b,
+    0x4c000b,
+    0x18000b,
+    0x18000b,
+    0x17000b,
+    0x17000b,
+    0x23000c,
+    0x49000c,
+    0x45000c,
+    0x4e000c,
+    0x1a000c,
+    0x4f000c,
+    0x46000c,
+    0x32000c,
+    0x35000c,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x14000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x3c000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x2f000d,
+    0x3d000e,
+    0x3d000e,
+    0x3d000e,
+    0x3d000e,
+    0x44000e,
+    0x44000e,
+    0x44000e,
+    0x44000e,
+    0x41000e,
+    0x41000e,
+    0x41000e,
+    0x41000e,
+    0x50000f,
+    0x50000f,
+    0x4d000f,
+    0x4d000f,
+    0x47000f,
+    0x47000f,
+    0x3b000f,
+    0x3b000f,
+    0x38000f,
+    0x38000f,
+    0x4a0010,
+    0x3e0010
+};
+
+const Int32 huff_tab4[119] =
+{
+    0x280004,
+    0x280004,
+    0xd0004,
+    0xd0004,
+    0x250004,
+    0x250004,
+    0x270004,
+    0x270004,
+    0x1f0004,
+    0x1f0004,
+    0x1b0004,
+    0x1b0004,
+    0x240004,
+    0x240004,
+    0x4,
+    0x4,
+    0x40004,
+    0x40004,
+    0x1e0004,
+    0x1e0004,
+    0x1c0005,
+    0xc0005,
+    0x10005,
+    0xa0005,
+    0x30005,
+    0x90005,
+    0x430007,
+    0x430007,
+    0x2b0007,
+    0x2b0007,
+    0x310007,
+    0x310007,
+    0x290007,
+    0x290007,
+    0x420007,
+    0x420007,
+    0x400007,
+    0x400007,
+    0x300007,
+    0x300007,
+    0x3a0007,
+    0x3a0007,
+    0x100007,
+    0x100007,
+    0xe0008,
+    0x2a0008,
+    0x160008,
+    0x200008,
+    0x2e0008,
+    0x260008,
+    0x220008,
+    0x3f0008,
+    0x390008,
+    0x2d0008,
+    0x370008,
+    0xb0008,
+    0x150008,
+    0x50008,
+    0xf0008,
+    0x130008,
+    0x1d0008,
+    0x70008,
+    0x210008,
+    0x360008,
+    0x20008,
+    0x120009,
+    0x120009,
+    0x60009,
+    0x60009,
+    0x340009,
+    0x340009,
+    0x4c0009,
+    0x4c0009,
+    0x460009,
+    0x460009,
+    0x2c0009,
+    0x2c0009,
+    0x320009,
+    0x320009,
+    0x440009,
+    0x440009,
+    0x33000a,
+    0x4b000a,
+    0x45000a,
+    0x19000a,
+    0x11000a,
+    0x49000a,
+    0x17000a,
+    0x3d000a,
+    0x23000a,
+    0x4f000a,
+    0x2f000a,
+    0x3b000a,
+    0x41000a,
+    0x35000a,
+    0x47000b,
+    0x47000b,
+    0x4d000b,
+    0x4d000b,
+    0x18000b,
+    0x18000b,
+    0x48000b,
+    0x48000b,
+    0x8000b,
+    0x8000b,
+    0x3c000b,
+    0x3c000b,
+    0x14000b,
+    0x14000b,
+    0x38000b,
+    0x38000b,
+    0x50000b,
+    0x50000b,
+    0x1a000b,
+    0x1a000b,
+    0x4e000b,
+    0x4e000b,
+    0x4a000c,
+    0x3e000c
+};
+
+const Int32 huff_tab5[110] =
+{
+    0x1f0004,
+    0x1f0004,
+    0x310004,
+    0x310004,
+    0x290004,
+    0x290004,
+    0x270004,
+    0x270004,
+    0x300005,
+    0x200005,
+    0x1e0005,
+    0x320005,
+    0x160007,
+    0x160007,
+    0x2a0007,
+    0x2a0007,
+    0x3a0007,
+    0x3a0007,
+    0x260007,
+    0x260007,
+    0x150008,
+    0x3b0008,
+    0x1d0008,
+    0x330008,
+    0x170008,
+    0x390008,
+    0x210008,
+    0x2f0008,
+    0xd0008,
+    0x430008,
+    0x250008,
+    0x2b0008,
+    0xc0009,
+    0xc0009,
+    0x340009,
+    0x340009,
+    0x440009,
+    0x440009,
+    0x1c0009,
+    0x1c0009,
+    0xe0009,
+    0xe0009,
+    0x420009,
+    0x420009,
+    0x2e0009,
+    0x2e0009,
+    0x220009,
+    0x220009,
+    0x180009,
+    0x180009,
+    0x3c0009,
+    0x3c0009,
+    0x140009,
+    0x140009,
+    0x380009,
+    0x380009,
+    0xb000a,
+    0x41000a,
+    0x19000a,
+    0x37000a,
+    0x45000a,
+    0x3d000a,
+    0xf000a,
+    0x13000a,
+    0x24000a,
+    0x4000a,
+    0x4d000a,
+    0x4c000a,
+    0x3000b,
+    0x2c000b,
+    0x4b000b,
+    0x1b000b,
+    0x35000b,
+    0x23000b,
+    0x5000b,
+    0x2d000b,
+    0x40000b,
+    0xa000b,
+    0x10000b,
+    0x1a000b,
+    0x2000b,
+    0x4e000b,
+    0x36000b,
+    0x3e000b,
+    0x46000b,
+    0x6000b,
+    0x12000c,
+    0x12000c,
+    0x4a000c,
+    0x4a000c,
+    0x3f000c,
+    0x3f000c,
+    0x1000c,
+    0x1000c,
+    0x7000c,
+    0x7000c,
+    0x47000c,
+    0x47000c,
+    0x11000c,
+    0x11000c,
+    0x4f000c,
+    0x4f000c,
+    0x49000c,
+    0x49000c,
+    0x9000c,
+    0x9000c,
+    0x48000d,
+    0x8000d,
+    0x50000d,
+    0xd
+};
+const Int32 huff_tab6[113] =
+{
+    0x280004,
+    0x310004,
+    0x270004,
+    0x290004,
+    0x1f0004,
+    0x320004,
+    0x200004,
+    0x300004,
+    0x1e0004,
+    0x390006,
+    0x390006,
+    0x3b0006,
+    0x3b0006,
+    0x170006,
+    0x170006,
+    0x150006,
+    0x150006,
+    0x160006,
+    0x160006,
+    0x210006,
+    0x210006,
+    0x3a0006,
+    0x3a0006,
+    0x2f0006,
+    0x2f0006,
+    0x330006,
+    0x330006,
+    0x260006,
+    0x260006,
+    0x1d0006,
+    0x1d0006,
+    0x2a0006,
+    0x2a0006,
+    0x380006,
+    0x380006,
+    0x180006,
+    0x180006,
+    0x140006,
+    0x140006,
+    0x3c0006,
+    0x3c0006,
+    0xe0007,
+    0x440007,
+    0x420007,
+    0x220007,
+    0xc0007,
+    0x340007,
+    0x2e0007,
+    0x1c0007,
+    0x430007,
+    0xd0007,
+    0x250007,
+    0x2b0007,
+    0x450007,
+    0xb0008,
+    0xb0008,
+    0x190008,
+    0x190008,
+    0x3d0008,
+    0x3d0008,
+    0x410008,
+    0x410008,
+    0x370008,
+    0x370008,
+    0x130008,
+    0x130008,
+    0xf0008,
+    0xf0008,
+    0x460008,
+    0x460008,
+    0x400009,
+    0xa0009,
+    0x100009,
+    0x2d0009,
+    0x1b0009,
+    0x4d0009,
+    0x50009,
+    0x30009,
+    0x350009,
+    0x4b0009,
+    0x230009,
+    0x240009,
+    0x60009,
+    0x20009,
+    0x3e0009,
+    0x120009,
+    0x40009,
+    0x4e0009,
+    0x4a0009,
+    0x1a0009,
+    0x4c0009,
+    0x360009,
+    0x2c0009,
+    0x9000a,
+    0x9000a,
+    0x11000a,
+    0x11000a,
+    0x3f000a,
+    0x3f000a,
+    0x49000a,
+    0x49000a,
+    0x47000a,
+    0x47000a,
+    0x4f000a,
+    0x4f000a,
+    0x7000a,
+    0x7000a,
+    0x1000a,
+    0x1000a,
+    0x50000b,
+    0x8000b,
+    0xb,
+    0x48000b
+};
+
+const Int32 huff_tab7[107] =
+{
+    0x80003,
+    0x80003,
+    0x80003,
+    0x80003,
+    0x80003,
+    0x80003,
+    0x80003,
+    0x80003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x10003,
+    0x90004,
+    0x90004,
+    0x90004,
+    0x90004,
+    0x110006,
+    0xa0006,
+    0x100006,
+    0x20006,
+    0x190007,
+    0x190007,
+    0xb0007,
+    0xb0007,
+    0x120007,
+    0x120007,
+    0x180007,
+    0x180007,
+    0x30007,
+    0x30007,
+    0x130008,
+    0x1a0008,
+    0xc0008,
+    0x210008,
+    0xd0008,
+    0x290008,
+    0x1b0008,
+    0x140008,
+    0x40008,
+    0x200008,
+    0x220009,
+    0x220009,
+    0x150009,
+    0x150009,
+    0x2a0009,
+    0x2a0009,
+    0x50009,
+    0x50009,
+    0x310009,
+    0x310009,
+    0x280009,
+    0x280009,
+    0xe0009,
+    0xe0009,
+    0x230009,
+    0x230009,
+    0x1d0009,
+    0x1d0009,
+    0x1c0009,
+    0x1c0009,
+    0x2b0009,
+    0x2b0009,
+    0x160009,
+    0x160009,
+    0x320009,
+    0x320009,
+    0xf0009,
+    0xf0009,
+    0x1e000a,
+    0x6000a,
+    0x30000a,
+    0x24000a,
+    0x39000a,
+    0x25000a,
+    0x3a000a,
+    0x2c000a,
+    0x33000a,
+    0x17000a,
+    0x3b000a,
+    0x34000a,
+    0x2d000a,
+    0x26000a,
+    0x1f000a,
+    0x38000b,
+    0x38000b,
+    0x7000b,
+    0x7000b,
+    0x35000b,
+    0x35000b,
+    0x2e000b,
+    0x2e000b,
+    0x3c000b,
+    0x3c000b,
+    0x27000b,
+    0x27000b,
+    0x2f000b,
+    0x2f000b,
+    0x3d000b,
+    0x3d000b,
+    0x3e000c,
+    0x36000c,
+    0x37000c,
+    0x3f000c
+};
+const Int32 huff_tab8[90] =
+{
+    0x90003,
+    0x90003,
+    0x90003,
+    0x90003,
+    0x110004,
+    0x110004,
+    0x80004,
+    0x80004,
+    0xa0004,
+    0xa0004,
+    0x10004,
+    0x10004,
+    0x120004,
+    0x120004,
+    0x5,
+    0x100005,
+    0x20005,
+    0x190005,
+    0xb0005,
+    0x1a0005,
+    0x130005,
+    0x1b0006,
+    0x1b0006,
+    0x210006,
+    0x210006,
+    0xc0006,
+    0xc0006,
+    0x220006,
+    0x220006,
+    0x140006,
+    0x140006,
+    0x180006,
+    0x180006,
+    0x30006,
+    0x30006,
+    0x230006,
+    0x230006,
+    0x1c0006,
+    0x1c0006,
+    0x2a0006,
+    0x2a0006,
+    0x290007,
+    0x150007,
+    0xd0007,
+    0x2b0007,
+    0x1d0007,
+    0x240007,
+    0x2c0007,
+    0x40007,
+    0x250007,
+    0x200007,
+    0x160007,
+    0x320007,
+    0x310007,
+    0xe0007,
+    0x1e0008,
+    0x330008,
+    0x2d0008,
+    0x280008,
+    0x340008,
+    0x50008,
+    0x260008,
+    0x390008,
+    0x3a0008,
+    0x170008,
+    0x350008,
+    0x3b0008,
+    0xf0008,
+    0x2e0008,
+    0x1f0008,
+    0x360009,
+    0x360009,
+    0x3c0009,
+    0x3c0009,
+    0x300009,
+    0x300009,
+    0x270009,
+    0x270009,
+    0x60009,
+    0x60009,
+    0x3d0009,
+    0x3d0009,
+    0x3e0009,
+    0x3e0009,
+    0x370009,
+    0x370009,
+    0x2f000a,
+    0x38000a,
+    0x7000a,
+    0x3f000a
+};
+const Int32 huff_tab9[204] =
+{
+    0x1,
+    0x1,
+    0x1,
+    0x1,
+    0x1,
+    0x1,
+    0x1,
+    0x1,
+    0xd0003,
+    0xd0003,
+    0x10003,
+    0x10003,
+    0xe0004,
+    0x1b0006,
+    0x1b0006,
+    0xf0006,
+    0xf0006,
+    0x1a0006,
+    0x1a0006,
+    0x20006,
+    0x20006,
+    0x280007,
+    0x1c0007,
+    0x100007,
+    0x270008,
+    0x270008,
+    0x30008,
+    0x30008,
+    0x1d0008,
+    0x1d0008,
+    0x290008,
+    0x290008,
+    0x110008,
+    0x110008,
+    0x350008,
+    0x350008,
+    0x1e0008,
+    0x1e0008,
+    0x120008,
+    0x120008,
+    0x360009,
+    0x2a0009,
+    0x40009,
+    0x340009,
+    0x420009,
+    0x1f0009,
+    0x130009,
+    0x2b0009,
+    0x430009,
+    0x4f0009,
+    0x370009,
+    0x5000a,
+    0x20000a,
+    0x41000a,
+    0x14000a,
+    0x2c000a,
+    0x15000a,
+    0x69000a,
+    0x38000a,
+    0x44000a,
+    0x50000a,
+    0x5c000a,
+    0x6000a,
+    0x6a000a,
+    0x22000a,
+    0x2d000a,
+    0x21000a,
+    0x39000a,
+    0x76000a,
+    0x16000a,
+    0x5d000a,
+    0x4e000b,
+    0x45000b,
+    0x51000b,
+    0x6b000b,
+    0x7000b,
+    0x77000b,
+    0x2f000b,
+    0x3a000b,
+    0x2e000b,
+    0x8000b,
+    0x83000b,
+    0x52000b,
+    0x23000b,
+    0x46000b,
+    0x68000b,
+    0x5b000b,
+    0x5e000b,
+    0x84000b,
+    0x78000b,
+    0x6c000b,
+    0x17000b,
+    0x5f000b,
+    0x53000b,
+    0x47000b,
+    0x3c000b,
+    0x3b000b,
+    0x30000b,
+    0x90000b,
+    0x49000b,
+    0x75000b,
+    0x6d000b,
+    0x85000c,
+    0x24000c,
+    0x9000c,
+    0x91000c,
+    0x79000c,
+    0x54000c,
+    0x9d000c,
+    0x3d000c,
+    0x6e000c,
+    0x18000c,
+    0x7a000c,
+    0x86000c,
+    0x48000c,
+    0x60000c,
+    0x25000c,
+    0x19000c,
+    0x9e000c,
+    0x92000c,
+    0x31000c,
+    0x4a000c,
+    0x55000c,
+    0x6f000c,
+    0x93000c,
+    0xa000c,
+    0x61000c,
+    0x9f000c,
+    0x82000c,
+    0x87000c,
+    0x3e000c,
+    0x56000c,
+    0x26000c,
+    0x7b000c,
+    0x7c000c,
+    0x3f000c,
+    0x8f000c,
+    0x57000c,
+    0x32000c,
+    0x4b000c,
+    0x70000d,
+    0x63000d,
+    0xa1000d,
+    0x33000d,
+    0x94000d,
+    0x62000d,
+    0xa0000d,
+    0x95000d,
+    0x88000d,
+    0x40000d,
+    0x64000d,
+    0x4c000d,
+    0xb000d,
+    0xa2000d,
+    0x58000d,
+    0x9c000d,
+    0x89000d,
+    0x4d000d,
+    0x65000d,
+    0x7d000d,
+    0xc000d,
+    0x96000d,
+    0x71000d,
+    0x7e000d,
+    0x8a000d,
+    0x66000d,
+    0xa3000d,
+    0x59000d,
+    0x73000d,
+    0x97000d,
+    0x67000d,
+    0x5a000d,
+    0x72000e,
+    0x72000e,
+    0x8b000e,
+    0x8b000e,
+    0x74000e,
+    0x74000e,
+    0x7f000e,
+    0x7f000e,
+    0x80000e,
+    0x80000e,
+    0x81000e,
+    0x81000e,
+    0x8d000e,
+    0x8d000e,
+    0xa5000e,
+    0xa5000e,
+    0x8c000e,
+    0x8c000e,
+    0x98000e,
+    0x98000e,
+    0xa4000e,
+    0xa4000e,
+    0x99000e,
+    0x99000e,
+    0xa6000e,
+    0xa6000e,
+    0xa7000e,
+    0xa7000e,
+    0x8e000f,
+    0x9a000f,
+    0x9b000f,
+    0xa8000f
+};
+const Int32 huff_tab10[186] =
+{
+    0xe0004,
+    0xe0004,
+    0xe0004,
+    0xe0004,
+    0xf0004,
+    0xf0004,
+    0xf0004,
+    0xf0004,
+    0x1b0004,
+    0x1b0004,
+    0x1b0004,
+    0x1b0004,
+    0x1c0005,
+    0x1c0005,
+    0xd0005,
+    0xd0005,
+    0x10005,
+    0x10005,
+    0x100005,
+    0x100005,
+    0x290005,
+    0x290005,
+    0x280005,
+    0x280005,
+    0x1d0005,
+    0x1d0005,
+    0x2a0005,
+    0x2a0005,
+    0x1a0006,
+    0x20006,
+    0x1e0006,
+    0x360006,
+    0x110006,
+    0x350006,
+    0x6,
+    0x370006,
+    0x2b0006,
+    0x270006,
+    0x30006,
+    0x380006,
+    0x1f0006,
+    0x430006,
+    0x120007,
+    0x420007,
+    0x440007,
+    0x2c0007,
+    0x450007,
+    0x390007,
+    0x500007,
+    0x200007,
+    0x510007,
+    0x340007,
+    0x4f0007,
+    0x40007,
+    0x130007,
+    0x2d0007,
+    0x460007,
+    0x520007,
+    0x3a0007,
+    0x530008,
+    0x5d0008,
+    0x2e0008,
+    0x210008,
+    0x470008,
+    0x6a0008,
+    0x5e0008,
+    0x410008,
+    0x5c0008,
+    0x50008,
+    0x690008,
+    0x140008,
+    0x6b0008,
+    0x5f0008,
+    0x3b0008,
+    0x220008,
+    0x540008,
+    0x600008,
+    0x150008,
+    0x2f0008,
+    0x6c0008,
+    0x3c0008,
+    0x480008,
+    0x6d0008,
+    0x490008,
+    0x610009,
+    0x550009,
+    0x770009,
+    0x4e0009,
+    0x560009,
+    0x780009,
+    0x300009,
+    0x760009,
+    0x230009,
+    0x60009,
+    0x6e0009,
+    0x790009,
+    0x3d0009,
+    0x840009,
+    0x160009,
+    0x620009,
+    0x6f0009,
+    0x7a0009,
+    0x630009,
+    0x850009,
+    0x4a0009,
+    0x860009,
+    0x240009,
+    0x830009,
+    0x310009,
+    0x7b0009,
+    0x570009,
+    0x680009,
+    0x3e0009,
+    0x5b0009,
+    0x910009,
+    0x64000a,
+    0x92000a,
+    0x88000a,
+    0x17000a,
+    0x90000a,
+    0x7c000a,
+    0x7000a,
+    0x70000a,
+    0x87000a,
+    0x32000a,
+    0x4b000a,
+    0x71000a,
+    0x94000a,
+    0x8000a,
+    0x93000a,
+    0x25000a,
+    0x65000a,
+    0x58000a,
+    0x89000a,
+    0x3f000a,
+    0x18000a,
+    0x9e000a,
+    0x7d000a,
+    0x9f000a,
+    0x95000a,
+    0x4c000a,
+    0xa0000a,
+    0x96000a,
+    0xa1000a,
+    0x33000a,
+    0x59000a,
+    0x75000a,
+    0x8a000a,
+    0x82000a,
+    0x9d000a,
+    0x9000a,
+    0x40000a,
+    0x7e000a,
+    0xa2000a,
+    0x26000a,
+    0x72000a,
+    0x7f000b,
+    0x19000b,
+    0x97000b,
+    0xa3000b,
+    0x66000b,
+    0x4d000b,
+    0x5a000b,
+    0x8b000b,
+    0x73000b,
+    0xa4000b,
+    0xa000b,
+    0x67000b,
+    0x8f000b,
+    0x8c000b,
+    0x98000b,
+    0x99000b,
+    0xb000b,
+    0x9a000b,
+    0x80000b,
+    0x8d000b,
+    0x9c000b,
+    0x74000b,
+    0xa5000c,
+    0x8e000c,
+    0x81000c,
+    0x9b000c,
+    0xa7000c,
+    0xc000c,
+    0xa6000c,
+    0xa8000c
+};
+const Int32 huff_tab11[301] =
+{
+    0x4,
+    0x4,
+    0x4,
+    0x4,
+    0x120004,
+    0x120004,
+    0x120004,
+    0x120004,
+    0x1200005,
+    0x1200005,
+    0x110005,
+    0x110005,
+    0x10005,
+    0x10005,
+    0x230005,
+    0x230005,
+    0x130005,
+    0x130005,
+    0x240005,
+    0x240005,
+    0x140006,
+    0x340006,
+    0x350006,
+    0x220006,
+    0x250006,
+    0x20006,
+    0x360006,
+    0x450007,
+    0x150007,
+    0x460007,
+    0x260007,
+    0x470007,
+    0x370007,
+    0x330007,
+    0x30007,
+    0x560007,
+    0x570007,
+    0x270007,
+    0x480007,
+    0x160007,
+    0x580007,
+    0x380007,
+    0x590007,
+    0x490008,
+    0x680008,
+    0x280008,
+    0x670008,
+    0x690008,
+    0x390008,
+    0x170008,
+    0x540008,
+    0x430008,
+    0x1150008,
+    0x1130008,
+    0x1140008,
+    0x6a0008,
+    0x1160008,
+    0x440008,
+    0x4a0008,
+    0x40008,
+    0x320008,
+    0x5a0008,
+    0x650008,
+    0x1170008,
+    0x1120008,
+    0x1180008,
+    0x290008,
+    0x790008,
+    0x3a0008,
+    0x6b0008,
+    0x5b0008,
+    0x760008,
+    0x11a0008,
+    0x7a0008,
+    0x780008,
+    0x1190008,
+    0x870008,
+    0x210008,
+    0x180008,
+    0x4b0008,
+    0x11b0008,
+    0x7b0008,
+    0x11c0008,
+    0x980008,
+    0x1110008,
+    0x6c0008,
+    0xa90008,
+    0x2a0008,
+    0x5c0008,
+    0xba0008,
+    0x11d0008,
+    0x8b0008,
+    0x8a0008,
+    0x3b0008,
+    0x550008,
+    0x11e0008,
+    0xcb0008,
+    0x7c0008,
+    0x4c0008,
+    0x6d0008,
+    0x7d0008,
+    0x50008,
+    0x8c0009,
+    0x11f0009,
+    0xdc0009,
+    0x190009,
+    0x890009,
+    0xfe0009,
+    0x5d0009,
+    0xed0009,
+    0x3c0009,
+    0x8d0009,
+    0x7e0009,
+    0x2b0009,
+    0x8e0009,
+    0x9b0009,
+    0x9c0009,
+    0x10f0009,
+    0x4d0009,
+    0x6e0009,
+    0x660009,
+    0x9d0009,
+    0x5e0009,
+    0x8f0009,
+    0x7f0009,
+    0x1a0009,
+    0xad0009,
+    0x60009,
+    0xac0009,
+    0x9a0009,
+    0x9e0009,
+    0x4e0009,
+    0x2c0009,
+    0x9f0009,
+    0x3d0009,
+    0x6f0009,
+    0xae0009,
+    0x900009,
+    0xaf0009,
+    0xa00009,
+    0xbe0009,
+    0x1b0009,
+    0x770009,
+    0xb00009,
+    0x800009,
+    0x3e0009,
+    0x5f0009,
+    0xab0009,
+    0x4f0009,
+    0xbd0009,
+    0xdf0009,
+    0x700009,
+    0xe00009,
+    0x2d0009,
+    0x1100009,
+    0x600009,
+    0xc00009,
+    0xbf000a,
+    0xa1000a,
+    0x81000a,
+    0x91000a,
+    0x10000a,
+    0x51000a,
+    0x7000a,
+    0x40000a,
+    0xc1000a,
+    0xde000a,
+    0xe1000a,
+    0xcf000a,
+    0x2f000a,
+    0xe2000a,
+    0x92000a,
+    0x71000a,
+    0xb2000a,
+    0xb1000a,
+    0xf0000a,
+    0xd0000a,
+    0x1c000a,
+    0x50000a,
+    0xbc000a,
+    0x3f000a,
+    0x1e000a,
+    0xce000a,
+    0x82000a,
+    0x41000a,
+    0x61000a,
+    0x62000a,
+    0xf2000a,
+    0x52000a,
+    0xc2000a,
+    0xf1000a,
+    0xd1000a,
+    0xe3000a,
+    0xd2000a,
+    0x88000a,
+    0xc3000a,
+    0x2e000a,
+    0xa2000a,
+    0xf3000a,
+    0x73000a,
+    0xb4000a,
+    0x101000a,
+    0x93000a,
+    0xa3000a,
+    0xf4000a,
+    0xb3000a,
+    0x63000a,
+    0xc4000a,
+    0xef000a,
+    0x30000a,
+    0x72000a,
+    0x1d000a,
+    0xe5000a,
+    0x8000a,
+    0xe4000a,
+    0x83000a,
+    0xd3000a,
+    0x84000a,
+    0x102000a,
+    0xcd000a,
+    0x74000a,
+    0x31000a,
+    0x104000a,
+    0x103000a,
+    0x1f000a,
+    0xa4000a,
+    0x53000a,
+    0xf5000a,
+    0x95000a,
+    0xe6000a,
+    0x94000a,
+    0x64000a,
+    0x42000a,
+    0xb5000a,
+    0xc5000a,
+    0xd4000a,
+    0x105000a,
+    0x106000a,
+    0x96000a,
+    0x100000a,
+    0x85000a,
+    0x99000a,
+    0x9000a,
+    0xa6000a,
+    0xa5000a,
+    0xd5000a,
+    0xf6000a,
+    0xb7000a,
+    0xf7000a,
+    0xd6000a,
+    0x75000a,
+    0x86000a,
+    0xa7000b,
+    0x107000b,
+    0xc6000b,
+    0xc9000b,
+    0x20000b,
+    0xb6000b,
+    0xb8000b,
+    0xe8000b,
+    0xe7000b,
+    0xc8000b,
+    0xc7000b,
+    0x97000b,
+    0xf9000b,
+    0xe9000b,
+    0xd9000b,
+    0x108000b,
+    0xf8000b,
+    0xaa000b,
+    0xd7000b,
+    0xa8000b,
+    0xa000b,
+    0xd8000b,
+    0xbb000b,
+    0xda000b,
+    0xb9000b,
+    0xea000b,
+    0xd000b,
+    0xfa000b,
+    0x109000b,
+    0x10a000b,
+    0xca000b,
+    0xfb000b,
+    0xdd000b,
+    0xb000b,
+    0xeb000b,
+    0x10b000b,
+    0x10c000b,
+    0xdb000b,
+    0xee000b,
+    0xfc000b,
+    0xec000b,
+    0xcc000b,
+    0xfd000b,
+    0xe000c,
+    0xc000c,
+    0x10d000c,
+    0xff000c,
+    0xf000c,
+    0x10e000c
+};
+
+const UInt32 huff_tab_scl[188] =
+{
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3b0003,
+    0x3d0004,
+    0x3d0004,
+    0x3d0004,
+    0x3d0004,
+    0x3a0004,
+    0x3a0004,
+    0x3a0004,
+    0x3a0004,
+    0x3e0004,
+    0x3e0004,
+    0x3e0004,
+    0x3e0004,
+    0x390005,
+    0x390005,
+    0x3f0005,
+    0x3f0005,
+    0x380006,
+    0x400006,
+    0x370006,
+    0x410006,
+    0x420007,
+    0x420007,
+    0x420007,
+    0x420007,
+    0x360007,
+    0x360007,
+    0x360007,
+    0x360007,
+    0x430007,
+    0x430007,
+    0x430007,
+    0x430007,
+    0x350008,
+    0x350008,
+    0x440008,
+    0x440008,
+    0x340008,
+    0x340008,
+    0x450008,
+    0x450008,
+    0x330008,
+    0x330008,
+    0x460009,
+    0x320009,
+    0x310009,
+    0x470009,
+    0x48000a,
+    0x48000a,
+    0x48000a,
+    0x48000a,
+    0x30000a,
+    0x30000a,
+    0x30000a,
+    0x30000a,
+    0x49000a,
+    0x49000a,
+    0x49000a,
+    0x49000a,
+    0x2f000a,
+    0x2f000a,
+    0x2f000a,
+    0x2f000a,
+    0x4a000a,
+    0x4a000a,
+    0x4a000a,
+    0x4a000a,
+    0x2e000a,
+    0x2e000a,
+    0x2e000a,
+    0x2e000a,
+    0x4c000b,
+    0x4c000b,
+    0x4b000b,
+    0x4b000b,
+    0x4d000b,
+    0x4d000b,
+    0x4e000b,
+    0x4e000b,
+    0x2d000b,
+    0x2d000b,
+    0x2b000b,
+    0x2b000b,
+    0x2c000c,
+    0x4f000c,
+    0x2a000c,
+    0x29000c,
+    0x50000c,
+    0x28000c,
+    0x51000d,
+    0x51000d,
+    0x27000d,
+    0x27000d,
+    0x52000d,
+    0x52000d,
+    0x26000d,
+    0x26000d,
+    0x53000d,
+    0x53000d,
+    0x25000e,
+    0x23000e,
+    0x55000e,
+    0x21000e,
+    0x24000e,
+    0x22000e,
+    0x54000e,
+    0x20000e,
+    0x57000f,
+    0x57000f,
+    0x59000f,
+    0x59000f,
+    0x1e000f,
+    0x1e000f,
+    0x1f000f,
+    0x1f000f,
+    0x560010,
+    0x1d0010,
+    0x1a0010,
+    0x1b0010,
+    0x1c0010,
+    0x180010,
+    0x580010,
+    0x190011,
+    0x190011,
+    0x160011,
+    0x160011,
+    0x170011,
+    0x170011,
+    0x5a0012,
+    0x150012,
+    0x130012,
+    0x30012,
+    0x10012,
+    0x20012,
+    0x12,
+    0x620013,
+    0x630013,
+    0x640013,
+    0x650013,
+    0x660013,
+    0x750013,
+    0x610013,
+    0x5b0013,
+    0x5c0013,
+    0x5d0013,
+    0x5e0013,
+    0x5f0013,
+    0x600013,
+    0x680013,
+    0x6f0013,
+    0x700013,
+    0x710013,
+    0x720013,
+    0x730013,
+    0x740013,
+    0x6e0013,
+    0x690013,
+    0x6a0013,
+    0x6b0013,
+    0x6c0013,
+    0x6d0013,
+    0x760013,
+    0x60013,
+    0x80013,
+    0x90013,
+    0xa0013,
+    0x50013,
+    0x670013,
+    0x780013,
+    0x770013,
+    0x40013,
+    0x70013,
+    0xf0013,
+    0x100013,
+    0x120013,
+    0x140013,
+    0x110013,
+    0xb0013,
+    0xc0013,
+    0xe0013,
+    0xd0013
+};
diff --git a/media/libstagefright/codecs/aacdec/huffcb.cpp b/media/libstagefright/codecs/aacdec/huffcb.cpp
new file mode 100644
index 0000000..30f38fa
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/huffcb.cpp
@@ -0,0 +1,381 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/huffcb.c
+ Funtions:
+    huffcb
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Change variable names for clarity,
+               change variables 'base', 'sect_len_inc', and 'esc_val' to
+               UChar type.
+
+ Description:  Add "if ((pSect[-1] % sfb_per_win) > max_sfb)" statement to
+               detect the error condition.
+               add more white space.
+
+ Description: eliminated "pSect[-1]%sfb_per_win" operation
+
+ Description: eliminated "pSect[-1]%sfb_per_win" operation
+
+ Description: (1) Pass in SectInfo pSect
+              (2) put BITS *pInputStream as second parameter
+
+ Description:  Fix a failure for thrid party AAC encoding.
+               The problem came when the total and the
+               maximun number of active scale factor bands do not coincide.
+               This is a rare situation but produces a problem when decoding
+               encoders that tolerate this.
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    UChar   *pSect  = pointer to array that contains the interleaved
+                      information of huffman codebook index and section
+                      length. Array contains:
+                      [codebook index]
+                      [section boundary]
+                      [codebook index]
+                      [section boundary]
+                      ...
+
+    Int     sectbits  =   array that defines the number of bits
+                          used for expressing the escape value of
+                          section length
+
+    Int     tot_sfb     = total number of sfb in one Frame
+
+    Int     sfb_per_win = number of sfb in each sub-block (window)
+
+    UChar   max_sfb     = 1 + number of active sfbs - see reference (2) p56
+
+    BITS    *pInputStream = pointer to input stream
+
+
+ Local Stores/Buffers/Pointers Needed:
+
+    UChar    base     = number of sfb in already detected sections
+
+    UChar    sect_len_inc = section length increment in number of sfbs'
+
+    UChar    esc_val  = escape value for section length
+
+    Int     bits     = number of bits needed for expressing section length
+
+
+ Global Stores/Buffers/Pointers Needed:
+
+
+ Outputs:
+
+    num_sect = total number of sections in one frame
+
+
+ Pointers and Buffers Modified:
+
+    UChar    *pSect = pointer to array where huffman codebook index and
+                     section length are stored
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Background knowledge: 1024(960) coef's are separated into several sections,
+ each section is encoded with one single Huffman codebook, and each section
+ has a length of multiples of sfb.
+
+ max_sfb <= sfb_per_win <= tot_sfb
+ tot_sfb = total number of scalefactor bands in one frame (1024 coefs)
+
+ This function reads the codebook index and section boundaries (expressed
+ in number of sfb) from the input bitstream, store these information in
+ *pSect, and return the number of sections been detected. Returns 0 if there
+ is an error.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should fill the array *pSect with section Huffman codebook
+ indexes and section boundaries
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3 1999(E)
+   Subpart 4    p55     (Recovering section_data())
+                p24-25  (Syntax of section_data())
+
+ (3) M. Bosi, K. Brandenburg, etc., "ISO/IEC MPEG-2 Advanced Audio Coding,"
+     J. Audio Eng. Soc., Vol.45, No.10, 1997 October
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ bits_needed_for_ESC  = sectbits[0];
+ ESC_value            = (1<<bits_needed_for_ESC) - 1;
+ num_of_section       = 0;
+
+
+ FOR (base = 0; base<total_sfb AND num_of_section<total_sfb)
+ {
+    *pSect++     = getbits(LEN_CB, pInputStream);   (read huffman_codebook_num)
+    sect_length_incr  = getbits(bits_needed_for_ESC, pInputStream);
+
+    WHILE (sect_length_incr == ESC_value AND base < total_sfb)
+    {
+        base              += ESC_value;
+        sect_length_incr  =  getbits(bits_needed_for_ESC, ebits);
+    }
+    ENDWHILE
+
+    base      += sect_length_incr;
+    *pSect++   =  base;
+    num_of_section++;
+
+   IF (num_of_sfb_for_this_group==max_sfb)
+   {
+        *pSect++    = 0; (use huffman codebook 0)
+        base       += sfb_per_win - max_sfb;
+        *pSect++    = base;
+        num_of_section++;
+   }
+   ENDIF
+
+   IF (num_of_sfb_for_this_group > max_sfb)
+        break;
+   ENDIF
+
+ }
+ ENDFOR
+
+ IF (base != total_sfb OR num_of_section>total_sfb)
+      return 0;
+ ENDIF
+
+ return num_sect;
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "huffman.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
+----------------------------------------------------------------------------*/
+Int huffcb(
+    SectInfo    *pSect,
+    BITS        *pInputStream,
+    Int         sectbits[],
+    Int         tot_sfb,
+    Int         sfb_per_win,
+    Int         max_sfb)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    Int   base;        /* section boundary */
+    Int   sect_len_incr;
+    Int   esc_val;     /* ESC of section length = 31(long), =7 (short) */
+    Int     bits;        /* # of bits used to express esc_val */
+    Int     num_sect;
+    Int     active_sfb;
+    Int   group_base;
+
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    bits       =  sectbits[0];     /* 3 for SHORT_WIN, 5 for LONG_WIN */
+    esc_val    = (1 << bits) - 1;   /* ESC_value for section length */
+    num_sect   =  0;
+    base       =  0;
+    group_base =  0;
+
+    /* read until the end of one frame */
+    while ((base < tot_sfb) && (num_sect < tot_sfb))
+    {
+
+        pSect->sect_cb  = get9_n_lessbits(
+                              LEN_CB,
+                              pInputStream); /* section codebook */
+
+        sect_len_incr   = get9_n_lessbits(
+                              bits,
+                              pInputStream); /* length_incr */
+
+
+        /* read until non-ESC value, see p55 reference 2 */
+        while ((sect_len_incr == esc_val) && (base < tot_sfb))
+        {
+            base            +=  esc_val;
+
+            sect_len_incr   = get9_n_lessbits(
+                                  bits,
+                                  pInputStream);
+        }
+
+        base      += sect_len_incr;
+        pSect->sect_end  =  base; /* total # of sfb until current section */
+        pSect++;
+        num_sect++;
+
+        /* active_sfb = base % sfb_per_win; */
+        active_sfb = base - group_base;
+
+        /*
+         *  insert a zero section for regions above max_sfb for each group
+         *  Make sure that active_sfb is also lesser than tot_sfb
+         */
+
+        if ((active_sfb == max_sfb) && (active_sfb < tot_sfb))
+        {
+            base      += (sfb_per_win - max_sfb);
+            pSect->sect_cb   =   0; /* huffman codebook 0 */
+            pSect->sect_end  =   base;
+            num_sect++;
+            pSect++;
+            group_base = base;
+        }
+        else if (active_sfb > max_sfb)
+        {
+            /* within each group, the sections must delineate the sfb
+             * from zero to max_sfb so that the 1st section within each
+             * group starts at sfb0 and the last section ends at max_sfb
+             * see p55 reference 2
+             */
+            break;
+        }
+
+    } /* while (base=0) */
+
+
+    if (base != tot_sfb || num_sect > tot_sfb)
+    {
+        num_sect = 0;   /* error */
+    }
+
+    return num_sect;
+
+} /* huffcb */
+
+
diff --git a/media/libstagefright/codecs/aacdec/huffdecode.cpp b/media/libstagefright/codecs/aacdec/huffdecode.cpp
new file mode 100644
index 0000000..890a6fb
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/huffdecode.cpp
@@ -0,0 +1,528 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: huffdecode.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Change variable types.
+
+ Description:  (1) Modified to bring in-line with PV standards.
+               (2) Eliminated global_gain on stack,
+                   getics() has to define this parameter on its stack.
+               (3) Eliminated multiple returns
+               (4) Altered return logic of getics()
+               (5) Convert Real coef -> Int32 coef
+               (6) Move BITS *pInputStream to 2nd parameter of huffdecode.c
+                   and getics.c
+               (7) Pass pFrameInfo per channel, because two channels can have
+                   different windows
+
+ Description: (1) Eliminated function call to chn_config
+              (2) Eliminate widx calculation
+              (3) copy channel info from left to right when common_window
+                  is enabled
+              (4) add error checking of getmask return value
+
+ Description:  Change default_position to current_program
+
+ Description:  Remove prstflag
+
+ Description:  Modify call to get_ics_info
+
+ Description:  Modified so getmask is NOT called if the status returned
+ from get_ics_info indicates an error.
+
+ Description:
+ (1) Added include of "e_ElementId.h"
+     Previously, this function was relying on another include file
+     to include e_ElementId.h
+
+ (2) Updated the copyright header.
+
+ Description:  Modified to include usage of the new "shared memory" structures
+ defined in s_tDec_Int_File.h and s_tDec_Int_Chan.h
+
+ Description:
+ (1) Updated to reflect the fact that the temporary FrameInfo used by getics.c
+ was moved into the region of memory shared with fxpCoef.
+
+ Description:
+ (1) Removed first parameter to getics.  The temporary FrameInfo was
+     unnecessary.
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Description: Relaxed tag verification. Some encoder do not match the tag
+              to the channel ID (as the standard request to differentiate
+              different channel), in our wireless work, with only mono
+              or stereo channel, this become restrictive to some encoders
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    id_syn_ele  = identification flag for channel syntactic element, Int
+
+    pInputStream= pointer to input bitstream, BITS.
+
+    pVars       = pointer to structure that holds information for decoding,
+                  tDec_Int_File
+
+    pChVars[]   = pointer to structure that holds channel information,
+                  tDec_Int_Chan
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    status = 0  if success
+             non-zero  otherwise
+
+ Pointers and Buffers Modified:
+    pChVars->sect   contents updated by newly decoded section information
+                    of current frame
+
+    pChVars->factors contents updated by newly decoded scalefactors
+
+    pChVars->ch_coef contents updated by newly decoded spectral coefficients
+
+    PChVars->tns    contents updated by newly decoded TNS information
+
+    pVars->hasmask  contents updated by newly decoded Mid/Side mask
+                    information
+
+    pVars->pulseInfo contents updated by newly decoded pulse data information
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  This function offers a framework for decoding the data of the next 1024
+  samples. It maps the channel configuration according to the id_syn_ele flag,
+  configures the channel information, and calls getics to do huffman decoding
+  The function returns 1 if there was an error
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should set up the channel configuration for huffman decoding
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4       p15     (single_channel_element, channel_pair_element)
+                    p15     (Table 4.4.5    getmask)
+                    p16     (Table 4.4.6    get_ics_info)
+                    p24     (Table 4.4.24   getics)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    tag = CALL getbits(LEN_TAG,pInputStream)
+                MODIFYING(pInputStream)
+                RETURNING(tag)
+
+    common_window = 0;
+
+    IF (id_syn_ele == ID_CPE)
+    THEN
+        common_window = CALL getbits(LEN_COM_WIN,pInputStream);
+                                MODIFYING(pInputStream)
+                                RETURNING(common_window)
+    ENDIF
+
+    pMcInfo = &pVars->mc_info;
+
+    IF ( (pMcInfo->ch_info[0].cpe != id_syn_ele) OR
+         (pMcInfo->ch_info[0].tag != tag) )
+    THEN
+        status = 1;
+    ENDIF
+
+
+    IF (status == SUCCESS)
+    THEN
+        IF (id_syn_ele == ID_SCE)
+        THEN
+
+            leftCh  = 0;
+            RIGHT = 0;
+            pChVars[leftCh]->hasmask = 0;
+        ELSEIF (id_syn_ele == ID_CPE)
+
+            leftCh = 0;
+            rightCh  = 1;
+
+            IF (common_window != FALSE)
+            THEN
+
+                CALL get_ics_info(
+                        audioObjectType = pVars->mc_info.audioObjectType,
+                        pInputStream = pInputStream,
+                        common_window = common_window,
+                        pWindowSequence = &pChVars[leftCh]->wnd,
+                        &pChVars[leftCh]->wnd_shape_this_bk,
+                        pChVars[leftCh]->group,
+                        &pChVars[leftCh]->max_sfb,
+                        pVars->winmap,
+                        &pChVars[leftCh]->lt_status,
+                        &pChVars[rightCh]->lt_status);
+                     MODIFYING(pInputStream, wnd, wnd_shape_this_bk,group,
+                               max_sfb, lt_status)
+                     RETURNING(status)
+
+                IF (status == SUCCESS)
+                THEN
+
+                    pChVars[rightCh]->wnd = pChVars[leftCh]->wnd;
+                    pChVars[rightCh]->wnd_shape_this_bk =
+                        pChVars[leftCh]->wnd_shape_this_bk;
+                    pChVars[rightCh]->max_sfb = pChVars[leftCh]->max_sfb;
+                    pv_memcpy(
+                        pChVars[rightCh]->group,
+                        pChVars[leftCh]->group,
+                        NSHORT*sizeof(pChVars[leftCh]->group[0]));
+
+                    hasmask = CALL getmask(
+                                    pVars->winmap[pChVars[leftCh]->wnd],
+                                    pInputStream,
+                                    pChVars[leftCh]->group,
+                                    pChVars[leftCh]->max_sfb,
+                                    pChVars[leftCh]->mask);
+                                MODIFYING(pInputStream, mask)
+                                RETURNING(hasmask)
+
+                    IF (hasmask == MASK_ERROR)
+                    THEN
+                        status = 1;
+                    ENDIF
+                    pChVars[leftCh]->hasmask  = hasmask;
+                    pChVars[rightCh]->hasmask = hasmask;
+
+                ENDIF
+
+            ELSE
+
+                 pChVars[leftCh]->hasmask  = 0;
+                 pChVars[rightCh]->hasmask = 0;
+            ENDIF(common_window)
+
+        ENDIF(id_syn_ele)
+
+    ENDIF (status)
+
+    ch = leftCh;
+
+    WHILE((ch <= rightCh) AND (status == SUCCESS))
+
+        status = CALL getics(
+                        pInputStream,
+                        common_window,
+                        pVars,
+                        pChVars[ch],
+                        pChVars[ch]->group,
+                        &pChVars[ch]->max_sfb,
+                        pChVars[ch]->cb_map,
+                        &pChVars[ch]->tns,
+                        pVars->winmap,
+                        &pVars->pulseInfo,
+                        pChVars[ch]->sect);
+                    MODIFYING(pInputStream,pVarsp,ChVars[ch],group,
+                              max_sfb,tns,pulseInfo,sect)
+                    RETURNING(status)
+
+        ch++;
+
+    ENDWHILE
+
+    RETURN status;
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "aac_mem_funcs.h"
+#include    "huffman.h"
+#include    "e_maskstatus.h"
+#include    "e_elementid.h"
+#include    "get_ics_info.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LEFT  (0)
+#define RIGHT (1)
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int huffdecode(
+    Int           id_syn_ele,
+    BITS          *pInputStream,
+    tDec_Int_File *pVars,
+    tDec_Int_Chan *pChVars[])
+
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Int      ch;
+    Int      common_window;
+    Int      hasmask;
+    Int      status   = SUCCESS;
+    Int      num_channels = 0;
+    MC_Info  *pMcInfo;
+
+    per_chan_share_w_fxpCoef *pChLeftShare;  /* Helper pointer */
+    per_chan_share_w_fxpCoef *pChRightShare; /* Helper pointer */
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    get9_n_lessbits(
+        LEN_TAG,
+        pInputStream);
+
+    /* suppose an un-supported id_syn_ele will never be passed */
+
+    common_window = 0;
+
+    if (id_syn_ele == ID_CPE)
+    {
+        common_window =
+            get1bits(pInputStream);
+    }
+
+    pMcInfo = &pVars->mc_info;
+
+    /*
+     *  check if provided info (num of channels) on audio config,
+     *  matches read bitstream data, if not, allow update only once.
+     *  In almost all cases it should match.
+     */
+    if ((pMcInfo->ch_info[0].cpe != id_syn_ele))
+    {
+        if (pVars->mc_info.implicit_channeling)     /* check done only once */
+        {
+            pMcInfo->ch_info[0].cpe = id_syn_ele & 1; /*  collect info from bitstream
+                                                     *  implicit_channeling flag is locked
+                                                     *  after 1st frame, to avoid toggling
+                                                     *  parameter in the middle of the clip
+                                                     */
+            pMcInfo->nch = (id_syn_ele & 1) + 1;     /* update number of channels */
+        }
+        else
+        {
+            status = 1; /* ERROR break if syntax error persist  */
+        }
+    }
+
+    if (status == SUCCESS)
+    {
+        if (id_syn_ele == ID_SCE)
+        {
+
+            num_channels = 1;
+            pVars->hasmask = 0;
+        }
+        else if (id_syn_ele == ID_CPE)
+        {
+            pChLeftShare = pChVars[LEFT]->pShareWfxpCoef;
+            pChRightShare = pChVars[RIGHT]->pShareWfxpCoef;
+            num_channels = 2;
+
+            if (common_window != FALSE)
+            {
+
+                status = get_ics_info(
+                             (tMP4AudioObjectType) pVars->mc_info.audioObjectType,
+                             pInputStream,
+                             (Bool)common_window,
+                             (WINDOW_SEQUENCE *) & pChVars[LEFT]->wnd,
+                             (WINDOW_SHAPE *) & pChVars[LEFT]->wnd_shape_this_bk,
+                             pChLeftShare->group,
+                             (Int *) & pChLeftShare->max_sfb,
+                             pVars->winmap,
+                             (LT_PRED_STATUS *) & pChLeftShare->lt_status,
+                             (LT_PRED_STATUS *) & pChRightShare->lt_status);
+
+                if (status == SUCCESS)
+                {
+                    /* copy left channel info to right channel */
+                    pChVars[RIGHT]->wnd = pChVars[LEFT]->wnd;
+                    pChVars[RIGHT]->wnd_shape_this_bk =
+                        pChVars[LEFT]->wnd_shape_this_bk;
+                    pChRightShare->max_sfb = pChLeftShare->max_sfb;
+                    pv_memcpy(
+                        pChRightShare->group,
+                        pChLeftShare->group,
+                        NSHORT*sizeof(pChLeftShare->group[0]));
+
+                    hasmask = getmask(
+                                  pVars->winmap[pChVars[LEFT]->wnd],
+                                  pInputStream,
+                                  pChLeftShare->group,
+                                  pChLeftShare->max_sfb,
+                                  pVars->mask);
+
+                    if (hasmask == MASK_ERROR)
+                    {
+                        status = 1; /* ERROR code */
+                    }
+                    pVars->hasmask  = hasmask;
+
+                } /* if (status == 0) */
+            }
+            else
+            {
+                pVars->hasmask  = 0;
+            } /* if (common_window) */
+
+        } /* if (id_syn_ele) */
+
+    } /* if (status) */
+
+    ch = 0;
+    while ((ch < num_channels) && (status == SUCCESS))
+    {
+        pChLeftShare = pChVars[ch]->pShareWfxpCoef;
+
+        status = getics(
+                     pInputStream,
+                     common_window,
+                     pVars,
+                     pChVars[ch],
+                     pChLeftShare->group,
+                     &pChLeftShare->max_sfb,
+                     pChLeftShare->cb_map,
+                     &pChLeftShare->tns,
+                     pVars->winmap,
+                     &pVars->share.a.pulseInfo,
+                     pVars->share.a.sect);
+
+        ch++;
+
+    } /* while (ch) */
+
+    /*----------------------------------------------------------------------------
+    ; Return status
+    ----------------------------------------------------------------------------*/
+
+    return status;
+
+} /* huffdecode */
+
diff --git a/media/libstagefright/codecs/aacdec/hufffac.cpp b/media/libstagefright/codecs/aacdec/hufffac.cpp
new file mode 100644
index 0000000..e5a9c59
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/hufffac.cpp
@@ -0,0 +1,550 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/hufffac.c
+ Funtions:
+    hufffac
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description: (1) Modified with new templates,
+              (2) Modified variable names for clarity
+              (3) adjusted variables of "for loop"
+              (4) eliminated multiple returns, use return valid
+
+ Description: (1) Change return logic: 0 if success, 1 if error
+              (2) Define SectInfo structure to store section codebook index
+                  and section boundary
+              (3) Substitute "switch" with "if- else if"
+              (4) move BITS *pInputStream to second pass-in parameter
+              (5) pass in huffBookUsed[] to save stack size
+
+ Description: (1) Remove pass in parameter Hcb pBook
+
+ Description: Use binary tree search in decode_huff_cw_binary
+
+ Description: Use decode_huff_scl function.
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    *pFrameInfo     = pointer to structure that holds information
+                      of each Frame. type FrameInfo
+
+    *pInputStream   = pointer to input bitstream. type BITS
+
+    *pGroup         = pointer to array that contains the index of the first
+                      window in each group, type UChar
+
+    nsect           = number of sections to be decoded. type Int
+
+    *pSect          = pointer to structure array that contains the huffman
+                      codebook index and section boundary for each section,
+                      type SectInfo
+
+    global_gain     = initial value for "DPCM encoded" scalefactors and noise
+                      energy, type Int
+
+    *pFactors       = pointer to array that stores the decoded scalefactors,
+                      intensity position or noise energy, type Int
+
+    huffBookUsed    = array that will hold the huffman codebook index for
+                      each sfb, type Int
+
+    *pBook          = pointer to structure that contains the huffman codebook
+                      information, such as dimension, Largest Absolute Value
+                      (LAV) of each huffman codebook, etc. type Hcb
+
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+         0 if success
+         1 if error
+
+ Pointers and Buffers Modified:
+
+        Int   *pFactors    contains the newly decoded scalefactors and/or
+                             intensity position and/or noise energy level
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function first reads the Huffman codebook index of all sections within
+ one Frame. Then, depending on the huffman codebook index of each section,
+ the function decodes the scalefactors, and/or intensity positions
+ (INTENSITY_HCB, INTENSITY_HCB2), and/or noise energy (NOISE_HCB)
+ for every scalefactor band in each section.
+ The function returns 0 upon successful decoding, returns 1 if error.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should replace the content of the array pFactors with the
+ decoded scalefactors and/or intensity positions and/or noise energy
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+     Subpart 4      p72-73  (scalefactors)
+                    p76     (decoding)
+                    p78     (Table 4.6.1, Table 4.6.2)
+                    p93-94  (INTENSITY_HCB)
+                    p123    (NOISE_HCB)
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ status = SUCCESS;
+
+ CALL pv_memset(pHuffBookUsed, ZERO_HCB, MAXBANDS*sizeof(*pHuffBookUsed));
+
+ CALL pv_memset(pFactors, ZERO_HCB, MAXBANDS*sizeof(*pFactors));
+
+ sect_start       = 0;
+
+ FOR(sect_idx = nsect; sect_idx > 0; sect_idx--)
+ {
+     sect_cb  = pSect->sect_cb;
+     sect_end = pSect->sect_end;
+     pSect++;
+
+     CALL pv_memset(
+        &pHuffBookUsed[sect_start],
+        sect_cb,
+        (sect_end - sect_start));
+
+ }
+ ENDFOR
+
+    fac       = global_gain;
+    is_pos    = 0;
+    noise_nrg = global_gain - NOISE_OFFSET;
+
+    pTable    = pBook[BOOKSCL].pTable;
+    group_win  = 0;
+    group_end  = 0;
+
+    WHILE((group_end < pFrameInfo->num_win)&&(status == SUCCESS))
+    {
+        nsfb_win  = pFrameInfo->sfb_per_win[group_end];
+        group_end = *pGroup++;
+
+        FOR(sfb = 0; sfb < nsfb_win; sfb++)
+        {
+            IF ((pHuffBookUsed[sfb] > 0)&&(pHuffBookUsed[sfb] < BOOKSCL))
+            {
+                cw_index = CALL decode_huff_cw_binary(pTable, pInputStream);
+
+                fac      += cw_index - MIDFAC;
+
+                IF((fac >= 2*TEXP) || (fac < 0))
+                {
+                    status = 1;
+                }
+                ELSE
+                {
+                    pFactors[sfb] = fac;
+                }
+                ENDIF (fac)
+
+            }
+            ELSE IF (pHuffBookUsed[sfb] == ZERO_HCB)
+            {
+                do nothing;
+            }
+
+            ELSE IF ((pHuffBookUsed[sfb] == INTENSITY_HCB)||
+                     (pHuffBookUsed[sfb] == INTENSITY_HCB2))
+            {
+                cw_index = CALL decode_huff_cw_binary(pTable, pInputStream);
+
+                is_pos        += cw_index - MIDFAC;
+                pFactors[sfb] =  is_pos;
+            }
+
+            ELSE IF (pHuffBookUsed[sfb] == NOISE_HCB)
+            {
+                IF (noise_pcm_flag == TRUE)
+                {
+                    noise_pcm_flag = FALSE;
+                    dpcm_noise_nrg = CALL getbits(
+                                              NOISE_PCM_BITS,
+                                              pInputStream);
+
+                    dpcm_noise_nrg -= NOISE_PCM_OFFSET;
+                }
+                ELSE
+                {
+                    dpcm_noise_nrg = CALL decode_huff_cw_binary(
+                                              pTable,
+                                              pInputStream);
+
+                    dpcm_noise_nrg -= MIDFAC;
+                }
+                ENDIF (noise_pcm_flag)
+
+                noise_nrg       += dpcm_noise_nrg;
+                pFactors[sfb]   =  noise_nrg;
+            }
+
+            ELSE IF (pHuffBookUsed[sfb] == BOOKSCL)
+            {
+                status = 1;
+            }
+            ENDIF (pHuffBookUsed[sfb])
+
+        }
+        ENDFOR (sfb)
+
+        IF (pFrameInfo->islong == FALSE)
+        {
+
+            FOR(group_win++; group_win < group_end; group_win++)
+            {
+                FOR (sfb=0; sfb < nsfb_win; sfb++)
+                {
+                    pFactors[sfb + nsfb_win]  =  pFactors[sfb];
+                }
+                ENDFOR
+
+                pFactors  +=  nsfb_win;
+            }
+            ENDFOR
+
+        }
+        ENDIF (pFrameInfo)
+
+        pHuffBookUsed   += nsfb_win;
+        pFactors        += nsfb_win;
+
+    }
+    ENDWHILE (group_end)
+
+    return status;
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "aac_mem_funcs.h"       /* pv_memset */
+#include    "s_frameinfo.h"
+#include    "s_bits.h"
+#include    "s_sectinfo.h"
+#include    "s_huffman.h"
+#include    "ibstream.h"
+
+#include    "hcbtables.h"
+#include    "e_huffmanconst.h"
+#include    "e_infoinitconst.h"
+#include    "huffman.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
+----------------------------------------------------------------------------*/
+Int hufffac(
+    FrameInfo   *pFrameInfo,
+    BITS        *pInputStream,
+    Int         *pGroup,    /* may be changed to Int */
+    Int         nsect,
+    SectInfo    *pSect,     /* may be changed to Int */
+    Int         global_gain,
+    Int         *pFactors,
+    Int         huffBookUsed[])
+{
+    Int     sect_idx;
+    Int     group_end;  /* index of 1st window in next group */
+    Int     group_win;  /* window index within group */
+    Int     cw_index;   /* huff codeword index */
+    Int     nsfb_win;   /* # of scfbands per window */
+    Int     sfb;        /* scalefactor band index */
+    Int     sect_cb;    /* huff codebook # for each section */
+    Int     fac;        /* decoded scf */
+    Int     is_pos;     /* intensity stereo position */
+    Int     noise_pcm_flag = TRUE;  /* first PNS sfb */
+    Int     dpcm_noise_nrg;     /* dpcm noise energy */
+    Int     noise_nrg;      /* noise energy */
+    Int     status = SUCCESS;  /* status of decoding */
+    Int     *pHuffBookUsed = &huffBookUsed[0];
+
+
+    pv_memset(pFactors,
+              ZERO_HCB,
+              MAXBANDS*sizeof(*pFactors));
+
+
+    if (nsect)
+    {
+        /* read section length and codebook */
+
+        if (nsect == 1) /* long window */
+        {
+            sect_cb  = pSect->sect_cb;  /* codebook for this section */
+
+            /* all sfbs in one section share the same codebook */
+
+            for (sfb = pSect->sect_end >> 2; sfb != 0; sfb--)
+            {
+                *(pHuffBookUsed++) = sect_cb;
+                *(pHuffBookUsed++) = sect_cb;
+                *(pHuffBookUsed++) = sect_cb;
+                *(pHuffBookUsed++) = sect_cb;
+            }
+            for (sfb = pSect->sect_end & 3; sfb != 0; sfb--)
+            {
+                *(pHuffBookUsed++) = sect_cb;
+            }
+
+        }
+        else            /* short */
+        {
+            Int sect_start = 0; /* start index of sfb for each section */
+            for (sect_idx = nsect; sect_idx > 0; sect_idx--)
+            {
+                sect_cb  = pSect->sect_cb;  /* codebook for this section */
+
+                /* all sfbs in one section share the same codebook */
+                for (sfb = sect_start; sfb < pSect->sect_end; sfb++)
+                {
+                    pHuffBookUsed[sfb] = sect_cb;
+                }
+
+                pSect++;
+                sect_start = sfb;
+
+            } /* for (sect_idx) */
+        }
+    }
+    else
+    {
+        /* clear array for the case of max_sfb == 0 */
+        pv_memset(pHuffBookUsed,
+                  ZERO_HCB,
+                  MAXBANDS*sizeof(*pHuffBookUsed));
+    }
+
+    pHuffBookUsed = &huffBookUsed[0];
+
+    /* scale factors and noise energy are dpcm relative to global gain
+     * intensity positions are dpcm relative to zero
+     */
+    fac       = global_gain;
+    is_pos    = 0;
+    noise_nrg = global_gain - NOISE_OFFSET;
+
+    /* get scale factors,
+     * use reserved Table entry = 12, see reference (2) p78 Table 4.6.2
+     */
+    group_win  = 0;
+    group_end  = 0;
+
+
+    /* group by group decoding scalefactors and/or noise energy
+     * and/or intensity position
+     */
+    while ((group_end < pFrameInfo->num_win) && (status == SUCCESS))
+    {
+        nsfb_win  = pFrameInfo->sfb_per_win[group_end];
+        group_end = *pGroup++;  /* index of 1st window in next group */
+
+        /* decode scf in first window of each group */
+
+        for (sfb = 0; sfb < nsfb_win; sfb++)
+        {
+
+            switch (pHuffBookUsed[sfb])
+            {
+                case ZERO_HCB:
+                    break;
+                case INTENSITY_HCB:
+                case INTENSITY_HCB2:
+                    /* intensity books */
+                    /* decode intensity position */
+                    cw_index = decode_huff_scl(pInputStream);
+
+                    is_pos        += cw_index - MIDFAC;
+                    pFactors[sfb] =  is_pos;
+                    break;
+                case NOISE_HCB:
+                    /* noise books */
+                    /* decode noise energy */
+                    if (noise_pcm_flag == TRUE)
+                    {
+                        noise_pcm_flag = FALSE;
+                        dpcm_noise_nrg = get9_n_lessbits(NOISE_PCM_BITS,
+                                                         pInputStream);
+
+                        dpcm_noise_nrg -= NOISE_PCM_OFFSET;
+                    }
+                    else
+                    {
+                        dpcm_noise_nrg = decode_huff_scl(pInputStream);
+
+                        dpcm_noise_nrg -= MIDFAC;
+                    } /* if (noise_pcm_flag) */
+
+                    noise_nrg       += dpcm_noise_nrg;
+                    pFactors[sfb]   =  noise_nrg;
+                    break;
+                case BOOKSCL:
+                    status = 1; /* invalid books */
+                    sfb = nsfb_win;  /* force out */
+                    break;
+                default:
+                    /* spectral books */
+                    /* decode scale factors */
+                    cw_index = decode_huff_scl(pInputStream);
+
+                    fac      += cw_index - MIDFAC;   /* 1.5 dB */
+                    if ((fac >= 2*TEXP) || (fac < 0))
+                    {
+                        status = 1;   /* error, MUST 0<=scf<256, Ref. p73 */
+                    }
+                    else
+                    {
+                        pFactors[sfb] = fac;  /* store scf */
+                    } /* if (fac) */
+            }
+
+        } /* for (sfb=0), first window decode ends */
+
+        /* expand scf to other windows in the same group */
+        if (pFrameInfo->islong == FALSE)
+        {
+
+            for (group_win++; group_win < group_end; group_win++)
+            {
+                for (sfb = 0; sfb < nsfb_win; sfb++)
+                {
+                    pFactors[sfb + nsfb_win]  =  pFactors[sfb];
+                }
+                pFactors  +=  nsfb_win;
+            }
+
+        } /* if (pFrameInfo->islong), one group decode ends */
+
+
+        /* points to next group */
+        pHuffBookUsed   += nsfb_win;
+        pFactors        += nsfb_win;
+
+    } /* while (group_end), all groups decode end */
+
+    return status;
+
+} /* hufffac */
+
diff --git a/media/libstagefright/codecs/aacdec/huffman.h b/media/libstagefright/codecs/aacdec/huffman.h
new file mode 100644
index 0000000..030ae23
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/huffman.h
@@ -0,0 +1,241 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: .huffman.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Put declaration of getfill in this file.
+
+ Description: Remove prstflag from get_ics_info declaration.
+
+ Description: Trivial change of the data type of one of the parameters to
+              get_ics_info.
+
+ Description: Change where get_ics_info is declared.
+
+ Description: Clean up comments
+
+ Description: (1) Add declaration of binary tree search function for Huffman
+                  decoding
+              (2) #if the traditional and optimized linear seach methods.
+
+ Description: Modified per review comments
+              (1) delete #if traditional and optimized linear seach methods
+
+ Description: Merged Ken's change on getics: delete pFrameInfo from argument
+              list
+
+ Description: Added function definition for table specific huffman decoding
+              functions.
+
+ Who:                                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ include function prototype definitions for Huffman decoding module
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef HUFFMAN_H
+#define HUFFMAN_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_frameinfo.h"
+#include    "s_sectinfo.h"
+#include    "s_pulseinfo.h"
+#include    "s_tdec_int_file.h"
+#include    "s_tdec_int_chan.h"
+#include    "ibstream.h"
+
+#include    "s_hcb.h"
+#include    "hcbtables.h"
+
+#include    "get_pulse_data.h"
+#include    "get_ics_info.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define DIMENSION_4     4
+#define DIMENSION_2     2
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+    Int decode_huff_cw_tab1(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab2(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab3(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab4(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab5(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab6(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab7(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab8(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab9(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab10(
+        BITS *pInputStream);
+
+    Int decode_huff_cw_tab11(
+        BITS *pInputStream);
+
+    Int decode_huff_scl(
+        BITS          *pInputStream);
+
+    Int infoinit(
+        const  Int sampling_rate_idx,
+        FrameInfo   **ppWin_seq_info,
+        Int    *pSfbwidth128);
+
+    Int huffcb(
+        SectInfo *pSect,
+        BITS     *pInputStream,
+        Int      *pSectbits,
+        Int       tot_sfb,
+        Int       sfb_per_sbk,
+        Int       max_sfb);
+
+    Int hufffac(
+        FrameInfo   *pFrameInfo,
+        BITS        *pInputStream,
+        Int         *pGroup,
+        Int          nsect,
+        SectInfo    *pSect,
+        Int          global_gain,
+        Int         *pFactors,
+        Int          huffBookUsed[]);
+
+    Int huffspec_fxp(
+        FrameInfo *pFrameInfo,
+        BITS      *pInputStream,
+        Int       nsect,
+        SectInfo  *pSectInfo,
+        Int       factors[],
+        Int32     coef[],
+        Int16     quantSpec[],
+        Int16     tmp_spec[],
+        const FrameInfo  *pLongFrameInfo,
+        PulseInfo  *pPulseInfo,
+        Int         qFormat[]);
+
+    Int huffdecode(
+        Int           id_syn_ele,
+        BITS          *pInputStream,
+        tDec_Int_File *pVars,
+        tDec_Int_Chan *pChVars[]);
+
+    void deinterleave(
+        Int16          interleaved[],
+        Int16        deinterleaved[],
+        FrameInfo   *pFrameInfo);
+
+    Int getics(
+
+        BITS            *pInputStream,
+        Int             common_window,
+        tDec_Int_File   *pVars,
+        tDec_Int_Chan   *pChVars,
+        Int             group[],
+        Int             *pMax_sfb,
+        Int             *pCodebookMap,
+        TNS_frame_info  *pTnsInfo,
+        FrameInfo       **pWinMap,
+        PulseInfo       *pPulseInfo,
+        SectInfo        sect[]);
+
+    void  calc_gsfb_table(
+        FrameInfo   *pFrameInfo,
+        Int         group[]);
+
+    Int getmask(
+        FrameInfo   *pFrameInfo,
+        BITS        *pInputStream,
+        Int         *pGroup,
+        Int         max_sfb,
+        Int         *pMask);
+
+    void getgroup(
+        Int         group[],
+        BITS        *pInputStream);
+
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/huffspec_fxp.cpp b/media/libstagefright/codecs/aacdec/huffspec_fxp.cpp
new file mode 100644
index 0000000..b18c12d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/huffspec_fxp.cpp
@@ -0,0 +1,671 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname:  huffspec_fxp.c
+ Funtions:
+    huffspec_fxp
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description: (1) Modified to keep in-line with PV standards
+              (2) Eliminated "continue" in if(sect_cb==ZERO_HCB||...)
+
+ Description: (1) Use SectInfo *pSect
+              (2) Convert 'Real' to 'Int32', float -> fixed-point
+              (3) move BITS *pInputStream to second parameter
+              (4) pass in quantSpec and tmp_spec, scratch shared with hufffac
+              (5) pass in FrameInfo *pLongFrameInfo, eliminate only_long_info
+
+ Description: (1) Eliminate parameter Hcb *book, because of eliminating
+                  function 'hufftab.c', Hcb hcbbook defined as a
+                  const structure in 'hcbtables.h'.
+              (2) Replace three nested 'for' loops with a for-while loop in
+                  the rescaling part.
+              (3) Change esc_iquant-> esc_iquant_fxp, call esc_iquant_fxp()
+                  by sfb
+
+ Description: Cleaned up include files.
+
+ Description:  Correct definition of stack variable "scale".
+        It was defined as Int, but it receives an UInt value,
+        this present a problem when Int is 16 bits and
+        the sign bit is not interpreted correctly. This does not
+        shows for 32-bit implementations. This problem manifest itself
+        as a flipping sign on some spectral coefficients (the ones
+        multiplied by 0x8000).
+
+ Description: Typecast b_low and b_high to 32-bits before multiplication, this
+              assures propoer compilation on a 16-bit platform (TI-C55x)
+
+ Description: Modified to speed up decode_huff_cw
+
+ Description: pass codebook index to decode_huff_cw, delete pointer to Huffman
+              structure
+
+ Description: keep memset to quantSpec, remove memset to temp_spec
+
+ Description: Modified per review comments
+
+ Description: Use Binary tree search in decode_huff_cw_binary
+
+ Description: Modified per review comments
+              (1) delete unused codes
+
+ Description: (1) Change the interface to decode huffman codeword.
+              (2) Move the scaling inside the inverse quantization.
+              (3) Change scaling factor accuracy to 10 bits.
+
+ Description:
+              (1) delete unused variable max_fac
+
+ Description: Addresses of huffman tables are now found by means of a
+              switch statement, this solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pFrameInfo  = ptr to structure that holds Information of current Frame,
+                  type FrameInfo
+
+    pInputStream = ptr to structure of bitstream, type BITS
+
+    nsect       = number of sections in current Frame, at fs = 44.1 kHz,
+                  range [0, 49] long block, [0,112] short blocks. type Int
+
+    pSect       = ptr to structure that holds section codebook and boundary
+                  type SectInfo
+
+    factors[]   = array that contains scalefactors for each sfb, type Int16
+
+    coef[]      = array that holds inverse quantized coefs, Int32 QFormat.
+
+    quantSpec[] = array that holds quantized spectral coefs, type Int
+
+    tmp_spec[]  = temporary buffer to hold the de-interleaved coefs.
+
+    pLongFrameInfo = ptr to structure that holds long frame info
+
+ Local Stores/Buffers/Pointers Needed:
+    exptable = array contains the Q15 format data for 2^0, 2^0.25, 2^0.5,
+               and 2^0.75, type const Int.
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+
+    return 0 if decoding properly.
+
+ Pointers and Buffers Modified:
+
+    pInputStream    read codeword index and/or sign bits and/or ESC value
+
+    coef            contains the newly inverse quantized 1024 spec coefs,
+                    type Int32 Q-format from esc_iquant()
+
+    quantSpec       contains decoded quantized 1024 spec coefs, type Int
+
+    tmp_spec        contains the de-interleaved version of quantSpec
+
+    qFormat         contains Q-Format for each scalefactor band
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function first reads the section info (codebook and boundary), then
+ decode the spectral coefficients if a spectral codebook is used.
+ If necessary, get the sign bits, ESC value or the NEC_pulse data. In case of
+ short window sequences, the decoded data is de-interleaved before
+ multiplied by scalefactors.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function should set the content of the array 'coef' with the inverse
+ quantized and rescaled value of spectral coefficients.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart (4)         p56 (spectral_data() parsing and decoding)
+                        p26 (Syntax of spectral_data())
+                        p74-78 (decoding: unpack_idx, get_sign_bits,
+                                getescape, pulse_nc, deinterleave)
+                        p72 (inverse quantization: esc_iquant)
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "aac_mem_funcs.h"
+#include    "esc_iquant_scaling.h"
+#include    "huffman.h"
+#include    "unpack_idx.h"
+#include    "pulse_nc.h"
+#include    "iquant_table.h"
+#include    "e_huffmanconst.h"
+
+
+#include "pv_normalize.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define ORDER        (3)
+
+/*
+ * Format the table is stored in.
+ */
+#define QTABLE       (27)
+
+/*
+ * Number of bits for data in a signed 32 bit integer.
+ */
+#define SIGNED32BITS  (31)
+
+/*
+ * Round up value for intermediate values obtained from the table
+ */
+#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1)
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const UInt16 exptable[4] =
+{
+    0,  /* (2^0.00)<<15 (Q10), use zero to signal no scaling required! */
+    19485,  /* (2^0.25)<<15 */
+    23171,  /* (2^0.50)<<15 */
+    27555   /* (2^0.75)<<15 */
+
+};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int huffspec_fxp(
+    FrameInfo *pFrameInfo,
+    BITS      *pInputStream,
+    Int       nsect,
+    SectInfo  *pSectInfo,
+    Int       factors[],
+    Int32     coef[],
+    Int16     quantSpec[],
+    Int16     tmp_spec[],
+    const FrameInfo  *pLongFrameInfo,
+    PulseInfo  *pPulseInfo,
+    Int         qFormat[])
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    const Hcb       *pHcb;
+    Int     i;
+    Int     sfb;
+    Int     idx_count;
+    Int     sect_cb;    /* section codebook */
+    Int     dim;
+    Int     idx;
+    Int     stop_idx;     /* index of 1st coef in next sfb */
+    Int     sect_start;   /* start index of sfb in one section*/
+    Int     sect_end;     /* index of 1st sfb in next section */
+    Int     *pSfbStart;
+    Int     *pSfb;
+    Int16     *pQuantSpec;        /* probably could be short */
+    Int     max = 0;
+    /* rescaling parameters */
+    Int     nsfb;
+    Int     tot_sfb;
+    Int     fac;
+
+    Int32   *pCoef; /* ptr to coef[], inverse quantized coefs */
+    UInt16     scale;
+
+    Int     power_scale_div_4;
+    Int     sfbWidth;
+
+    void (*pUnpack_idx)(
+        Int16  quant_spec[],
+        Int  codeword_indx,
+        const Hcb *pHuffCodebook,
+        BITS  *pInputStream,
+        Int *max);
+
+    Int(*pDec_huff_tab)(BITS *) = NULL;
+
+    UInt32 temp;
+    Int    binaryDigits, QFormat;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    sect_start = 0;
+    stop_idx   = 0;
+
+    /* pSfb: ptr to array that holds stop index of each sfb */
+    pSfbStart = pFrameInfo->frame_sfb_top;
+
+    if (pSfbStart == NULL)
+    {
+        return (-1);   /*  error condition */
+    }
+
+    pSfb      = pSfbStart;
+
+    /* decoding spectral values section by section */
+    for (i = nsect; i > 0; i--)
+    {
+        /* read the codebook and section length */
+        sect_cb  =  pSectInfo->sect_cb;     /* codebook */
+        if ((sect_cb > 15) || (sect_cb < 0))
+        {
+            return (-1);   /*  error condition */
+        }
+        sect_end =  pSectInfo->sect_end;    /* # of sfbs */
+
+        if (sect_end < 0)
+        {
+            return (-1);   /*  error condition */
+        }
+
+        pSectInfo++;
+
+        /*  sect_cb       sect_cb - 1
+         *  ZERO_HCB        1111b
+         *    1             0000b
+         *    2             0001b
+         *    3             0010b
+         *    4             0011b
+         *    5             0100b
+         *    6             0101b
+         *    7             0110b
+         *    8             0111b
+         *    9             1000b
+         *    10            1001b
+         *    11            1010b
+         *    12            1011b
+         * NOISE_HCB        1100b
+         * INTENSITY_HCB2   1101b
+         * INTENSITY_HCB    1110b
+         * if ( ((sect_cb - 1) & 0xC) == 0xC ) is identical to
+         * if !((sect_cb == ZERO_HCB) || (sect_cb == NOISE_HCB) ||
+         *      (sec_cb == INTENSITY_HCB) || (sect_cb==INTENSITY_HCB2) )
+         * use this compare scheme to speed up the execution
+         */
+
+        if (((sect_cb - 1) & 0xC) != 0xC)
+        {
+            /* decode spec in one section */
+            if (sect_cb > BY4BOOKS)
+            {
+                dim = DIMENSION_2; /* set codebook dimension */
+            }
+            else
+            {
+                dim = DIMENSION_4;
+            }
+
+            pHcb        = &hcbbook_binary[sect_cb];
+
+            if (sect_cb == ESCBOOK)
+            {
+                pUnpack_idx = &unpack_idx_esc;
+            }
+            else if (pHcb->signed_cb == FALSE)
+            {
+                pUnpack_idx = &unpack_idx_sgn;
+            }
+            else
+            {
+                pUnpack_idx = &unpack_idx;
+            }
+
+
+            switch (sect_cb)
+            {
+                case 1:
+                    pDec_huff_tab = decode_huff_cw_tab1;
+                    break;
+                case 2:
+                    pDec_huff_tab = decode_huff_cw_tab2;
+                    break;
+                case 3:
+                    pDec_huff_tab = decode_huff_cw_tab3;
+                    break;
+                case 4:
+                    pDec_huff_tab = decode_huff_cw_tab4;
+                    break;
+                case 5:
+                    pDec_huff_tab = decode_huff_cw_tab5;
+                    break;
+                case 6:
+                    pDec_huff_tab = decode_huff_cw_tab6;
+                    break;
+                case 7:
+                    pDec_huff_tab = decode_huff_cw_tab7;
+                    break;
+                case 8:
+                    pDec_huff_tab = decode_huff_cw_tab8;
+                    break;
+                case 9:
+                    pDec_huff_tab = decode_huff_cw_tab9;
+                    break;
+                case 10:
+                    pDec_huff_tab = decode_huff_cw_tab10;
+                    break;
+                case 11:
+                    pDec_huff_tab = decode_huff_cw_tab11;
+                    break;
+                default:
+                    return (-1); /* error condition */
+            }
+
+            /* move ptr to first sfb of current section */
+            pQuantSpec  = quantSpec + stop_idx;
+
+            /* step through all sfbs in current section */
+            for (sfb = sect_start; sfb < sect_end; sfb++)
+            {
+                idx_count = *pSfb - stop_idx;
+                stop_idx  = *pSfb++;
+
+                /* decode all coefs for one sfb */
+                while ((idx_count > 0) && (idx_count < 1024))
+                {
+
+                    idx = (*pDec_huff_tab)(pInputStream);
+
+                    (*pUnpack_idx)(pQuantSpec,
+                                   idx,
+                                   pHcb,
+                                   pInputStream,
+                                   &max);      /* unpack idx -> coefs */
+
+                    pQuantSpec += dim;
+                    idx_count  -= dim;
+
+                } /* while(idx_count) */
+
+            } /* for (sfb=sect_start) */
+        }
+        else
+        {
+
+            /* current section uses ZERO_HCB, NOISE_HCB, etc */
+
+            /* move sfb pointer to the start sfb of next section */
+            pSfb        = pSfbStart + sect_end;
+            /* number of coefs in current section */
+            idx_count   = *(pSfb - 1) - stop_idx;
+
+            if ((idx_count > 1024) || (idx_count < 0))
+            {
+                return (-1);   /*  error condition */
+            }
+
+            /*
+             * This memset is necessary in terms of (1) net savings in total
+             * MIPS and (2) accurate Q-Formats for fft_rx2
+             * In case a scalefactor band uses ZERO_HCB, all coefficients of
+             * that sfb should be zeros. Without this call to memset, the
+             * coefficients for a ZERO_HCB sfb are the "leftovers" of the
+             * previous frame, which may not have all zero values. This leads
+             * to a drastical increase in the cycles consumed by esc_iquant_fxp
+             * and fft_rx2, which is the most "expensive" function of the
+             * library.
+             * This memset also guarantees the Q_Format for sfbs with all zero
+             * coefficients will be set properly.
+             * Profiling data on ARM and TMS320C55x proves that there is a net
+             * gain in total MIPS if a memset is called here.
+             */
+            pv_memset(&quantSpec[stop_idx],
+                      0,
+                      idx_count * sizeof(quantSpec[0]));
+
+            /*
+             * This memset is called because pQuantSpec points to tmp_spec
+             * after deinterleaving
+             */
+
+            pv_memset(&tmp_spec[stop_idx],
+                      0,
+                      idx_count * sizeof(tmp_spec[0]));
+
+
+            /* stop_idx is the index of the 1st coef of next section */
+            stop_idx    = *(pSfb - 1);
+
+        }/* if (sect_cb) */
+
+        sect_start = sect_end;
+
+    } /* for (i=nsect) */
+
+    /* noisless coding reconstruction */
+    if (pFrameInfo->islong != FALSE)
+    {
+        if (pPulseInfo->pulse_data_present == 1)
+        {
+            pulse_nc(quantSpec,
+                     pPulseInfo,
+                     pLongFrameInfo,
+                     &max);    /* add pulse data */
+        }
+
+        pQuantSpec = quantSpec;
+
+    }
+    else
+    {
+        deinterleave(quantSpec,
+                     tmp_spec,
+                     pFrameInfo);
+
+        pQuantSpec = tmp_spec;
+    }
+
+
+    /* inverse quantization, Q_format: Int32 */
+    /* rescaling */
+
+    /* what we can do here is assuming that we already know maxInput for each band, we have to go
+    though each one of them for re-quant and scaling, and pick the right qFormat to apply to
+    all spectral coeffs.*/
+
+    if ((max < 0) || (max > 8192))    /* (8192>>ORDER) == 1024 is the inverseQuantTable size */
+    {
+        return (-1);   /*  error condition */
+    }
+    else
+    {
+        /* Get  (max/SPACING) ^ (1/3), in Q Format  */
+        temp = inverseQuantTable[(max >> ORDER) + 1];
+    }
+
+
+    /* Round up before shifting down to Q0 */
+    temp += ROUND_UP;
+
+    /* shift down to Q0 and multiply by 2 (FACTOR) in one step */
+    temp >>= (QTABLE - 1);
+
+    /* Now get max ^ (4/3) in Q0 */
+    temp *= max;
+
+
+    binaryDigits = 31 - pv_normalize(temp);
+
+
+    /* Prevent negative shifts caused by low maximums. */
+    if (binaryDigits < (SIGNED32BITS - QTABLE))
+    {
+        binaryDigits = SIGNED32BITS - QTABLE;
+    }
+
+    QFormat = SIGNED32BITS - binaryDigits;
+
+    /********************/
+    tot_sfb = 0;
+    nsfb = pFrameInfo->sfb_per_win[0];
+    pCoef = coef;
+
+    for (i = pFrameInfo->num_win; i > 0; i--)
+    {
+        stop_idx  = 0;
+
+        for (sfb = 0; sfb < nsfb; sfb++)
+        {
+            sfbWidth   =  pFrameInfo->win_sfb_top[0][sfb] - stop_idx;
+
+            if ((sfbWidth < 0) || (sfbWidth > 1024))
+            {
+                return (-1);   /*  error condition */
+            }
+
+            stop_idx  += sfbWidth;
+
+            fac   = factors[tot_sfb] - SF_OFFSET;
+            scale = exptable[fac & 0x3];
+
+            power_scale_div_4 = fac >> 2;
+
+            power_scale_div_4++;
+
+            qFormat[tot_sfb] = QFormat;
+
+            esc_iquant_scaling(pQuantSpec,
+                               pCoef,
+                               sfbWidth,
+                               QFormat,
+                               scale,
+                               max);
+
+            pQuantSpec += sfbWidth;
+            qFormat[tot_sfb] -= power_scale_div_4;
+            pCoef += sfbWidth;
+
+            tot_sfb++;
+
+        } /* for (sfb) */
+    } /* for (i) */
+
+
+    /*----------------------------------------------------------------------------
+    ; Return status
+    ----------------------------------------------------------------------------*/
+    return SUCCESS;
+
+} /* huffspec_fxp */
diff --git a/media/libstagefright/codecs/aacdec/ibstream.h b/media/libstagefright/codecs/aacdec/ibstream.h
new file mode 100644
index 0000000..8b644dc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ibstream.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ibstream.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change names of constants.
+
+ Description: Change the buffer from UInt to UInt32
+
+ Description: Remove declaration of getbits and include header file
+
+ Description: Change input buffer to UChar
+              Add constant
+
+ Who:                                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Contains defines, structures, and function definitions for the
+ input bit stream used in the AAC Decoder.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef IBSTREAM_H
+#define IBSTREAM_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bits.h"
+#include    "getbits.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+#define INBUF_ARRAY_INDEX_SHIFT  (3)
+#define INBUF_BIT_WIDTH         (1<<(INBUF_ARRAY_INDEX_SHIFT))
+#define INBUF_BIT_MODULO_MASK   ((INBUF_BIT_WIDTH)-1)
+
+#define MAX_GETBITS             (25)
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+    void byte_align(
+        BITS  *pInputStream);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif /* IBSTREAM_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/idct16.cpp b/media/libstagefright/codecs/aacdec/idct16.cpp
new file mode 100644
index 0000000..324fe9e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct16.cpp
@@ -0,0 +1,204 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: idct16.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 16
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement inverse discrete cosine transform of lenght 16
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "idct16.h"
+#include "idct8.h"
+
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+#define R_SHIFT     28
+#define Qfmt(x)     (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+#define Qfmt31(x)   (Int32)(x*(0x7FFFFFFF) + (x>=0?0.5F:-0.5F))
+
+const Int32 CosTable_8i[8] =
+{
+    Qfmt31(0.50241928618816F),   Qfmt31(0.52249861493969F),
+    Qfmt31(0.56694403481636F),   Qfmt31(0.64682178335999F),
+    Qfmt(0.78815462345125F),   Qfmt(1.06067768599035F),
+    Qfmt(1.72244709823833F),   Qfmt(5.10114861868916F)
+};
+
+
+
+/*----------------------------------------------------------------------------
+; 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 idct_16(Int32 vec[], Int32 scratch_mem[])    /* scratch_mem size 8 */
+{
+    Int32 *temp_even = scratch_mem;
+
+    Int32 i;
+    const Int32 *pt_cos = CosTable_8i;
+    Int32 tmp1, tmp2;
+    Int32 *pt_even = temp_even;
+    Int32 *pt_odd  = vec;
+    Int32 *pt_vec  = vec;
+
+    Int32 tmp3;
+    Int32 *pt_vecN_1;
+
+
+    *(pt_even++) = *(pt_vec++);
+    tmp1         = *(pt_vec++);
+    *(pt_odd++) = tmp1;
+
+    for (i = 2; i != 0; i--)
+    {
+        *(pt_even++) = *(pt_vec++);
+        tmp2         = *(pt_vec++);
+        *(pt_even++) = *(pt_vec++);
+        tmp3         = *(pt_vec++);
+        *(pt_odd++) = tmp2 + tmp1;
+        *(pt_odd++) = tmp3 + tmp2;
+        tmp1         = tmp3;
+    }
+
+    *(pt_even++) = *(pt_vec++);
+    tmp2         = *(pt_vec++);
+    *(pt_even++) = *(pt_vec++);
+    tmp3         = *(pt_vec++);
+    *(pt_odd++) = tmp2 + tmp1;
+    *(pt_odd++) = tmp3 + tmp2;
+
+
+    *(pt_even)   = *(pt_vec++);
+    *(pt_odd++) = *(pt_vec) + tmp3;
+
+
+    idct_8(temp_even);
+    idct_8(vec);
+
+
+    pt_cos = &CosTable_8i[7];
+
+    pt_vec  = &vec[7];
+
+    pt_even = &temp_even[7];
+    pt_vecN_1  = &vec[8];
+
+    tmp1 = *(pt_even--);
+
+    for (i = 2; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q28(*(pt_vec), *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp1 - tmp3;
+        *(pt_vec--)     = tmp1 + tmp3;
+        tmp3  = fxp_mul32_Q28(*(pt_vec), *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp2 - tmp3;
+        *(pt_vec--)     = tmp2 + tmp3;
+    }
+
+    tmp3  = fxp_mul32_Q31(*(pt_vec), *(pt_cos--)) << 1;
+    tmp2 = *(pt_even--);
+    *(pt_vecN_1++)  = tmp1 - tmp3;
+    *(pt_vec--)     = tmp1 + tmp3;
+    tmp3  = fxp_mul32_Q31(*(pt_vec), *(pt_cos--)) << 1;
+    tmp1 = *(pt_even--);
+    *(pt_vecN_1++)  = tmp2 - tmp3;
+    *(pt_vec--)     = tmp2 + tmp3;
+    tmp3  = fxp_mul32_Q31(*(pt_vec), *(pt_cos--)) << 1;
+    tmp2 = *(pt_even--);
+    *(pt_vecN_1++)  = tmp1 - tmp3;
+    *(pt_vec--)     = tmp1 + tmp3;
+    tmp3  = fxp_mul32_Q31(*(pt_vec), *(pt_cos)) << 1;
+    *(pt_vecN_1)  = tmp2 - tmp3;
+    *(pt_vec)     = tmp2 + tmp3;
+
+}
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/idct16.h b/media/libstagefright/codecs/aacdec/idct16.h
new file mode 100644
index 0000000..afade078
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct16.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Pathname: idct16.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef IDCT16_H
+#define IDCT16_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    void idct_16(Int32 vec[], Int32 scratch_mem[]);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* IDCT16_H */
diff --git a/media/libstagefright/codecs/aacdec/idct32.cpp b/media/libstagefright/codecs/aacdec/idct32.cpp
new file mode 100644
index 0000000..ac9773b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct32.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Filename: idct32.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 32
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement inverse discrete cosine transform of lenght 32
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include "idct32.h"
+#include "dst32.h"
+#include "idct16.h"
+
+#include "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+
+#define R_SHIFT1     29
+#define Qfmt1(x)   (Int32)(x*((Int32)1<<R_SHIFT1) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt3(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+
+/*----------------------------------------------------------------------------
+; 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 idct_32(Int32 vec[], Int32 scratch_mem[])   /* scratch_mem size 32 */
+{
+    Int32 *temp_even = scratch_mem;
+
+    Int32 i;
+    const Int32 *pt_cos = CosTable_16;
+    Int32 tmp1, tmp2;
+    Int32 *pt_even = temp_even;
+    Int32 *pt_odd  = vec;
+    Int32 *pt_vec  = vec;
+    Int32 *pt_vecN_1;
+    Int32 tmp3;
+
+
+    *(pt_even++) = *(pt_vec++);
+    tmp1         = *(pt_vec++);
+    tmp2 = 0;
+
+    for (i = 7; i != 0; i--)
+    {
+        *(pt_odd++) = tmp2 + tmp1;
+        *(pt_even++) = *(pt_vec++);
+        tmp2         = *(pt_vec++);
+        *(pt_even++) = *(pt_vec++);
+        *(pt_odd++) = tmp2 + tmp1;
+        tmp1         = *(pt_vec++);
+    }
+
+    *(pt_odd++) = tmp2 + tmp1;
+    *(pt_even++) = *(pt_vec++);
+    tmp2         = *(pt_vec++);
+    *(pt_odd++) = tmp2 + tmp1;
+
+
+    idct_16(temp_even, &scratch_mem[16]);
+    idct_16(vec, &scratch_mem[24]);
+
+
+    pt_cos = &CosTable_16[13];
+
+    pt_vec  = &vec[15];
+
+    pt_even = &temp_even[15];
+    pt_vecN_1  = &vec[16];
+
+    tmp1 = *(pt_even--);
+
+
+    tmp3  = fxp_mul32_Q31(*(pt_vec) << 3, Qfmt3(0.63687550772175F)) << 2;
+    tmp2 = *(pt_even--);
+    *(pt_vecN_1++)  = tmp1 - tmp3;
+    *(pt_vec--)     = tmp1 + tmp3;
+    tmp3  = fxp_mul32_Q31(*(pt_vec) << 3, Qfmt3(0.85190210461718F));
+
+    tmp1 = *(pt_even--);
+    *(pt_vecN_1++)  = tmp2 - tmp3;
+    *(pt_vec--)     = tmp2 + tmp3;
+
+    for (i = 2; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q29(*(pt_vec), *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp1 - tmp3;
+        *(pt_vec--)     = tmp1 + tmp3;
+        tmp3  = fxp_mul32_Q29(*(pt_vec), *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp2 - tmp3;
+        *(pt_vec--)     = tmp2 + tmp3;
+    }
+
+    for (i = 5; i != 0; i--)
+    {
+        tmp3  = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_cos--));
+        tmp2 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp1 - tmp3;
+        *(pt_vec--)     = tmp1 + tmp3;
+        tmp3  = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_cos--));
+        tmp1 = *(pt_even--);
+        *(pt_vecN_1++)  = tmp2 - tmp3;
+        *(pt_vec--)     = tmp2 + tmp3;
+    }
+}
+
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/idct32.h b/media/libstagefright/codecs/aacdec/idct32.h
new file mode 100644
index 0000000..12c685a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct32.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: idct32.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef IDCT32_H
+#define IDCT32_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void idct_32(Int32 vec[], Int32 scratch_mem[]);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* IDCT32_H */
diff --git a/media/libstagefright/codecs/aacdec/idct8.cpp b/media/libstagefright/codecs/aacdec/idct8.cpp
new file mode 100644
index 0000000..8f040ce
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct8.cpp
@@ -0,0 +1,168 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: idct8.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 8
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement inverse discrete cosine transform of lenght 8
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#ifdef AAC_PLUS
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "idct8.h"
+
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+
+#define R_SHIFT     29
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+
+/*----------------------------------------------------------------------------
+; 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 idct_8(Int32 vec[])
+{
+
+    Int32 tmp0;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 tmp3;
+    Int32 tmp4;
+    Int32 tmp5;
+    Int32 tmp6;
+    Int32 tmp7;
+    Int32 tmp8;
+
+
+    tmp5 = fxp_mul32_by_16(vec[4] << 1, Qfmt15(0.70710678118655F));
+
+    tmp1 =  vec[0] + tmp5;
+    tmp5 =  vec[0] - tmp5;
+
+    tmp3 = fxp_mul32_by_16(vec[2] << 1, Qfmt15(0.54119610014620F));     /* (1/(2*cos(2*phi)));*/
+    tmp7 = fxp_mul32_Q29(vec[6], Qfmt(1.30656296487638F));      /* (1/(2*cos(6*phi)));*/
+
+    tmp0  = fxp_mul32_by_16((tmp3 - tmp7) << 1, Qfmt15(0.70710678118655F)); /* (1/(2*cos(2*phi)));  */
+    tmp7 = (tmp3 + tmp7) + tmp0;
+
+    vec[0] = tmp1 + tmp7;
+    tmp2 = fxp_mul32_by_16(vec[1] << 1, Qfmt15(0.50979557910416F));     /* (1/(2*cos(  phi)));*/
+    vec[1] = tmp5 + tmp0;
+    vec[2] = tmp5 - tmp0;
+    tmp4 = fxp_mul32_by_16(vec[3] << 1, Qfmt15(0.60134488693505F));     /* (1/(2*cos(3*phi)));*/
+    vec[3] = tmp1 - tmp7;
+
+    tmp6 = fxp_mul32_by_16(vec[5] << 1, Qfmt15(0.89997622313642F));     /* (1/(2*cos(5*phi)));*/
+    tmp8 = fxp_mul32_Q29(vec[7], Qfmt(2.56291544774151F));      /* (1/(2*cos(7*phi)));*/
+
+    tmp7  =  tmp2 + tmp8;
+    tmp5  = fxp_mul32_by_16((tmp2 - tmp8) << 1, Qfmt15(0.54119610014620F));
+    tmp8  =  tmp4 + tmp6;
+    tmp6  = fxp_mul32_Q29((tmp4 - tmp6), Qfmt(1.30656296487638F));
+
+    tmp0 =  tmp7 + tmp8;
+    tmp2 = fxp_mul32_by_16((tmp7 - tmp8) << 1, Qfmt15(0.70710678118655F));
+
+    tmp3 = fxp_mul32_by_16((tmp5 - tmp6) << 1, Qfmt15(0.70710678118655F));
+    tmp1 = (tmp5 + tmp6) + tmp3;
+
+    tmp5 = tmp0 + tmp1;
+    tmp6 = tmp1 + tmp2;
+    tmp7 = tmp2 + tmp3;
+
+    vec[7]  = vec[0] - tmp5;
+    vec[0] +=          tmp5;
+    vec[6]  = vec[1] - tmp6;
+    vec[1] +=          tmp6;
+    vec[5]  = vec[2] - tmp7;
+    vec[2] +=          tmp7;
+    vec[4]  = vec[3] - tmp3;
+    vec[3] +=          tmp3;
+
+}
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/idct8.h b/media/libstagefright/codecs/aacdec/idct8.h
new file mode 100644
index 0000000..ad7eaae
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/idct8.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: idct8.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef IDCT8_H
+#define IDCT8_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    void idct_8(Int32 vec[]);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* IDCT8_H */
diff --git a/media/libstagefright/codecs/aacdec/imdct_fxp.cpp b/media/libstagefright/codecs/aacdec/imdct_fxp.cpp
new file mode 100644
index 0000000..ad67f20
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/imdct_fxp.cpp
@@ -0,0 +1,476 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: imdct_fxp.c
+ Funtions: imdct_fxp
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    data_quant    = Input vector, with quantized spectral lines:
+                    type Int32
+
+    freq_2_time_buffer =  Scratch memory used for in-place FFT calculation,
+                    min size required 1024,
+                    type Int32
+
+    n            =  Length of input vector "data_quant". Currently 256 or 2048
+                    type const Int
+
+    Q_format     =  Q_format of the input vector "data_quant"
+                    type Int
+
+    max          =  Maximum value inside input vector "data_quant"
+                    type Int32
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    shift = shift factor to reflect scaling introduced by IFFT and imdct_fxp,
+
+ Pointers and Buffers Modified:
+    Results are return in "Data_Int_precision"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    The IMDCT is a linear orthogonal lapped transform, based on the idea of
+    time domain aliasing cancellation (TDAC).
+    IMDCT is critically sampled, which means that though it is 50% overlapped,
+    a sequence data after IMDCT has the same number of coefficients as samples
+    before the transform (after overlap-and-add). This means, that a single
+    block of IMDCT data does not correspond to the original block on which the
+    IMDCT was performed. When subsequent blocks of inverse transformed data
+    are added (still using 50% overlap), the errors introduced by the
+    transform cancels out.Thanks to the overlapping feature, the IMDCT is very
+    useful for quantization. It effectively removes the otherwise easily
+    detectable blocking artifact between transform blocks.
+
+    N = twice the length of input vector X
+    y = vector of length N, will hold fixed point IDCT
+    p = 0:1:N-1
+
+                    2   N/2-1
+            y(p) = ---   SUM   X(m)*cos(pi/(2*N)*(2*p+1+N/2)*(2*m+1))
+                    N    m=0
+
+    The window that completes the TDAC is applied before calling this function.
+    The IMDCT can be calculated using an IFFT, for this, the IMDCT need be
+    rewritten as an odd-time odd-frequency discrete Fourier transform. Thus,
+    the IMDCT can be calculated using only one n/4 point FFT and some pre and
+    post-rotation of the sample points.
+
+
+    where X(k) is the input with N frequency lines
+
+    X(k) ----------------------------
+                                     |
+                                     |
+                    Pre-rotation by exp(j(2pi/N)(k+1/8))
+                                     |
+                                     |
+                              N/4- point IFFT
+                                     |
+                                     |
+                    Post-rotation by exp(j(2pi/N)(n+1/8))
+                                     |
+                                     |
+                                      ------------- x(n)  In the time domain
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should provide a fixed point IMDCT with an average
+    quantization error less than 1 % (variance and mean).
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] Analysis/Synthesis Filter Bank design based on time domain
+        aliasing cancellation
+        Jhon Princen, et. al.
+        IEEE Transactions on ASSP, vol ASSP-34, No. 5 October 1986
+        Pg 1153 - 1161
+
+    [2] Regular FFT-related transform kernels for DCT/DST based
+        polyphase filterbanks
+        Rolf Gluth
+        Proc. ICASSP 1991, pg. 2205 - 2208
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+  Cx, Cy are complex number
+
+
+    exp = log2(n)-1
+
+    FOR ( k=0; k< n/2; k +=2)
+
+        Cx = - data_quant[k] + j data_quant[n/2-1 - k]
+
+        freq_2_time_buffer = Cx * exp(j(2pi/n)(k+1/8))
+
+    ENDFOR
+
+    CALL IFFT( freq_2_time_buffer, n/4)
+
+    MODIFYING( freq_2_time_buffer )
+
+    RETURNING( shift )
+
+    FOR ( k=0; k< n/4; k +=2)
+
+        Cx = freq_2_time_buffer[ k] + j freq_2_time_buffer[ k+1]
+
+        Cy = Cx * exp(j(2pi/n)(k+1/8))
+
+        data_quant[3n/4-1 - k ] =   Real(Cy)
+        data_quant[ n/4-1 - k ] = - Imag(Cy)
+        data_quant[3n/4   + k ] =   Real(Cy)
+        data_quant[ n/4   + k ] =   Imag(Cy)
+
+    ENDFOR
+
+    FOR ( k=n/4; k< n/2; k +=2)
+
+        Cx = freq_2_time_buffer[ k] + j freq_2_time_buffer[ k+1]
+
+        Cy = Cx * exp(j(2pi/n)(k+1/8))
+
+        data_quant[3n/4-1 - k ] =   Real(Cy)
+        data_quant[ n/4   + k ] = - Real(Cy)
+        data_quant[5n/4   - k ] =   Imag(Cy)
+        data_quant[ n/4   + k ] =   Imag(Cy)
+
+    ENDFOR
+
+    MODIFIED    data_quant[]
+
+    RETURN      (exp - shift)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "imdct_fxp.h"
+
+
+#include "mix_radix_fft.h"
+#include "digit_reversal_tables.h"
+#include "fft_rx4.h"
+#include "inv_short_complex_rot.h"
+#include "inv_long_complex_rot.h"
+#include "pv_normalize.h"
+#include "fxp_mul32.h"
+#include "aac_mem_funcs.h"
+
+#include "window_block_fxp.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define ERROR_IN_FRAME_SIZE 10
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+Int imdct_fxp(Int32   data_quant[],
+              Int32   freq_2_time_buffer[],
+              const   Int     n,
+              Int     Q_format,
+              Int32   max)
+{
+
+    Int32     exp_jw;
+    Int     shift = 0;
+
+    const   Int32 *p_rotate;
+    const   Int32 *p_rotate_2;
+
+    Int32   *p_data_1;
+    Int32   *p_data_2;
+
+    Int32   temp_re32;
+    Int32   temp_im32;
+
+    Int     shift1 = 0;
+    Int32   temp1;
+    Int32   temp2;
+
+    Int     k;
+    Int     n_2   = n >> 1;
+    Int     n_4   = n >> 2;
+
+
+
+    if (max != 0)
+    {
+
+        switch (n)
+        {
+            case SHORT_WINDOW_TYPE:
+                p_rotate = exp_rotation_N_256;
+                shift = 21;           /* log2(n)-1 + 14 acomodates 2/N factor */
+                break;
+
+            case LONG_WINDOW_TYPE:
+                p_rotate = exp_rotation_N_2048;
+                shift = 24;           /* log2(n)-1 +14 acomodates 2/N factor */
+                break;
+
+            default:
+                /*
+                 * There is no defined behavior for a non supported frame
+                 * size. By returning a fixed scaling factor, the input will
+                 * scaled down and the will be heard as a low level noise
+                 */
+                return(ERROR_IN_FRAME_SIZE);
+
+        }
+
+        /*
+         *   p_data_1                                        p_data_2
+         *       |                                            |
+         *       RIRIRIRIRIRIRIRIRIRIRIRIRIRIRI....RIRIRIRIRIRI
+         *        |                                          |
+         *
+         */
+
+        p_data_1 =  data_quant;             /* uses first  half of buffer */
+        p_data_2 = &data_quant[n_2 - 1];    /* uses second half of buffer */
+
+        p_rotate_2 = &p_rotate[n_4-1];
+
+        shift1 = pv_normalize(max) - 1;     /* -1 to leave room for addition */
+        Q_format -= (16 - shift1);
+        max = 0;
+
+
+        if (shift1 >= 0)
+        {
+            temp_re32 =   *(p_data_1++) << shift1;
+            temp_im32 =   *(p_data_2--) << shift1;
+
+            for (k = n_4 >> 1; k != 0; k--)
+            {
+                /*
+                 *  Real and Imag parts have been swaped to use FFT as IFFT
+                 */
+                /*
+                 * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+                 */
+                exp_jw = *p_rotate++;
+
+                temp1      =  cmplx_mul32_by_16(temp_im32, -temp_re32, exp_jw);
+                temp2      = -cmplx_mul32_by_16(temp_re32,  temp_im32, exp_jw);
+
+                temp_im32 =   *(p_data_1--) << shift1;
+                temp_re32 =   *(p_data_2--) << shift1;
+                *(p_data_1++) = temp1;
+                *(p_data_1++) = temp2;
+                max         |= (temp1 >> 31) ^ temp1;
+                max         |= (temp2 >> 31) ^ temp2;
+
+
+                /*
+                 *  Real and Imag parts have been swaped to use FFT as IFFT
+                 */
+
+                /*
+                 * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+                 */
+
+                exp_jw = *p_rotate_2--;
+
+                temp1      =  cmplx_mul32_by_16(temp_im32, -temp_re32, exp_jw);
+                temp2      = -cmplx_mul32_by_16(temp_re32,  temp_im32, exp_jw);
+
+
+                temp_re32 =   *(p_data_1++) << shift1;
+                temp_im32 =   *(p_data_2--) << shift1;
+
+                *(p_data_2 + 2) = temp1;
+                *(p_data_2 + 3) = temp2;
+                max         |= (temp1 >> 31) ^ temp1;
+                max         |= (temp2 >> 31) ^ temp2;
+
+            }
+        }
+        else
+        {
+            temp_re32 =   *(p_data_1++) >> 1;
+            temp_im32 =   *(p_data_2--) >> 1;
+
+            for (k = n_4 >> 1; k != 0; k--)
+            {
+                /*
+                 *  Real and Imag parts have been swaped to use FFT as IFFT
+                 */
+                /*
+                 * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+                 */
+                exp_jw = *p_rotate++;
+
+                temp1      =  cmplx_mul32_by_16(temp_im32, -temp_re32, exp_jw);
+                temp2      = -cmplx_mul32_by_16(temp_re32,  temp_im32, exp_jw);
+
+                temp_im32 =   *(p_data_1--) >> 1;
+                temp_re32 =   *(p_data_2--) >> 1;
+                *(p_data_1++) = temp1;
+                *(p_data_1++) = temp2;
+
+                max         |= (temp1 >> 31) ^ temp1;
+                max         |= (temp2 >> 31) ^ temp2;
+
+
+                /*
+                 *  Real and Imag parts have been swaped to use FFT as IFFT
+                 */
+
+                /*
+                 * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+                 */
+                exp_jw = *p_rotate_2--;
+
+                temp1      =  cmplx_mul32_by_16(temp_im32, -temp_re32, exp_jw);
+                temp2      = -cmplx_mul32_by_16(temp_re32,  temp_im32, exp_jw);
+
+                temp_re32 =   *(p_data_1++) >> 1;
+                temp_im32 =   *(p_data_2--) >> 1;
+
+                *(p_data_2 + 3) = temp2;
+                *(p_data_2 + 2) = temp1;
+
+                max         |= (temp1 >> 31) ^ temp1;
+                max         |= (temp2 >> 31) ^ temp2;
+
+            }
+        }
+
+
+        if (n != SHORT_WINDOW_TYPE)
+        {
+
+            shift -= mix_radix_fft(data_quant,
+                                   &max);
+
+            shift -= inv_long_complex_rot(data_quant,
+                                          max);
+
+        }
+        else        /*  n_4 is 64 */
+        {
+
+            shift -= fft_rx4_short(data_quant,   &max);
+
+
+            shift -= inv_short_complex_rot(data_quant,
+                                           freq_2_time_buffer,
+                                           max);
+
+            pv_memcpy(data_quant,
+                      freq_2_time_buffer,
+                      SHORT_WINDOW*sizeof(*data_quant));
+        }
+
+    }
+    else
+    {
+        Q_format = ALL_ZEROS_BUFFER;
+    }
+
+    return(shift + Q_format);
+
+} /* imdct_fxp */
diff --git a/media/libstagefright/codecs/aacdec/imdct_fxp.h b/media/libstagefright/codecs/aacdec/imdct_fxp.h
new file mode 100644
index 0000000..5837750
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/imdct_fxp.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: imdct_fxp.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: This extern had the incorrect length of the arrays.  The true
+ lengths are 128 and 1024, not 64 and 512.
+
+ Description:  Modified interface so a vector with extended precision is
+               returned, this is a 32 bit vector whose MSB 16 bits will be
+               extracted later.  Added copyright notice.
+
+ Description:   Modified function interface to accomodate the normalization
+                that now is done in this function.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function imdct_fxp()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef IMDCT_FXP_H
+#define IMDCT_FXP_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+#define     LONG_WINDOW_TYPE  2048
+#define     SHORT_WINDOW_TYPE  256
+
+#define     ALL_ZEROS_BUFFER       31
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    extern const Int32 exp_rotation_N_256[64];
+    extern const Int32 exp_rotation_N_2048[512];
+    /*
+    extern const Int exp_rotation_N_256[128];
+    extern const Int exp_rotation_N_2048[1024];
+    */
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Int imdct_fxp(
+        Int32   data_quant[],
+        Int32   freq_2_time_buffer[],
+        const   Int     n,
+        Int     Q_format,
+        Int32   max
+    );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* IMDCT_FXP_H */
diff --git a/media/libstagefright/codecs/aacdec/infoinit.cpp b/media/libstagefright/codecs/aacdec/infoinit.cpp
new file mode 100644
index 0000000..7bdcdcd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/infoinit.cpp
@@ -0,0 +1,355 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: infoinit.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Pass eight_short_info and the array 'sfbwidth128'.
+               Change function arguments' names for clarity
+
+ Description:  move sfb definitions to "sfb.h", and "sfb.c", eliminated
+               the function "huffbookinit.c"
+
+ Description:  Remove initialization of the never used array,
+               pFrameInfo->group_offs
+
+ Description:
+ (1) Changed "stdinc.h" to <stdlib.h> - this avoids linking in the math
+ library and stdio.h.  (All for just defining the NULL pointer macro)
+
+ (2) Updated copyright header.
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Description: Addresses of constant vectors are now found by means of a
+              switch statement, this solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers
+
+ Who:                               Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pSi              = pointer to sampling rate info
+    ppWin_seq_info   = pointer array to window sequence Info struct
+    pSfbwidth128     = pointer to sfb bandwidth array of short window
+
+ Local Stores/Buffers/Pointers Needed:
+
+ Global Stores/Buffers/Pointers Needed:
+
+ Outputs:
+
+ Pointers and Buffers Modified:
+
+    ppWin_seq_info[ONLY_LONG_WINDOW]{all structure members} = setup values
+    ppWin_seq_info[EIGHT_SHORT_WINDOW]{all structure members} = setup values
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function sets the values of 'Info' structure for blocks containing long
+ and short window sequences, the following structures are being set:
+
+ win_seq_info[ONLY_LONG_WINDOW], win_seq_info[EIGHT_SHORT_WINDOW],
+ only_long_info and eight_short_info
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+ (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 4       p66     (sfb tables)
+                    p111    (4.6.10)
+                    p200    (Annex 4.B.5)
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pFrameInfo  =   pointer to only_long_info;
+    win_seq_info[ONLY_LONG_WINDOW]  =   pFrameInfo;
+    pFrameInfo{all structure members} = setup values;
+
+
+    pFrameInfo  =   pointer to eight_short_info;
+    win_seq_info[EIGHT_SHORT_WINDOW]  =   pFrameInfo;
+    pFrameInfo{all structure.members} =   setup values;
+
+
+    FOR (window_seq = 0; window_seq < NUM_WIN_SEQ; win_seq++)
+
+        win_seq_info[window_seq].members = setup values;
+
+    ENDFOR
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor the
+     the resources used should be documented below.
+
+ STACK USAGE:
+
+ DATA MEMORY USED: x words
+
+ PROGRAM MEMORY USED: x words
+
+ CLOCK CYCLES:
+
+------------------------------------------------------------------------------
+*/
+
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sr_info.h"
+#include    "s_frameinfo.h"
+#include    "e_blockswitching.h"
+#include    "e_huffmanconst.h"
+#include    "sfb.h"
+#include    "huffman.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
+----------------------------------------------------------------------------*/
+
+Int infoinit(
+    const Int samp_rate_idx,
+    FrameInfo   **ppWin_seq_info,
+    Int    *pSfbwidth128)
+
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+
+    Int     i;
+    Int     sfb_idx, sfb_sbk;
+    Int     bins_sbk;
+    Int     win_seq;
+    Int     start_idx, end_idx;
+    Int     nsfb_short;
+    Int16   *sfbands;
+    FrameInfo    *pFrameInfo;
+
+    const SR_Info *pSi = &(samp_rate_info[samp_rate_idx]);
+
+    const Int16 * pt_SFbands1024 = NULL;
+    const Int16 * pt_SFbands128  = NULL;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+
+    switch (pSi->samp_rate)
+    {
+        case 96000:
+        case 88200:
+            pt_SFbands1024  = sfb_96_1024;
+            pt_SFbands128   = sfb_64_128;  /* equal to table sfb_96_128, (eliminated) */
+            break;
+        case 64000:
+            pt_SFbands1024  = sfb_64_1024;
+            pt_SFbands128   = sfb_64_128;
+            break;
+        case 48000:
+        case 44100:
+            pt_SFbands1024  = sfb_48_1024;
+            pt_SFbands128   = sfb_48_128;
+            break;
+        case 32000:
+            pt_SFbands1024  = sfb_32_1024;
+            pt_SFbands128   = sfb_48_128;
+            break;
+        case 24000:
+        case 22050:
+            pt_SFbands1024  = sfb_24_1024;
+            pt_SFbands128   = sfb_24_128;
+            break;
+        case 16000:
+        case 12000:
+        case 11025:
+            pt_SFbands1024  = sfb_16_1024;
+            pt_SFbands128   = sfb_16_128;
+            break;
+        case 8000:
+            pt_SFbands1024  = sfb_8_1024;
+            pt_SFbands128   = sfb_8_128;
+            break;
+        default:
+            // sampling rate not supported
+            return -1;
+    }
+
+    /* long block info */
+
+    pFrameInfo = ppWin_seq_info[ONLY_LONG_WINDOW];
+    pFrameInfo->islong               = 1;
+    pFrameInfo->num_win              = 1;
+    pFrameInfo->coef_per_frame       = LN2; /* = 1024 */
+
+    pFrameInfo->sfb_per_win[0]  = pSi->nsfb1024;
+    pFrameInfo->sectbits[0]     = LONG_SECT_BITS;
+    pFrameInfo->win_sfb_top[0]  = (Int16 *)pt_SFbands1024;
+
+    pFrameInfo->sfb_width_128 = NULL; /* no short block sfb */
+    pFrameInfo->num_groups    = 1; /* long block, one group */
+    pFrameInfo->group_len[0]  = 1; /* only one window */
+
+    /* short block info */
+    pFrameInfo = ppWin_seq_info[EIGHT_SHORT_WINDOW];
+    pFrameInfo->islong                  = 0;
+    pFrameInfo->num_win                 = NSHORT;
+    pFrameInfo->coef_per_frame          = LN2;
+
+    for (i = 0; i < pFrameInfo->num_win; i++)
+    {
+        pFrameInfo->sfb_per_win[i] = pSi->nsfb128;
+        pFrameInfo->sectbits[i]    = SHORT_SECT_BITS;
+        pFrameInfo->win_sfb_top[i] = (Int16 *)pt_SFbands128;
+    }
+
+    /* construct sfb width table */
+    pFrameInfo->sfb_width_128 = pSfbwidth128;
+    for (i = 0, start_idx = 0, nsfb_short = pSi->nsfb128; i < nsfb_short; i++)
+    {
+        end_idx = pt_SFbands128[i];
+        pSfbwidth128[i] = end_idx - start_idx;
+        start_idx = end_idx;
+    }
+
+
+    /* common to long and short */
+    for (win_seq = 0; win_seq < NUM_WIN_SEQ; win_seq++)
+    {
+
+        if (ppWin_seq_info[win_seq] != NULL)
+        {
+            pFrameInfo                 = ppWin_seq_info[win_seq];
+            pFrameInfo->sfb_per_frame  = 0;
+            sfb_sbk                    = 0;
+            bins_sbk                   = 0;
+
+            for (i = 0; i < pFrameInfo->num_win; i++)
+            {
+
+                /* compute coef_per_win */
+                pFrameInfo->coef_per_win[i] =
+                    pFrameInfo->coef_per_frame / pFrameInfo->num_win;
+
+                /* compute sfb_per_frame */
+                pFrameInfo->sfb_per_frame += pFrameInfo->sfb_per_win[i];
+
+                /* construct default (non-interleaved) bk_sfb_top[] */
+                sfbands = pFrameInfo->win_sfb_top[i];
+                for (sfb_idx = 0; sfb_idx < pFrameInfo->sfb_per_win[i];
+                        sfb_idx++)
+                {
+                    pFrameInfo->frame_sfb_top[sfb_idx+sfb_sbk] =
+                        sfbands[sfb_idx] + bins_sbk;
+                }
+
+                bins_sbk += pFrameInfo->coef_per_win[i];
+                sfb_sbk  += pFrameInfo->sfb_per_win[i];
+            } /* for i = sbk ends */
+        }
+
+    } /* for win_seq ends */
+
+    return SUCCESS;
+
+} /* infoinit */
diff --git a/media/libstagefright/codecs/aacdec/init_sbr_dec.cpp b/media/libstagefright/codecs/aacdec/init_sbr_dec.cpp
new file mode 100644
index 0000000..fc47dd3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/init_sbr_dec.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: init_sbr_dec.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        initializes sbr decoder structure
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "init_sbr_dec.h"
+#include    "aac_mem_funcs.h"
+#include    "extractframeinfo.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
+----------------------------------------------------------------------------*/
+
+Int32 init_sbr_dec(Int32 codecSampleRate,
+                   Int   upsampleFac,
+                   SBR_DEC *sbrDec,
+                   SBR_FRAME_DATA *hFrameData)
+{
+    Int32 outFrameSize;
+    Int32 coreCodecFrameSize = 1024;
+#ifdef HQ_SBR
+    Int32 i;
+#endif
+
+
+    sbrDec->sbStopCodec    =  upsampleFac << 5;
+    sbrDec->prevLowSubband =  upsampleFac << 5;
+
+
+    /* set sbr sampling frequency */
+    sbrDec->outSampleRate = 2 * codecSampleRate;
+    outFrameSize = upsampleFac * coreCodecFrameSize;
+
+    hFrameData->nSfb[LO] = 0;    /* number of scale factor bands for high resp.low frequency resolution */
+    hFrameData->nSfb[HI] = 0;
+    hFrameData->offset   = 0;
+
+    hFrameData->nNfb = hFrameData->sbr_header.noNoiseBands;
+    hFrameData->prevEnvIsShort = -1;
+
+    /* Initializes pointers */
+#ifdef HQ_SBR
+    for (i = 0; i < 5; i++)
+    {
+        hFrameData->fBuf_man[i]  = hFrameData->fBuffer_man[i];
+        hFrameData->fBufN_man[i] = hFrameData->fBufferN_man[i];
+        hFrameData->fBuf_exp[i]  = hFrameData->fBuffer_exp[i];
+        hFrameData->fBufN_exp[i] = hFrameData->fBufferN_exp[i];
+    }
+#endif
+
+
+    pv_memset((void *)hFrameData->sbr_invf_mode_prev,
+              0,
+              MAX_NUM_NOISE_VALUES*sizeof(INVF_MODE));
+
+    /* Direct assignments */
+
+    sbrDec->noCols = 32;
+
+    sbrDec->bufWriteOffs = 6 + 2;
+    sbrDec->bufReadOffs  = 2;
+    sbrDec->qmfBufLen = sbrDec->noCols + sbrDec->bufWriteOffs;
+
+    sbrDec->lowBandAddSamples = 288;
+
+    sbrDec->startIndexCodecQmf = 0;
+
+    sbrDec->lowSubband =  32;
+
+
+    return outFrameSize;
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/init_sbr_dec.h b/media/libstagefright/codecs/aacdec/init_sbr_dec.h
new file mode 100644
index 0000000..844fa0e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/init_sbr_dec.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: init_sbr_dec.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef INIT_SBR_DEC_H
+#define INIT_SBR_DEC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "sbr_dec.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
+----------------------------------------------------------------------------*/
+
+Int32 init_sbr_dec(Int32 codecSampleRate,
+                   Int  upsampleFac,
+                   SBR_DEC *sbrDec,
+                   SBR_FRAME_DATA *hFrameData);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/intensity_right.cpp b/media/libstagefright/codecs/aacdec/intensity_right.cpp
new file mode 100644
index 0000000..106298a1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/intensity_right.cpp
@@ -0,0 +1,457 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: intensity_right.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified per review comments.
+
+ Description: Noticed that the code could be more efficient by
+ using some other method for storing the sign.  The code was changed to
+ use a signed Int to store the table, and an adjustment of the q-format to
+ reflect the difference between the data being shifted by 16 and the table
+ being stored in q-15 format.
+
+ Description: Updated pseudocode
+
+ Description: When the multiplication of two 16-bits variables is stored in
+              an 32-bits variable, the result should be typecasted explicitly
+              to Int32 before it is stored.
+              *(pCoefRight++) = (Int32) tempInt2 * multiplier;
+
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    scalefactor  =  Multiplier used to scale the data extracted from the left
+                    channel for use on the right.
+                    [const Int]
+
+    coef_per_win =  Number of coefficients per window.
+                    (128 for short, 1024 for long)
+                    [const Int]
+
+    sfb_per_win  =  Number of scalefactor bands per window.  This should be
+                    a number divisible by four.
+                    [const Int]
+
+    wins_in_group = The number of windows in the group being decoded.
+                    This number falls within the range 1-8.
+                    [const Int]
+
+    band_length  =  The length of the scalefactor band being decoded.
+                    This value is divisible by 4.
+                    [const Int]
+
+    codebook     =  Value that denotes which Huffman codebook was used for
+                    the encoding of this grouped scalefactor band.
+                    [const Int]
+
+    ms_used      =  Flag that denotes whether M/S is active for this band.
+                    [const Bool]
+
+    q_formatLeft = The Q-format for the left channel's fixed-point spectral
+                   coefficients, on a per-scalefactor band, non-grouped basis.
+                   [const Int *, length MAXBANDS]
+
+    q_formatRight = The Q-format for the right channel's fixed-point spectral
+                    coefficients, on a per-scalefactor band, non-grouped basis.
+                    [Int *, length MAXBANDS]
+
+    coefLeft =  Array containing the fixed-point spectral coefficients
+                for the left channel.
+                [const Int32 *, length 1024]
+
+    coefRight = Array containing the fixed-point spectral coefficients
+                for the right channel.
+                [Int32 *, length 1024]
+
+ Local Stores/Buffers/Pointers Needed:
+    intensity_factor =  Table which stores the values of
+                        0.5^(0), 0.5^(1/4), 0.5^(2/4) and 0.5^(3/4)
+                        [UInt, length 4]
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coefRight[]         Contains the new spectral information
+
+    q_formatRight[]     Q-format may be updated with changed fixed-point
+                        data in coefRight.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function applies Intensity Stereo, generating data on the right channel
+ that is derived from data on the Left.  A scalefactor is applied using the
+ following formula...
+
+ RightCh = LeftCh*0.5^(scalefactor/4)
+
+ This function works for one scalefactor band, which may belong to a group.
+ (i.e. the same scalefactor band repeated across multiple windows belonging
+  to one group.)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ codebook must be either INTENSITY_HCB or INTENSITY_HCB2 when this function
+ is called.
+
+ ms_used must be 1 when TRUE, 0 when FALSE.
+
+ wins_in_group falls within the range [1-8]
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.7.2.3 Decoding Process (Intensity Stereo)
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+    multiplier = codebook AND 0x1;
+
+    multiplier = multiplier XOR ms_used;
+
+    multiplier = multiplier << 1;
+
+    multiplier = multiplier - 1;
+
+    multiplier = multiplier * intensity_factor[scalefactor & 0x3];
+
+    scf_div_4 = (scalefactor >> 2);
+
+    nextWinPtrUpdate = (coef_per_win - band_length);
+
+    FOR (win_indx = wins_in_group; win_indx > 0; win_indx--)
+
+        *(pQformatRight) = scf_div_4 + *(pQformatLeft) - 1;
+
+        FOR (tempInt = band_length; tempInt > 0; tempInt--)
+           tempInt2 = (Int)(*(pCoefLeft) >> 16);
+
+           *(pCoefRight) = tempInt2 * multiplier;
+
+           pCoefRight = pCoefRight + 1;
+           pCoefLeft  = pCoefLeft  + 1;
+
+        ENDFOR
+
+        pCoefRight = pCoefRight + nextWinPtrUpdate;
+        pCoefLeft  = pCoefLeft + nextWinPtrUpdate;
+
+        pQformatRight = pQformatRight + sfb_per_win;
+        pQformatLeft  = pQformatLeft  + sfb_per_win;
+    ENDFOR
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor 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 "pv_audio_type_defs.h"
+#include "intensity_right.h"
+#include "e_huffmanconst.h"
+
+#include "fxp_mul32.h"
+#include "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+const Int16 intensity_factor[4] =
+{
+    32767,  /* (0.5^0.00)*2^15 - 1 (minus 1 for storage as type Int) */
+    27554,  /* (0.5^0.25)*2^15 */
+    23170,  /* (0.5^0.50)*2^15 */
+    19484
+}; /* (0.5^0.75)*2^15 */
+
+
+/*----------------------------------------------------------------------------
+; 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 intensity_right(
+    const Int   scalefactor,
+    const Int   coef_per_win,
+    const Int   sfb_per_win,
+    const Int   wins_in_group,
+    const Int   band_length,
+    const Int   codebook,
+    const Bool  ms_used,
+    const Int   q_formatLeft[],
+    Int   q_formatRight[],
+    const Int32 coefLeft[],
+    Int32 coefRight[])
+
+{
+    const Int32 *pCoefLeft  = coefLeft;
+    Int32 *pCoefRight = coefRight;
+
+    const Int *pQformatLeft  = q_formatLeft;
+    Int *pQformatRight = q_formatRight;
+
+    Int   multiplier;
+    Int   scf_div_4;
+    Int   nextWinPtrUpdate;
+
+    /*
+     * The sign of the intensity multiplier obeys the following table...
+     *
+     * codebook       | ms_used | multiplier
+     * --------------------------------------
+     * INTENSITY_HCB  | TRUE    |    -1
+     * INTENSITY_HCB  | FALSE   |    +1
+     * INTENSITY_HCB2 | TRUE    |    +1
+     * INTENSITY_HCB2 | FALSE   |    -1
+     *
+     * In binary, the above table is represented as...
+     *
+     * codebook       | ms_used | multiplier
+     * --------------------------------------
+     * 1111b          | 1       |    -1
+     * 1111b          | 0       |    +1
+     * 1110b          | 1       |    +1
+     * 1110b          | 0       |    -1
+     *
+     */
+
+    /*
+     * Deriving the correct value for "multiplier" is illustrated
+     * below for all 4 possible combinations of codebook and ms_used
+     */
+
+    /*
+     * 1111b AND 0x1 = 1b
+     * 1111b AND 0x1 = 1b
+     * 1110b AND 0x1 = 0b
+     * 1110b AND 0x1 = 0b
+     */
+    multiplier  = (codebook & 0x1);
+
+    /*
+     * 1b XOR 1 = 0b
+     * 1b XOR 0 = 1b
+     * 0b XOR 1 = 1b
+     * 0b XOR 0 = 0b
+     */
+    multiplier ^= ms_used;
+
+    /*
+     * 0b << 1 = 0
+     * 1b << 1 = 2
+     * 1b << 1 = 2
+     * 0b << 1 = 0
+     */
+    multiplier <<= 1;
+
+    /*
+     * 0 - 1 = -1
+     * 2 - 1 = +1
+     * 2 - 1 = +1
+     * 0 - 1 = -1
+     */
+    multiplier--;
+
+    multiplier *= intensity_factor[scalefactor & 0x3];
+
+    scf_div_4 = (scalefactor >> 2);
+
+    /*
+     * Step through all the windows in this group, replacing this
+     * band in each window's spectrum with
+     * left-channel correlated data
+     */
+
+    nextWinPtrUpdate = (coef_per_win - band_length);
+
+    for (Int win_indx = wins_in_group; win_indx > 0; win_indx--)
+    {
+
+        /*
+         * Calculate q_formatRight
+         *
+         * q_formatLeft must be included, since the values
+         * on the right-channel are derived from the values
+         * on the left-channel.
+         *
+         * scalefactor/4 is included, since the intensity
+         * formula is RightCh = LeftCh*0.5^(scalefactor/4)
+         *
+         * powers of 0.5 increase the q_format by 1.
+         * (Another way to multiply something by 0.5^(x)
+         *  is to increase its q-format by x.)
+         *
+         * Finally the q-format must be decreased by 1.
+         * The reason for this is because the table is stored
+         * in q-15 format, but we are shifting by 16 to do
+         * a 16 x 16 multiply.
+         */
+
+        *(pQformatRight) = scf_div_4 + *(pQformatLeft);
+
+        /*
+         * reconstruct right intensity values
+         *
+         * to make things faster, this for loop
+         * can be partially unrolled, since band_length is a multiple
+         * of four.
+         */
+
+
+        if (multiplier == 32767)
+        {
+            Int32 tempInt2 = *(pCoefLeft++);
+            Int32 tempInt22 = *(pCoefLeft++);
+
+            for (Int tempInt = band_length >> 1; tempInt > 0; tempInt--)
+            {
+                *(pCoefRight++) = tempInt2;
+                *(pCoefRight++) = tempInt22;
+                tempInt2 = *(pCoefLeft++);
+                tempInt22 = *(pCoefLeft++);
+            }
+
+        }
+        else
+        {
+
+            Int32 tempInt2 = *(pCoefLeft++);
+            Int32 tempInt22 = *(pCoefLeft++);
+            for (Int tempInt = band_length >> 1; tempInt > 0; tempInt--)
+            {
+                *(pCoefRight++) = fxp_mul32_by_16(tempInt2, multiplier) << 1;
+                *(pCoefRight++) = fxp_mul32_by_16(tempInt22, multiplier) << 1;
+                tempInt2 = *(pCoefLeft++);
+                tempInt22 = *(pCoefLeft++);
+            }
+        }
+
+        /*
+         * Set pCoefRight and pCoefLeft to the beginning of
+         * this sfb in the next window in the group.
+         */
+
+        pCoefRight += nextWinPtrUpdate;
+        pCoefLeft  += (nextWinPtrUpdate - 2);
+
+        /*
+         * Update pQformatRight and pQformatLeft to this sfb in
+         * in the next window in the group.
+         */
+
+        pQformatRight += sfb_per_win;
+        pQformatLeft  += sfb_per_win;
+
+    } /* for (win_indx) */
+
+
+} /* void intensity_right */
diff --git a/media/libstagefright/codecs/aacdec/intensity_right.h b/media/libstagefright/codecs/aacdec/intensity_right.h
new file mode 100644
index 0000000..823da07
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/intensity_right.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: intensity_right.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change ms_used from Int to Bool
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Contains the function definitions for intensity_right
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef INTENSITY_RIGHT_H
+#define INTENSITY_RIGHT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+void intensity_right(
+    const Int   scalefactor,
+    const Int   coef_per_win,
+    const Int   sfb_per_win,
+    const Int   wins_in_group,
+    const Int   band_length,
+    const Int   codebook,
+    const Bool  ms_used,
+    const Int   q_formatLeft[],
+    Int   q_formatRight[],
+    const Int32 coefLeft[],
+    Int32 coefRight[]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/inv_long_complex_rot.cpp b/media/libstagefright/codecs/aacdec/inv_long_complex_rot.cpp
new file mode 100644
index 0000000..84a7ec8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/inv_long_complex_rot.cpp
@@ -0,0 +1,408 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: .inv_long_complex_rot.c
+ Funtions:  inv_long_complex_rot
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Change the input argument, no shifts information from long fft_rx4
+               , do not have to check for shifts.
+
+ Date: 10/18/2002
+ Description:
+            (1) Change the input argument, only a single max is passed.
+            (2) Eliminate search for max, a fixed shift has replaced the
+                search for max with minimal loss of precision.
+            (3) Eliminated unused variables
+
+ Date: 10/28/2002
+ Description:
+            (1) Added comments per code review
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    Data_in   = Input vector (sized for long windows
+                TWICE_INV_LONG_CX_ROT_LENGTH), with time domain samples
+                type Int32 *
+
+    Data_out  = Output vector with a post-rotation by exp(j(2pi/N)(k+1/8)),
+                (sized for long windows TWICE_INV_LONG_CX_ROT_LENGTH)
+                type Int32 *
+
+    max       = Input, carries the maximum value of the input vector
+                "Data_in"
+                type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exp = shift factor to reflect signal scaling
+
+ Pointers and Buffers Modified:
+    Results are return in "Data_out"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    inv_long_complex_rot() performs the complex rotation for the inverse MDCT
+    for the case of long windows. It also performs digit reverse ordering of
+    the first and second halves of the input vector "Data_in", as well as
+    reordering of the two half vectors (following radix-2 decomposition)
+    Word normalization is also done to ensure 16 by 16 bit multiplications.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    inv_long_complex_rot() should execute a post-rotation by
+    exp(-j(2pi/N)(k+1/8)), digit reverse ordering and word normalization
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ 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 "digit_reversal_tables.h"
+#include "inv_long_complex_rot.h"
+#include "imdct_fxp.h"
+#include "inv_long_complex_rot.h"
+#include "pv_normalize.h"
+
+#include "fxp_mul32.h"
+#include "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+
+
+Int inv_long_complex_rot(
+    Int32 *Data,
+    Int32  max)
+{
+    Int     i;
+    Int16     I;
+    const   Int32 *p_rotate;
+    Int32   temp_re;
+    Int32   temp_im;
+
+    Int32    exp_jw;
+    Int32   *pData_in_1;
+    Int32   *pData_in_2;
+    Int     exp;
+    Int32   *pData_in_ref1;
+    Int32   *pData_in_ref2;
+
+
+    Int16   temp_re_0;
+    Int16   temp_im_0;
+    Int16   temp_re_1;
+    Int16   temp_im_1;
+    Int16   *p_Data_Int_precision;
+    Int     n     = 2048;
+    Int     n_2   = n >> 1;
+    Int     n_4   = n >> 2;
+    Int     n_3_4 = n_2 + n_4;
+
+    Int16   *px_1;
+    Int16   *px_2;
+    Int16   *px_3;
+    Int16   *px_4;
+
+    Int16     J;
+    const   Int32 *p_rotate2;
+
+
+
+
+    p_rotate    =  &exp_rotation_N_2048[255];
+    p_rotate2   =  &exp_rotation_N_2048[256];
+
+    pData_in_ref1  =  Data;
+    pData_in_ref2  = &Data[TWICE_INV_LONG_CX_ROT_LENGTH];
+
+
+    /*
+     *  Apply  A/2^(diff) + B
+     */
+
+    p_Data_Int_precision = (Int16 *)Data;
+
+    exp = 16 - pv_normalize(max);
+
+
+    /*
+     *        px2-->               <--px1 px4-->               <--px3
+     *
+     *                     |                           |             |
+     *       |+++++++++++++|+++++++++++++|+++++++++++++|+++++++++++++|
+     *                     |             |             |             |
+     *                    n/4           n/2          3n/4
+     */
+
+    I = 255;
+    J = 256;
+
+    pData_in_1 = pData_in_ref2 + I;
+
+    px_1 = (Int16 *)pData_in_1;
+    px_1++;
+
+    pData_in_2 = pData_in_ref2 + J;
+
+    px_4 = (Int16 *)pData_in_2;
+
+
+
+    exp -= 1;
+
+
+    for (i = INV_LONG_CX_ROT_LENGTH >> 1; i != 0; i--)
+    {
+
+        pData_in_2 = pData_in_ref1 + J;
+
+        temp_im =  *(pData_in_2++);
+        temp_re =  *(pData_in_2);
+
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+        exp_jw = *p_rotate2++;
+
+        /*
+         *   Post-rotation
+         */
+
+
+
+        temp_re_0  = (Int16)(cmplx_mul32_by_16(temp_re,  -temp_im,  exp_jw) >> exp);
+        temp_im_0  = (Int16)(cmplx_mul32_by_16(temp_im,   temp_re,  exp_jw) >> exp);
+
+
+        pData_in_1 = pData_in_ref2 + I;
+
+        /*
+         *  Use auxiliary variables to avoid double accesses to memory.
+         *  Data in is scaled to use only lower 16 bits.
+         */
+
+        temp_re =  *(pData_in_1--);
+        temp_im =  *(pData_in_1);
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+        exp_jw = *p_rotate--;
+
+
+        /*
+         *   Post-rotation
+         */
+
+        temp_re_1  = (Int16)(cmplx_mul32_by_16(temp_re,  -temp_im,  exp_jw) >> exp);
+        temp_im_1  = (Int16)(cmplx_mul32_by_16(temp_im,   temp_re,  exp_jw) >> exp);
+
+
+        /*
+         *   Repeat procedure for odd index at the output
+         */
+
+        pData_in_2 = pData_in_ref2 + J;
+        J += 2;
+
+        temp_im =  *(pData_in_2++);
+        temp_re =  *(pData_in_2);
+
+
+        *(px_1--) =  temp_re_0;
+        *(px_1--) =  temp_im_1;
+        *(px_4++) =  temp_im_0;
+        *(px_4++) =  temp_re_1;
+
+
+        exp_jw = *p_rotate2++;
+
+
+        *(px_1--)  = (Int16)(cmplx_mul32_by_16(temp_re,  -temp_im,  exp_jw) >> exp);
+        *(px_4++)  = (Int16)(cmplx_mul32_by_16(temp_im,   temp_re,  exp_jw) >> exp);
+
+
+
+        /*
+         *   Repeat procedure for odd index at the output
+         */
+
+        pData_in_1 = pData_in_ref1 + I;
+        I -= 2;
+
+        temp_re =  *(pData_in_1--);
+        temp_im =  *(pData_in_1);
+
+
+        exp_jw = *p_rotate--;
+
+
+        *(px_4++)  = (Int16)(cmplx_mul32_by_16(temp_re,  -temp_im,  exp_jw) >> exp);
+        *(px_1--)  = (Int16)(cmplx_mul32_by_16(temp_im,   temp_re,  exp_jw) >> exp);
+
+    }
+
+    /*
+     *                                           <--px1 px4-->
+     *
+     *                     |                           |             |
+     *       |-------------|-------------|/////////////|\\\\\\\\\\\\\|
+     *                     |             |             |             |
+     *                    n/4           n/2          3n/4
+     */
+
+
+    px_1 = p_Data_Int_precision + n_2 - 1;
+    px_2 = p_Data_Int_precision;
+
+    px_4 = p_Data_Int_precision + n_3_4 - 1;
+
+    for (i = 0; i<INV_LONG_CX_ROT_LENGTH >> 1; i++)
+    {
+
+        Int16 temp_re_0 = *(px_4--);
+        Int16 temp_im_1 = *(px_4--);
+        Int16 temp_re_2 = *(px_4--);
+        Int16 temp_im_3 = *(px_4--);
+        *(px_1--) = temp_re_0;
+        *(px_1--) = temp_im_1;
+        *(px_1--) = temp_re_2;
+        *(px_1--) = temp_im_3;
+
+        *(px_2++) = (-temp_re_0);
+        *(px_2++) = (-temp_im_1);
+        *(px_2++) = (-temp_re_2);
+        *(px_2++) = (-temp_im_3);
+
+    }
+
+
+    px_4 = p_Data_Int_precision + n_2;
+
+
+    pv_memcpy(px_4, pData_in_ref2 + 256, TWICE_INV_LONG_CX_ROT_LENGTH*sizeof(*px_4));
+
+
+
+    /*
+     *        px2-->               <--px1 px4-->               <--px3
+     *
+     *                     |                           |             |
+     *       |+++++++++++++|+++++++++++++|+++++++++++++|+++++++++++++|
+     *                     |             |             |             |
+     *                    n/4           n/2          3n/4
+     */
+    px_3 = p_Data_Int_precision + n - 1;
+
+
+    for (i = 0; i<INV_LONG_CX_ROT_LENGTH >> 1; i++)
+    {
+
+        Int16 temp_im_0 = *(px_4++);
+        Int16 temp_re_1 = *(px_4++);
+        Int16 temp_im_2 = *(px_4++);
+        Int16 temp_re_3 = *(px_4++);
+        *(px_3--) =  temp_im_0;
+        *(px_3--) =  temp_re_1;
+        *(px_3--) =  temp_im_2;
+        *(px_3--) =  temp_re_3;
+
+    }
+
+
+    return (exp + 1);
+}
+
diff --git a/media/libstagefright/codecs/aacdec/inv_long_complex_rot.h b/media/libstagefright/codecs/aacdec/inv_long_complex_rot.h
new file mode 100644
index 0000000..8b95867
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/inv_long_complex_rot.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: inv_long_complex_rot.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function inv_long_complex_rot()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef INV_LONG_COMPLEX_ROT_H
+#define INV_LONG_COMPLEX_ROT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define INV_LONG_CX_ROT_LENGTH          256
+#define TWICE_INV_LONG_CX_ROT_LENGTH (INV_LONG_CX_ROT_LENGTH<<1)
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+    Int inv_long_complex_rot(
+        Int32 *Data,
+        Int32  max);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* INV_LONG_COMPLEX_ROT_H */
diff --git a/media/libstagefright/codecs/aacdec/inv_short_complex_rot.cpp b/media/libstagefright/codecs/aacdec/inv_short_complex_rot.cpp
new file mode 100644
index 0000000..5b4f1c5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/inv_short_complex_rot.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: inv_short_complex_rot.c
+ Funtions:  inv_short_complex_rot
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Date: 10/18/2002
+ Description:
+            (1) Change the input argument, only a single max is passed.
+            (2) Eliminate search for max, a fixed shift has replaced the
+                search for max with minimal loss of precision.
+            (3) Eliminated unused variables
+
+ Date: 10/28/2002
+ Description:
+            (1) Added comments per code review
+            (2) Eliminated hardly used condition on if-else (exp==0)
+
+ Description:
+
+ ------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    Data_in   = Input vector (sized for short windows
+                2*INV_SHORT_CX_ROT_LENGTH elements), with time domain samples
+                type Int32 *
+
+    Data_out  = Output vector with a post-rotation by exp(j(2pi/N)(k+1/8)),
+                (sized for short windows 2*INV_SHORT_CX_ROT_LENGTH)
+                type Int32 *
+
+    max       = Input, carries the maximum value of the input vector
+                "Data_in"
+                type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exp = shift factor to reflect signal scaling
+
+ Pointers and Buffers Modified:
+    Results are return in "Data_out"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    inv_short_complex_rot() performs the complex rotation for the inverse MDCT
+    for the case of short windows. It performs digit reverse ordering as well
+    word normalization to ensure 16 by 16 bit multiplications.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    inv_short_complex_rot() should execute a post-rotation by
+    exp( j(2pi/N)(k+1/8)), digit reverse ordering and word normalization
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ 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 "digit_reversal_tables.h"
+#include "imdct_fxp.h"
+#include "inv_short_complex_rot.h"
+#include "pv_normalize.h"
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+
+Int inv_short_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max)
+
+{
+    Int     i;
+    Int16     I;
+    const   Int16 *pTable;
+    const   Int32 *p_rotate;
+
+    Int32   *pData_in_1;
+    Int     exp;
+    Int32   temp_re;
+    Int32   temp_im;
+
+    Int32   exp_jw;
+    Int16   *pData_re;
+    Int16   *pData_im;
+    Int32   *pData_in_ref;
+
+    Int16   temp_re_0;
+    Int16   temp_im_0;
+    Int16   temp_re_1;
+    Int16   temp_im_1;
+    Int16   *p_data_1;
+    Int16   *p_data_2;
+    Int16   *p_Data_Int_precision;
+    Int16   *p_Data_Int_precision_1;
+    Int16   *p_Data_Int_precision_2;
+
+    Int     n     = 256;
+    Int     n_2   = n >> 1;
+    Int     n_4   = n >> 2;
+    Int     n_8   = n >> 3;
+    Int     n_3_4 = n_2 + n_4;
+
+
+    p_data_1 = (Int16 *)Data_out;
+    p_data_1 += n;
+    pData_re  = p_data_1;
+    pData_im  = p_data_1 + n_4;
+
+
+    p_rotate  =  exp_rotation_N_256;
+    pTable    =  digit_reverse_64;
+
+    pData_in_ref  =  Data_in;
+
+    exp = 16 - pv_normalize(max);
+
+
+    if (exp < 0)
+    {
+        exp = 0;
+    }
+
+    exp -= 1;
+
+    for (i = INV_SHORT_CX_ROT_LENGTH; i != 0; i--)
+    {
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+
+        /*
+         *   Perform digit reversal by accessing index I from table
+         */
+
+        I = *pTable++;
+        pData_in_1 = pData_in_ref + I;
+        /*
+         *  Use auxiliary variables to avoid double accesses to memory.
+         *  Data in is scaled to use only lower 16 bits.
+         */
+
+        temp_im =  *(pData_in_1++);
+        temp_re =  *(pData_in_1);
+
+        exp_jw = *p_rotate++;
+
+        /*
+         *   Post-rotation
+         */
+
+        *(pData_re++)  = (Int16)(cmplx_mul32_by_16(temp_re, -temp_im, exp_jw) >> exp);
+        *(pData_im++)  = (Int16)(cmplx_mul32_by_16(temp_im,  temp_re, exp_jw) >> exp);
+    }
+
+
+    p_data_2 = pData_im -  1;
+
+
+    p_Data_Int_precision = (Int16 *)Data_out;
+    p_Data_Int_precision_1 = p_Data_Int_precision + n_3_4 - 1;
+    p_Data_Int_precision_2 = p_Data_Int_precision + n_3_4;
+
+    for (i = n_8 >> 1; i != 0; i--)
+    {
+        temp_re_0 = (*(p_data_1++));
+        temp_re_1 = (*(p_data_1++));
+        temp_im_0 = (*(p_data_2--));
+        temp_im_1 = (*(p_data_2--));
+
+        *(p_Data_Int_precision_1--) =  temp_re_0;
+        *(p_Data_Int_precision_1--) =  temp_im_0;
+        *(p_Data_Int_precision_1--) =  temp_re_1;
+        *(p_Data_Int_precision_1--) =  temp_im_1;
+
+        *(p_Data_Int_precision_2++) =  temp_re_0;
+        *(p_Data_Int_precision_2++) =  temp_im_0;
+        *(p_Data_Int_precision_2++) =  temp_re_1;
+        *(p_Data_Int_precision_2++) =  temp_im_1;
+
+    }
+
+
+    /*
+     *  loop is split to avoid conditional testing inside loop
+     */
+
+    p_Data_Int_precision_2 = p_Data_Int_precision;
+
+    for (i = n_8 >> 1; i != 0; i--)
+    {
+
+        temp_re_0 = (*(p_data_1++));
+        temp_re_1 = (*(p_data_1++));
+        temp_im_0 = (*(p_data_2--));
+        temp_im_1 = (*(p_data_2--));
+
+        *(p_Data_Int_precision_1--) =   temp_re_0;
+        *(p_Data_Int_precision_1--) =   temp_im_0;
+        *(p_Data_Int_precision_1--) =   temp_re_1;
+        *(p_Data_Int_precision_1--) =   temp_im_1;
+
+        *(p_Data_Int_precision_2++) = (Int16)(-temp_re_0);
+        *(p_Data_Int_precision_2++) = (Int16)(-temp_im_0);
+        *(p_Data_Int_precision_2++) = (Int16)(-temp_re_1);
+        *(p_Data_Int_precision_2++) = (Int16)(-temp_im_1);
+
+    }
+
+    return (exp + 1);
+}
diff --git a/media/libstagefright/codecs/aacdec/inv_short_complex_rot.h b/media/libstagefright/codecs/aacdec/inv_short_complex_rot.h
new file mode 100644
index 0000000..97ed730
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/inv_short_complex_rot.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: inv_short_complex_rot.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions inv_short_complex_rot()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef INV_SHORT_COMPLEX_ROT_H
+#define INV_SHORT_COMPLEX_ROT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define INV_SHORT_CX_ROT_LENGTH 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
+----------------------------------------------------------------------------*/
+
+Int inv_short_complex_rot(
+    Int32 *Data_in,
+    Int32 *Data_out,
+    Int32  max);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* INV_SHORT_COMPLEX_ROT_H */
diff --git a/media/libstagefright/codecs/aacdec/iquant_table.cpp b/media/libstagefright/codecs/aacdec/iquant_table.cpp
new file mode 100644
index 0000000..aee47d6
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/iquant_table.cpp
@@ -0,0 +1,1131 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: iquant_table.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ None, just contains tables.
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Holds a table used for esc_iquant, containing the values of x^1/3 in
+ Q format.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
+   of moving pictures and associated audio information - Part 7: Advanced
+   Audio Coding (AAC)", Section 10.3, "Decoding process", page 43.
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+ None.
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+ None.
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "iquant_table.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
+----------------------------------------------------------------------------*/
+
+/*
+   This table contains the value of x ^ (1/3) where x is in the range of
+   [0..1024], in Q27 format.
+   Note that the length of the table is 1025, and not 1024 - this is because
+   the function esc_iquant may need to do an interpolation for numbers near
+   8191, which in that case it needs to get 8192 ^(1/3).
+ */
+const UInt32 inverseQuantTable[] =
+{
+    0x00000000, /*    0 */
+    0x08000000, /*    1 */
+    0x0a14517d, /*    2 */
+    0x0b89ba25, /*    3 */
+    0x0cb2ff53, /*    4 */
+    0x0dae07de, /*    5 */
+    0x0e897685, /*    6 */
+    0x0f4daedd, /*    7 */
+    0x10000000, /*    8 */
+    0x10a402fd, /*    9 */
+    0x113c4841, /*   10 */
+    0x11cab613, /*   11 */
+    0x1250bfe2, /*   12 */
+    0x12cf8890, /*   13 */
+    0x1347f8ab, /*   14 */
+    0x13bacd65, /*   15 */
+    0x1428a2fa, /*   16 */
+    0x1491fc15, /*   17 */
+    0x14f74744, /*   18 */
+    0x1558e2f7, /*   19 */
+    0x15b72095, /*   20 */
+    0x161246d7, /*   21 */
+    0x166a9399, /*   22 */
+    0x16c03d55, /*   23 */
+    0x17137449, /*   24 */
+    0x17646369, /*   25 */
+    0x17b33124, /*   26 */
+    0x18000000, /*   27 */
+    0x184aef29, /*   28 */
+    0x18941ad8, /*   29 */
+    0x18db9cb7, /*   30 */
+    0x19218c2e, /*   31 */
+    0x1965fea5, /*   32 */
+    0x19a907c2, /*   33 */
+    0x19eab998, /*   34 */
+    0x1a2b24d0, /*   35 */
+    0x1a6a58d5, /*   36 */
+    0x1aa863ee, /*   37 */
+    0x1ae5535d, /*   38 */
+    0x1b213377, /*   39 */
+    0x1b5c0fbd, /*   40 */
+    0x1b95f2ec, /*   41 */
+    0x1bcee70f, /*   42 */
+    0x1c06f590, /*   43 */
+    0x1c3e2745, /*   44 */
+    0x1c74847a, /*   45 */
+    0x1caa1501, /*   46 */
+    0x1cdee035, /*   47 */
+    0x1d12ed0b, /*   48 */
+    0x1d464212, /*   49 */
+    0x1d78e582, /*   50 */
+    0x1daadd3a, /*   51 */
+    0x1ddc2ecf, /*   52 */
+    0x1e0cdf8c, /*   53 */
+    0x1e3cf476, /*   54 */
+    0x1e6c7257, /*   55 */
+    0x1e9b5dba, /*   56 */
+    0x1ec9baf6, /*   57 */
+    0x1ef78e2c, /*   58 */
+    0x1f24db4e, /*   59 */
+    0x1f51a620, /*   60 */
+    0x1f7df23c, /*   61 */
+    0x1fa9c314, /*   62 */
+    0x1fd51bf2, /*   63 */
+    0x20000000, /*   64 */
+    0x202a7244, /*   65 */
+    0x205475a6, /*   66 */
+    0x207e0cee, /*   67 */
+    0x20a73aca, /*   68 */
+    0x20d001cc, /*   69 */
+    0x20f8646d, /*   70 */
+    0x2120650e, /*   71 */
+    0x214805fa, /*   72 */
+    0x216f4963, /*   73 */
+    0x2196316c, /*   74 */
+    0x21bcc020, /*   75 */
+    0x21e2f77a, /*   76 */
+    0x2208d961, /*   77 */
+    0x222e67ad, /*   78 */
+    0x2253a425, /*   79 */
+    0x22789082, /*   80 */
+    0x229d2e6e, /*   81 */
+    0x22c17f82, /*   82 */
+    0x22e5854f, /*   83 */
+    0x23094155, /*   84 */
+    0x232cb509, /*   85 */
+    0x234fe1d5, /*   86 */
+    0x2372c918, /*   87 */
+    0x23956c26, /*   88 */
+    0x23b7cc47, /*   89 */
+    0x23d9eabb, /*   90 */
+    0x23fbc8b9, /*   91 */
+    0x241d676e, /*   92 */
+    0x243ec7ff, /*   93 */
+    0x245feb86, /*   94 */
+    0x2480d319, /*   95 */
+    0x24a17fc3, /*   96 */
+    0x24c1f28b, /*   97 */
+    0x24e22c6c, /*   98 */
+    0x25022e5f, /*   99 */
+    0x2521f954, /*  100 */
+    0x25418e33, /*  101 */
+    0x2560ede2, /*  102 */
+    0x2580193e, /*  103 */
+    0x259f111f, /*  104 */
+    0x25bdd657, /*  105 */
+    0x25dc69b4, /*  106 */
+    0x25facbfe, /*  107 */
+    0x2618fdf8, /*  108 */
+    0x26370060, /*  109 */
+    0x2654d3ef, /*  110 */
+    0x2672795c, /*  111 */
+    0x268ff156, /*  112 */
+    0x26ad3c8a, /*  113 */
+    0x26ca5ba2, /*  114 */
+    0x26e74f41, /*  115 */
+    0x27041808, /*  116 */
+    0x2720b695, /*  117 */
+    0x273d2b81, /*  118 */
+    0x27597762, /*  119 */
+    0x27759acb, /*  120 */
+    0x2791964b, /*  121 */
+    0x27ad6a6f, /*  122 */
+    0x27c917c0, /*  123 */
+    0x27e49ec5, /*  124 */
+    0x28000000, /*  125 */
+    0x281b3bf3, /*  126 */
+    0x2836531b, /*  127 */
+    0x285145f3, /*  128 */
+    0x286c14f5, /*  129 */
+    0x2886c096, /*  130 */
+    0x28a1494b, /*  131 */
+    0x28bbaf85, /*  132 */
+    0x28d5f3b3, /*  133 */
+    0x28f01641, /*  134 */
+    0x290a179b, /*  135 */
+    0x2923f82a, /*  136 */
+    0x293db854, /*  137 */
+    0x2957587e, /*  138 */
+    0x2970d90a, /*  139 */
+    0x298a3a59, /*  140 */
+    0x29a37cca, /*  141 */
+    0x29bca0bb, /*  142 */
+    0x29d5a687, /*  143 */
+    0x29ee8e87, /*  144 */
+    0x2a075914, /*  145 */
+    0x2a200684, /*  146 */
+    0x2a38972c, /*  147 */
+    0x2a510b5f, /*  148 */
+    0x2a696370, /*  149 */
+    0x2a819fae, /*  150 */
+    0x2a99c069, /*  151 */
+    0x2ab1c5ed, /*  152 */
+    0x2ac9b088, /*  153 */
+    0x2ae18085, /*  154 */
+    0x2af9362c, /*  155 */
+    0x2b10d1c6, /*  156 */
+    0x2b28539b, /*  157 */
+    0x2b3fbbef, /*  158 */
+    0x2b570b09, /*  159 */
+    0x2b6e412b, /*  160 */
+    0x2b855e97, /*  161 */
+    0x2b9c6390, /*  162 */
+    0x2bb35056, /*  163 */
+    0x2bca2527, /*  164 */
+    0x2be0e242, /*  165 */
+    0x2bf787e4, /*  166 */
+    0x2c0e1649, /*  167 */
+    0x2c248dad, /*  168 */
+    0x2c3aee4a, /*  169 */
+    0x2c513859, /*  170 */
+    0x2c676c13, /*  171 */
+    0x2c7d89af, /*  172 */
+    0x2c939164, /*  173 */
+    0x2ca98368, /*  174 */
+    0x2cbf5ff1, /*  175 */
+    0x2cd52731, /*  176 */
+    0x2cead95e, /*  177 */
+    0x2d0076a9, /*  178 */
+    0x2d15ff45, /*  179 */
+    0x2d2b7363, /*  180 */
+    0x2d40d332, /*  181 */
+    0x2d561ee4, /*  182 */
+    0x2d6b56a7, /*  183 */
+    0x2d807aaa, /*  184 */
+    0x2d958b19, /*  185 */
+    0x2daa8823, /*  186 */
+    0x2dbf71f4, /*  187 */
+    0x2dd448b7, /*  188 */
+    0x2de90c98, /*  189 */
+    0x2dfdbdc0, /*  190 */
+    0x2e125c5c, /*  191 */
+    0x2e26e892, /*  192 */
+    0x2e3b628d, /*  193 */
+    0x2e4fca75, /*  194 */
+    0x2e642070, /*  195 */
+    0x2e7864a8, /*  196 */
+    0x2e8c9741, /*  197 */
+    0x2ea0b862, /*  198 */
+    0x2eb4c831, /*  199 */
+    0x2ec8c6d3, /*  200 */
+    0x2edcb46c, /*  201 */
+    0x2ef09121, /*  202 */
+    0x2f045d14, /*  203 */
+    0x2f18186a, /*  204 */
+    0x2f2bc345, /*  205 */
+    0x2f3f5dc7, /*  206 */
+    0x2f52e812, /*  207 */
+    0x2f666247, /*  208 */
+    0x2f79cc88, /*  209 */
+    0x2f8d26f4, /*  210 */
+    0x2fa071ac, /*  211 */
+    0x2fb3acd0, /*  212 */
+    0x2fc6d87f, /*  213 */
+    0x2fd9f4d7, /*  214 */
+    0x2fed01f8, /*  215 */
+    0x30000000, /*  216 */
+    0x3012ef0c, /*  217 */
+    0x3025cf39, /*  218 */
+    0x3038a0a6, /*  219 */
+    0x304b636d, /*  220 */
+    0x305e17ad, /*  221 */
+    0x3070bd81, /*  222 */
+    0x30835504, /*  223 */
+    0x3095de51, /*  224 */
+    0x30a85985, /*  225 */
+    0x30bac6b9, /*  226 */
+    0x30cd2609, /*  227 */
+    0x30df778d, /*  228 */
+    0x30f1bb60, /*  229 */
+    0x3103f19c, /*  230 */
+    0x31161a59, /*  231 */
+    0x312835b0, /*  232 */
+    0x313a43ba, /*  233 */
+    0x314c4490, /*  234 */
+    0x315e3849, /*  235 */
+    0x31701efd, /*  236 */
+    0x3181f8c4, /*  237 */
+    0x3193c5b4, /*  238 */
+    0x31a585e6, /*  239 */
+    0x31b7396f, /*  240 */
+    0x31c8e066, /*  241 */
+    0x31da7ae1, /*  242 */
+    0x31ec08f6, /*  243 */
+    0x31fd8abc, /*  244 */
+    0x320f0047, /*  245 */
+    0x322069ac, /*  246 */
+    0x3231c702, /*  247 */
+    0x3243185c, /*  248 */
+    0x32545dcf, /*  249 */
+    0x32659770, /*  250 */
+    0x3276c552, /*  251 */
+    0x3287e78a, /*  252 */
+    0x3298fe2c, /*  253 */
+    0x32aa094a, /*  254 */
+    0x32bb08f9, /*  255 */
+    0x32cbfd4a, /*  256 */
+    0x32dce652, /*  257 */
+    0x32edc423, /*  258 */
+    0x32fe96d0, /*  259 */
+    0x330f5e6a, /*  260 */
+    0x33201b04, /*  261 */
+    0x3330ccb0, /*  262 */
+    0x33417380, /*  263 */
+    0x33520f85, /*  264 */
+    0x3362a0d0, /*  265 */
+    0x33732774, /*  266 */
+    0x3383a380, /*  267 */
+    0x33941506, /*  268 */
+    0x33a47c17, /*  269 */
+    0x33b4d8c4, /*  270 */
+    0x33c52b1b, /*  271 */
+    0x33d5732f, /*  272 */
+    0x33e5b10f, /*  273 */
+    0x33f5e4ca, /*  274 */
+    0x34060e71, /*  275 */
+    0x34162e14, /*  276 */
+    0x342643c1, /*  277 */
+    0x34364f88, /*  278 */
+    0x34465178, /*  279 */
+    0x345649a1, /*  280 */
+    0x34663810, /*  281 */
+    0x34761cd6, /*  282 */
+    0x3485f800, /*  283 */
+    0x3495c99d, /*  284 */
+    0x34a591bb, /*  285 */
+    0x34b55069, /*  286 */
+    0x34c505b4, /*  287 */
+    0x34d4b1ab, /*  288 */
+    0x34e4545b, /*  289 */
+    0x34f3edd2, /*  290 */
+    0x35037e1d, /*  291 */
+    0x3513054b, /*  292 */
+    0x35228367, /*  293 */
+    0x3531f881, /*  294 */
+    0x354164a3, /*  295 */
+    0x3550c7dc, /*  296 */
+    0x35602239, /*  297 */
+    0x356f73c5, /*  298 */
+    0x357ebc8e, /*  299 */
+    0x358dfca0, /*  300 */
+    0x359d3408, /*  301 */
+    0x35ac62d1, /*  302 */
+    0x35bb8908, /*  303 */
+    0x35caa6b9, /*  304 */
+    0x35d9bbf0, /*  305 */
+    0x35e8c8b9, /*  306 */
+    0x35f7cd20, /*  307 */
+    0x3606c92f, /*  308 */
+    0x3615bcf3, /*  309 */
+    0x3624a878, /*  310 */
+    0x36338bc8, /*  311 */
+    0x364266ee, /*  312 */
+    0x365139f6, /*  313 */
+    0x366004ec, /*  314 */
+    0x366ec7d9, /*  315 */
+    0x367d82c9, /*  316 */
+    0x368c35c6, /*  317 */
+    0x369ae0dc, /*  318 */
+    0x36a98414, /*  319 */
+    0x36b81f7a, /*  320 */
+    0x36c6b317, /*  321 */
+    0x36d53ef7, /*  322 */
+    0x36e3c323, /*  323 */
+    0x36f23fa5, /*  324 */
+    0x3700b488, /*  325 */
+    0x370f21d5, /*  326 */
+    0x371d8797, /*  327 */
+    0x372be5d7, /*  328 */
+    0x373a3ca0, /*  329 */
+    0x37488bf9, /*  330 */
+    0x3756d3ef, /*  331 */
+    0x37651489, /*  332 */
+    0x37734dd1, /*  333 */
+    0x37817fd1, /*  334 */
+    0x378faa92, /*  335 */
+    0x379dce1d, /*  336 */
+    0x37abea7c, /*  337 */
+    0x37b9ffb7, /*  338 */
+    0x37c80dd7, /*  339 */
+    0x37d614e6, /*  340 */
+    0x37e414ec, /*  341 */
+    0x37f20df1, /*  342 */
+    0x38000000, /*  343 */
+    0x380deb20, /*  344 */
+    0x381bcf5a, /*  345 */
+    0x3829acb6, /*  346 */
+    0x3837833d, /*  347 */
+    0x384552f8, /*  348 */
+    0x38531bee, /*  349 */
+    0x3860de28, /*  350 */
+    0x386e99af, /*  351 */
+    0x387c4e89, /*  352 */
+    0x3889fcc0, /*  353 */
+    0x3897a45b, /*  354 */
+    0x38a54563, /*  355 */
+    0x38b2dfdf, /*  356 */
+    0x38c073d7, /*  357 */
+    0x38ce0152, /*  358 */
+    0x38db885a, /*  359 */
+    0x38e908f4, /*  360 */
+    0x38f68329, /*  361 */
+    0x3903f701, /*  362 */
+    0x39116483, /*  363 */
+    0x391ecbb6, /*  364 */
+    0x392c2ca1, /*  365 */
+    0x3939874d, /*  366 */
+    0x3946dbc0, /*  367 */
+    0x39542a01, /*  368 */
+    0x39617218, /*  369 */
+    0x396eb40c, /*  370 */
+    0x397befe4, /*  371 */
+    0x398925a7, /*  372 */
+    0x3996555c, /*  373 */
+    0x39a37f09, /*  374 */
+    0x39b0a2b7, /*  375 */
+    0x39bdc06a, /*  376 */
+    0x39cad82b, /*  377 */
+    0x39d7ea01, /*  378 */
+    0x39e4f5f0, /*  379 */
+    0x39f1fc01, /*  380 */
+    0x39fefc3a, /*  381 */
+    0x3a0bf6a2, /*  382 */
+    0x3a18eb3e, /*  383 */
+    0x3a25da16, /*  384 */
+    0x3a32c32f, /*  385 */
+    0x3a3fa691, /*  386 */
+    0x3a4c8441, /*  387 */
+    0x3a595c46, /*  388 */
+    0x3a662ea6, /*  389 */
+    0x3a72fb67, /*  390 */
+    0x3a7fc28f, /*  391 */
+    0x3a8c8425, /*  392 */
+    0x3a99402e, /*  393 */
+    0x3aa5f6b1, /*  394 */
+    0x3ab2a7b3, /*  395 */
+    0x3abf533a, /*  396 */
+    0x3acbf94d, /*  397 */
+    0x3ad899f1, /*  398 */
+    0x3ae5352c, /*  399 */
+    0x3af1cb03, /*  400 */
+    0x3afe5b7d, /*  401 */
+    0x3b0ae6a0, /*  402 */
+    0x3b176c70, /*  403 */
+    0x3b23ecf3, /*  404 */
+    0x3b306830, /*  405 */
+    0x3b3cde2c, /*  406 */
+    0x3b494eeb, /*  407 */
+    0x3b55ba74, /*  408 */
+    0x3b6220cc, /*  409 */
+    0x3b6e81f9, /*  410 */
+    0x3b7ade00, /*  411 */
+    0x3b8734e5, /*  412 */
+    0x3b9386b0, /*  413 */
+    0x3b9fd364, /*  414 */
+    0x3bac1b07, /*  415 */
+    0x3bb85d9e, /*  416 */
+    0x3bc49b2f, /*  417 */
+    0x3bd0d3be, /*  418 */
+    0x3bdd0751, /*  419 */
+    0x3be935ed, /*  420 */
+    0x3bf55f97, /*  421 */
+    0x3c018453, /*  422 */
+    0x3c0da427, /*  423 */
+    0x3c19bf17, /*  424 */
+    0x3c25d52a, /*  425 */
+    0x3c31e662, /*  426 */
+    0x3c3df2c6, /*  427 */
+    0x3c49fa5b, /*  428 */
+    0x3c55fd24, /*  429 */
+    0x3c61fb27, /*  430 */
+    0x3c6df468, /*  431 */
+    0x3c79e8ed, /*  432 */
+    0x3c85d8b9, /*  433 */
+    0x3c91c3d2, /*  434 */
+    0x3c9daa3c, /*  435 */
+    0x3ca98bfc, /*  436 */
+    0x3cb56915, /*  437 */
+    0x3cc1418e, /*  438 */
+    0x3ccd156a, /*  439 */
+    0x3cd8e4ae, /*  440 */
+    0x3ce4af5e, /*  441 */
+    0x3cf0757f, /*  442 */
+    0x3cfc3714, /*  443 */
+    0x3d07f423, /*  444 */
+    0x3d13acb0, /*  445 */
+    0x3d1f60bf, /*  446 */
+    0x3d2b1055, /*  447 */
+    0x3d36bb75, /*  448 */
+    0x3d426224, /*  449 */
+    0x3d4e0466, /*  450 */
+    0x3d59a23f, /*  451 */
+    0x3d653bb4, /*  452 */
+    0x3d70d0c8, /*  453 */
+    0x3d7c6180, /*  454 */
+    0x3d87ede0, /*  455 */
+    0x3d9375ec, /*  456 */
+    0x3d9ef9a8, /*  457 */
+    0x3daa7918, /*  458 */
+    0x3db5f43f, /*  459 */
+    0x3dc16b23, /*  460 */
+    0x3dccddc7, /*  461 */
+    0x3dd84c2e, /*  462 */
+    0x3de3b65d, /*  463 */
+    0x3def1c58, /*  464 */
+    0x3dfa7e22, /*  465 */
+    0x3e05dbc0, /*  466 */
+    0x3e113535, /*  467 */
+    0x3e1c8a85, /*  468 */
+    0x3e27dbb3, /*  469 */
+    0x3e3328c4, /*  470 */
+    0x3e3e71bb, /*  471 */
+    0x3e49b69c, /*  472 */
+    0x3e54f76b, /*  473 */
+    0x3e60342b, /*  474 */
+    0x3e6b6ce0, /*  475 */
+    0x3e76a18d, /*  476 */
+    0x3e81d237, /*  477 */
+    0x3e8cfee0, /*  478 */
+    0x3e98278d, /*  479 */
+    0x3ea34c40, /*  480 */
+    0x3eae6cfe, /*  481 */
+    0x3eb989ca, /*  482 */
+    0x3ec4a2a8, /*  483 */
+    0x3ecfb79a, /*  484 */
+    0x3edac8a5, /*  485 */
+    0x3ee5d5cb, /*  486 */
+    0x3ef0df10, /*  487 */
+    0x3efbe478, /*  488 */
+    0x3f06e606, /*  489 */
+    0x3f11e3be, /*  490 */
+    0x3f1cdda2, /*  491 */
+    0x3f27d3b6, /*  492 */
+    0x3f32c5fd, /*  493 */
+    0x3f3db47b, /*  494 */
+    0x3f489f32, /*  495 */
+    0x3f538627, /*  496 */
+    0x3f5e695c, /*  497 */
+    0x3f6948d5, /*  498 */
+    0x3f742494, /*  499 */
+    0x3f7efc9d, /*  500 */
+    0x3f89d0f3, /*  501 */
+    0x3f94a19a, /*  502 */
+    0x3f9f6e94, /*  503 */
+    0x3faa37e4, /*  504 */
+    0x3fb4fd8e, /*  505 */
+    0x3fbfbf94, /*  506 */
+    0x3fca7dfb, /*  507 */
+    0x3fd538c4, /*  508 */
+    0x3fdfeff3, /*  509 */
+    0x3feaa38a, /*  510 */
+    0x3ff5538e, /*  511 */
+    0x40000000, /*  512 */
+    0x400aa8e4, /*  513 */
+    0x40154e3d, /*  514 */
+    0x401ff00d, /*  515 */
+    0x402a8e58, /*  516 */
+    0x40352921, /*  517 */
+    0x403fc06a, /*  518 */
+    0x404a5436, /*  519 */
+    0x4054e488, /*  520 */
+    0x405f7164, /*  521 */
+    0x4069facb, /*  522 */
+    0x407480c1, /*  523 */
+    0x407f0348, /*  524 */
+    0x40898264, /*  525 */
+    0x4093fe16, /*  526 */
+    0x409e7663, /*  527 */
+    0x40a8eb4c, /*  528 */
+    0x40b35cd4, /*  529 */
+    0x40bdcafe, /*  530 */
+    0x40c835cd, /*  531 */
+    0x40d29d43, /*  532 */
+    0x40dd0164, /*  533 */
+    0x40e76231, /*  534 */
+    0x40f1bfae, /*  535 */
+    0x40fc19dc, /*  536 */
+    0x410670c0, /*  537 */
+    0x4110c45a, /*  538 */
+    0x411b14af, /*  539 */
+    0x412561c0, /*  540 */
+    0x412fab90, /*  541 */
+    0x4139f222, /*  542 */
+    0x41443578, /*  543 */
+    0x414e7595, /*  544 */
+    0x4158b27a, /*  545 */
+    0x4162ec2c, /*  546 */
+    0x416d22ac, /*  547 */
+    0x417755fd, /*  548 */
+    0x41818621, /*  549 */
+    0x418bb31a, /*  550 */
+    0x4195dcec, /*  551 */
+    0x41a00399, /*  552 */
+    0x41aa2722, /*  553 */
+    0x41b4478b, /*  554 */
+    0x41be64d6, /*  555 */
+    0x41c87f05, /*  556 */
+    0x41d2961a, /*  557 */
+    0x41dcaa19, /*  558 */
+    0x41e6bb03, /*  559 */
+    0x41f0c8db, /*  560 */
+    0x41fad3a3, /*  561 */
+    0x4204db5d, /*  562 */
+    0x420ee00c, /*  563 */
+    0x4218e1b1, /*  564 */
+    0x4222e051, /*  565 */
+    0x422cdbeb, /*  566 */
+    0x4236d484, /*  567 */
+    0x4240ca1d, /*  568 */
+    0x424abcb8, /*  569 */
+    0x4254ac58, /*  570 */
+    0x425e98fe, /*  571 */
+    0x426882ae, /*  572 */
+    0x42726969, /*  573 */
+    0x427c4d31, /*  574 */
+    0x42862e09, /*  575 */
+    0x42900bf3, /*  576 */
+    0x4299e6f1, /*  577 */
+    0x42a3bf05, /*  578 */
+    0x42ad9432, /*  579 */
+    0x42b76678, /*  580 */
+    0x42c135dc, /*  581 */
+    0x42cb025e, /*  582 */
+    0x42d4cc01, /*  583 */
+    0x42de92c7, /*  584 */
+    0x42e856b2, /*  585 */
+    0x42f217c4, /*  586 */
+    0x42fbd5ff, /*  587 */
+    0x43059166, /*  588 */
+    0x430f49f9, /*  589 */
+    0x4318ffbc, /*  590 */
+    0x4322b2b1, /*  591 */
+    0x432c62d8, /*  592 */
+    0x43361036, /*  593 */
+    0x433fbaca, /*  594 */
+    0x43496298, /*  595 */
+    0x435307a2, /*  596 */
+    0x435ca9e8, /*  597 */
+    0x4366496e, /*  598 */
+    0x436fe636, /*  599 */
+    0x43798041, /*  600 */
+    0x43831790, /*  601 */
+    0x438cac28, /*  602 */
+    0x43963e08, /*  603 */
+    0x439fcd33, /*  604 */
+    0x43a959ab, /*  605 */
+    0x43b2e372, /*  606 */
+    0x43bc6a89, /*  607 */
+    0x43c5eef3, /*  608 */
+    0x43cf70b2, /*  609 */
+    0x43d8efc7, /*  610 */
+    0x43e26c34, /*  611 */
+    0x43ebe5fb, /*  612 */
+    0x43f55d1e, /*  613 */
+    0x43fed19f, /*  614 */
+    0x44084380, /*  615 */
+    0x4411b2c1, /*  616 */
+    0x441b1f66, /*  617 */
+    0x44248970, /*  618 */
+    0x442df0e1, /*  619 */
+    0x443755bb, /*  620 */
+    0x4440b7fe, /*  621 */
+    0x444a17ae, /*  622 */
+    0x445374cc, /*  623 */
+    0x445ccf5a, /*  624 */
+    0x44662758, /*  625 */
+    0x446f7ccb, /*  626 */
+    0x4478cfb2, /*  627 */
+    0x4482200f, /*  628 */
+    0x448b6de5, /*  629 */
+    0x4494b935, /*  630 */
+    0x449e0201, /*  631 */
+    0x44a7484b, /*  632 */
+    0x44b08c13, /*  633 */
+    0x44b9cd5d, /*  634 */
+    0x44c30c29, /*  635 */
+    0x44cc4879, /*  636 */
+    0x44d5824f, /*  637 */
+    0x44deb9ac, /*  638 */
+    0x44e7ee93, /*  639 */
+    0x44f12105, /*  640 */
+    0x44fa5103, /*  641 */
+    0x45037e8f, /*  642 */
+    0x450ca9ab, /*  643 */
+    0x4515d258, /*  644 */
+    0x451ef899, /*  645 */
+    0x45281c6e, /*  646 */
+    0x45313dd8, /*  647 */
+    0x453a5cdb, /*  648 */
+    0x45437977, /*  649 */
+    0x454c93ae, /*  650 */
+    0x4555ab82, /*  651 */
+    0x455ec0f3, /*  652 */
+    0x4567d404, /*  653 */
+    0x4570e4b7, /*  654 */
+    0x4579f30c, /*  655 */
+    0x4582ff05, /*  656 */
+    0x458c08a4, /*  657 */
+    0x45950fea, /*  658 */
+    0x459e14d9, /*  659 */
+    0x45a71773, /*  660 */
+    0x45b017b8, /*  661 */
+    0x45b915aa, /*  662 */
+    0x45c2114c, /*  663 */
+    0x45cb0a9e, /*  664 */
+    0x45d401a1, /*  665 */
+    0x45dcf658, /*  666 */
+    0x45e5e8c4, /*  667 */
+    0x45eed8e6, /*  668 */
+    0x45f7c6c0, /*  669 */
+    0x4600b253, /*  670 */
+    0x46099ba0, /*  671 */
+    0x461282a9, /*  672 */
+    0x461b6770, /*  673 */
+    0x462449f6, /*  674 */
+    0x462d2a3c, /*  675 */
+    0x46360844, /*  676 */
+    0x463ee40f, /*  677 */
+    0x4647bd9f, /*  678 */
+    0x465094f5, /*  679 */
+    0x46596a12, /*  680 */
+    0x46623cf8, /*  681 */
+    0x466b0da8, /*  682 */
+    0x4673dc24, /*  683 */
+    0x467ca86c, /*  684 */
+    0x46857283, /*  685 */
+    0x468e3a69, /*  686 */
+    0x46970021, /*  687 */
+    0x469fc3ab, /*  688 */
+    0x46a88509, /*  689 */
+    0x46b1443b, /*  690 */
+    0x46ba0144, /*  691 */
+    0x46c2bc25, /*  692 */
+    0x46cb74df, /*  693 */
+    0x46d42b74, /*  694 */
+    0x46dcdfe4, /*  695 */
+    0x46e59231, /*  696 */
+    0x46ee425c, /*  697 */
+    0x46f6f068, /*  698 */
+    0x46ff9c54, /*  699 */
+    0x47084622, /*  700 */
+    0x4710edd4, /*  701 */
+    0x4719936b, /*  702 */
+    0x472236e7, /*  703 */
+    0x472ad84b, /*  704 */
+    0x47337798, /*  705 */
+    0x473c14cf, /*  706 */
+    0x4744aff1, /*  707 */
+    0x474d48ff, /*  708 */
+    0x4755dffb, /*  709 */
+    0x475e74e6, /*  710 */
+    0x476707c1, /*  711 */
+    0x476f988e, /*  712 */
+    0x4778274d, /*  713 */
+    0x4780b400, /*  714 */
+    0x47893ea8, /*  715 */
+    0x4791c746, /*  716 */
+    0x479a4ddc, /*  717 */
+    0x47a2d26b, /*  718 */
+    0x47ab54f3, /*  719 */
+    0x47b3d577, /*  720 */
+    0x47bc53f7, /*  721 */
+    0x47c4d074, /*  722 */
+    0x47cd4af0, /*  723 */
+    0x47d5c36c, /*  724 */
+    0x47de39e9, /*  725 */
+    0x47e6ae69, /*  726 */
+    0x47ef20ec, /*  727 */
+    0x47f79173, /*  728 */
+    0x48000000, /*  729 */
+    0x48086c94, /*  730 */
+    0x4810d730, /*  731 */
+    0x48193fd5, /*  732 */
+    0x4821a685, /*  733 */
+    0x482a0b40, /*  734 */
+    0x48326e07, /*  735 */
+    0x483acedd, /*  736 */
+    0x48432dc1, /*  737 */
+    0x484b8ab5, /*  738 */
+    0x4853e5bb, /*  739 */
+    0x485c3ed2, /*  740 */
+    0x486495fd, /*  741 */
+    0x486ceb3c, /*  742 */
+    0x48753e91, /*  743 */
+    0x487d8ffd, /*  744 */
+    0x4885df80, /*  745 */
+    0x488e2d1d, /*  746 */
+    0x489678d3, /*  747 */
+    0x489ec2a4, /*  748 */
+    0x48a70a91, /*  749 */
+    0x48af509b, /*  750 */
+    0x48b794c4, /*  751 */
+    0x48bfd70c, /*  752 */
+    0x48c81774, /*  753 */
+    0x48d055fe, /*  754 */
+    0x48d892aa, /*  755 */
+    0x48e0cd7a, /*  756 */
+    0x48e9066e, /*  757 */
+    0x48f13d88, /*  758 */
+    0x48f972c9, /*  759 */
+    0x4901a632, /*  760 */
+    0x4909d7c3, /*  761 */
+    0x4912077e, /*  762 */
+    0x491a3564, /*  763 */
+    0x49226175, /*  764 */
+    0x492a8bb4, /*  765 */
+    0x4932b420, /*  766 */
+    0x493adabc, /*  767 */
+    0x4942ff87, /*  768 */
+    0x494b2283, /*  769 */
+    0x495343b1, /*  770 */
+    0x495b6312, /*  771 */
+    0x496380a7, /*  772 */
+    0x496b9c71, /*  773 */
+    0x4973b670, /*  774 */
+    0x497bcea7, /*  775 */
+    0x4983e515, /*  776 */
+    0x498bf9bc, /*  777 */
+    0x49940c9e, /*  778 */
+    0x499c1db9, /*  779 */
+    0x49a42d11, /*  780 */
+    0x49ac3aa5, /*  781 */
+    0x49b44677, /*  782 */
+    0x49bc5088, /*  783 */
+    0x49c458d8, /*  784 */
+    0x49cc5f69, /*  785 */
+    0x49d4643c, /*  786 */
+    0x49dc6750, /*  787 */
+    0x49e468a9, /*  788 */
+    0x49ec6845, /*  789 */
+    0x49f46627, /*  790 */
+    0x49fc624f, /*  791 */
+    0x4a045cbe, /*  792 */
+    0x4a0c5575, /*  793 */
+    0x4a144c76, /*  794 */
+    0x4a1c41c0, /*  795 */
+    0x4a243555, /*  796 */
+    0x4a2c2735, /*  797 */
+    0x4a341763, /*  798 */
+    0x4a3c05de, /*  799 */
+    0x4a43f2a7, /*  800 */
+    0x4a4bddc0, /*  801 */
+    0x4a53c729, /*  802 */
+    0x4a5baee3, /*  803 */
+    0x4a6394ef, /*  804 */
+    0x4a6b794f, /*  805 */
+    0x4a735c02, /*  806 */
+    0x4a7b3d09, /*  807 */
+    0x4a831c67, /*  808 */
+    0x4a8afa1b, /*  809 */
+    0x4a92d626, /*  810 */
+    0x4a9ab089, /*  811 */
+    0x4aa28946, /*  812 */
+    0x4aaa605d, /*  813 */
+    0x4ab235ce, /*  814 */
+    0x4aba099b, /*  815 */
+    0x4ac1dbc5, /*  816 */
+    0x4ac9ac4c, /*  817 */
+    0x4ad17b31, /*  818 */
+    0x4ad94876, /*  819 */
+    0x4ae1141a, /*  820 */
+    0x4ae8de1f, /*  821 */
+    0x4af0a686, /*  822 */
+    0x4af86d50, /*  823 */
+    0x4b00327d, /*  824 */
+    0x4b07f60d, /*  825 */
+    0x4b0fb803, /*  826 */
+    0x4b17785f, /*  827 */
+    0x4b1f3722, /*  828 */
+    0x4b26f44b, /*  829 */
+    0x4b2eafde, /*  830 */
+    0x4b3669d9, /*  831 */
+    0x4b3e223e, /*  832 */
+    0x4b45d90e, /*  833 */
+    0x4b4d8e4a, /*  834 */
+    0x4b5541f2, /*  835 */
+    0x4b5cf407, /*  836 */
+    0x4b64a48a, /*  837 */
+    0x4b6c537c, /*  838 */
+    0x4b7400dd, /*  839 */
+    0x4b7bacaf, /*  840 */
+    0x4b8356f2, /*  841 */
+    0x4b8affa7, /*  842 */
+    0x4b92a6ce, /*  843 */
+    0x4b9a4c69, /*  844 */
+    0x4ba1f079, /*  845 */
+    0x4ba992fd, /*  846 */
+    0x4bb133f8, /*  847 */
+    0x4bb8d369, /*  848 */
+    0x4bc07151, /*  849 */
+    0x4bc80db2, /*  850 */
+    0x4bcfa88c, /*  851 */
+    0x4bd741df, /*  852 */
+    0x4bded9ad, /*  853 */
+    0x4be66ff6, /*  854 */
+    0x4bee04bb, /*  855 */
+    0x4bf597fc, /*  856 */
+    0x4bfd29bc, /*  857 */
+    0x4c04b9f9, /*  858 */
+    0x4c0c48b6, /*  859 */
+    0x4c13d5f2, /*  860 */
+    0x4c1b61af, /*  861 */
+    0x4c22ebed, /*  862 */
+    0x4c2a74ad, /*  863 */
+    0x4c31fbf0, /*  864 */
+    0x4c3981b6, /*  865 */
+    0x4c410600, /*  866 */
+    0x4c4888d0, /*  867 */
+    0x4c500a25, /*  868 */
+    0x4c578a00, /*  869 */
+    0x4c5f0862, /*  870 */
+    0x4c66854c, /*  871 */
+    0x4c6e00bf, /*  872 */
+    0x4c757abb, /*  873 */
+    0x4c7cf341, /*  874 */
+    0x4c846a52, /*  875 */
+    0x4c8bdfee, /*  876 */
+    0x4c935416, /*  877 */
+    0x4c9ac6cb, /*  878 */
+    0x4ca2380e, /*  879 */
+    0x4ca9a7de, /*  880 */
+    0x4cb1163e, /*  881 */
+    0x4cb8832d, /*  882 */
+    0x4cbfeead, /*  883 */
+    0x4cc758bd, /*  884 */
+    0x4ccec15f, /*  885 */
+    0x4cd62894, /*  886 */
+    0x4cdd8e5c, /*  887 */
+    0x4ce4f2b7, /*  888 */
+    0x4cec55a7, /*  889 */
+    0x4cf3b72c, /*  890 */
+    0x4cfb1747, /*  891 */
+    0x4d0275f8, /*  892 */
+    0x4d09d340, /*  893 */
+    0x4d112f21, /*  894 */
+    0x4d188999, /*  895 */
+    0x4d1fe2ab, /*  896 */
+    0x4d273a57, /*  897 */
+    0x4d2e909d, /*  898 */
+    0x4d35e57f, /*  899 */
+    0x4d3d38fc, /*  900 */
+    0x4d448b16, /*  901 */
+    0x4d4bdbcd, /*  902 */
+    0x4d532b21, /*  903 */
+    0x4d5a7914, /*  904 */
+    0x4d61c5a7, /*  905 */
+    0x4d6910d9, /*  906 */
+    0x4d705aab, /*  907 */
+    0x4d77a31e, /*  908 */
+    0x4d7eea34, /*  909 */
+    0x4d862feb, /*  910 */
+    0x4d8d7445, /*  911 */
+    0x4d94b743, /*  912 */
+    0x4d9bf8e6, /*  913 */
+    0x4da3392d, /*  914 */
+    0x4daa7819, /*  915 */
+    0x4db1b5ac, /*  916 */
+    0x4db8f1e6, /*  917 */
+    0x4dc02cc7, /*  918 */
+    0x4dc76650, /*  919 */
+    0x4dce9e81, /*  920 */
+    0x4dd5d55c, /*  921 */
+    0x4ddd0ae1, /*  922 */
+    0x4de43f10, /*  923 */
+    0x4deb71eb, /*  924 */
+    0x4df2a371, /*  925 */
+    0x4df9d3a3, /*  926 */
+    0x4e010283, /*  927 */
+    0x4e083010, /*  928 */
+    0x4e0f5c4b, /*  929 */
+    0x4e168735, /*  930 */
+    0x4e1db0cf, /*  931 */
+    0x4e24d918, /*  932 */
+    0x4e2c0012, /*  933 */
+    0x4e3325bd, /*  934 */
+    0x4e3a4a1a, /*  935 */
+    0x4e416d2a, /*  936 */
+    0x4e488eec, /*  937 */
+    0x4e4faf62, /*  938 */
+    0x4e56ce8c, /*  939 */
+    0x4e5dec6b, /*  940 */
+    0x4e6508ff, /*  941 */
+    0x4e6c2449, /*  942 */
+    0x4e733e4a, /*  943 */
+    0x4e7a5702, /*  944 */
+    0x4e816e71, /*  945 */
+    0x4e888498, /*  946 */
+    0x4e8f9979, /*  947 */
+    0x4e96ad13, /*  948 */
+    0x4e9dbf67, /*  949 */
+    0x4ea4d075, /*  950 */
+    0x4eabe03e, /*  951 */
+    0x4eb2eec4, /*  952 */
+    0x4eb9fc05, /*  953 */
+    0x4ec10803, /*  954 */
+    0x4ec812bf, /*  955 */
+    0x4ecf1c39, /*  956 */
+    0x4ed62471, /*  957 */
+    0x4edd2b68, /*  958 */
+    0x4ee4311f, /*  959 */
+    0x4eeb3596, /*  960 */
+    0x4ef238cd, /*  961 */
+    0x4ef93ac6, /*  962 */
+    0x4f003b81, /*  963 */
+    0x4f073afe, /*  964 */
+    0x4f0e393f, /*  965 */
+    0x4f153642, /*  966 */
+    0x4f1c320a, /*  967 */
+    0x4f232c96, /*  968 */
+    0x4f2a25e8, /*  969 */
+    0x4f311dff, /*  970 */
+    0x4f3814dc, /*  971 */
+    0x4f3f0a80, /*  972 */
+    0x4f45feeb, /*  973 */
+    0x4f4cf21f, /*  974 */
+    0x4f53e41a, /*  975 */
+    0x4f5ad4de, /*  976 */
+    0x4f61c46c, /*  977 */
+    0x4f68b2c4, /*  978 */
+    0x4f6f9fe6, /*  979 */
+    0x4f768bd3, /*  980 */
+    0x4f7d768c, /*  981 */
+    0x4f846011, /*  982 */
+    0x4f8b4862, /*  983 */
+    0x4f922f81, /*  984 */
+    0x4f99156d, /*  985 */
+    0x4f9ffa27, /*  986 */
+    0x4fa6ddb0, /*  987 */
+    0x4fadc008, /*  988 */
+    0x4fb4a12f, /*  989 */
+    0x4fbb8127, /*  990 */
+    0x4fc25ff0, /*  991 */
+    0x4fc93d8a, /*  992 */
+    0x4fd019f5, /*  993 */
+    0x4fd6f533, /*  994 */
+    0x4fddcf43, /*  995 */
+    0x4fe4a827, /*  996 */
+    0x4feb7fde, /*  997 */
+    0x4ff2566a, /*  998 */
+    0x4ff92bca, /*  999 */
+    0x50000000, /* 1000 */
+    0x5006d30b, /* 1001 */
+    0x500da4ed, /* 1002 */
+    0x501475a5, /* 1003 */
+    0x501b4535, /* 1004 */
+    0x5022139c, /* 1005 */
+    0x5028e0dc, /* 1006 */
+    0x502facf4, /* 1007 */
+    0x503677e5, /* 1008 */
+    0x503d41b0, /* 1009 */
+    0x50440a55, /* 1010 */
+    0x504ad1d5, /* 1011 */
+    0x50519830, /* 1012 */
+    0x50585d67, /* 1013 */
+    0x505f217a, /* 1014 */
+    0x5065e469, /* 1015 */
+    0x506ca635, /* 1016 */
+    0x507366df, /* 1017 */
+    0x507a2667, /* 1018 */
+    0x5080e4cd, /* 1019 */
+    0x5087a212, /* 1020 */
+    0x508e5e37, /* 1021 */
+    0x5095193c, /* 1022 */
+    0x509bd320, /* 1023 */
+    0x50a28be6, /* 1024 */
+};
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
diff --git a/media/libstagefright/codecs/aacdec/iquant_table.h b/media/libstagefright/codecs/aacdec/iquant_table.h
new file mode 100644
index 0000000..dadc3d0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/iquant_table.h
@@ -0,0 +1,85 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: iquant_table.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for iquant_table.c, which contains a table used with
+ esc_iquant.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef IQUANT_TABLE_H
+#define IQUANT_TABLE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+extern const UInt32 inverseQuantTable[];
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/long_term_prediction.cpp b/media/libstagefright/codecs/aacdec/long_term_prediction.cpp
new file mode 100644
index 0000000..69e4c46
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/long_term_prediction.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: long_term_prediction.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made changes based on comments and experiment results.
+
+ Description: Passed in buffer sizes based on review comments and prototype
+              agreements.
+
+ Description: 1. Passed in "weight_index" instead of "weight".
+              2. Added weight table.
+
+ Description: 1. Removed some passed in buffer size variables since they are
+                 not used for long window.
+              2. Modified comments format.
+
+ Description:
+    Modified casting to ensure proper operations for different platforms
+
+ Description:
+    Implemented circular buffer techniques, which save 4096 memmoves per
+    frame.
+
+ Description:
+    Implemented some optimizations found during the code review of this
+    module.  The optimizations related to the rules on the range of
+    ltp_buffer_index and num_samples, which allows for a simpler
+    code construct to be used in the processing of the predicted samples.
+
+ Description:
+    Add max calculation on the filter implementation, this to eliminate
+    function buffer_adaptation() on the time to frequency transformation.
+    Function interface changed. It now return the amount of shifting needed
+    to garb only the top 16 MSB.
+
+ Description:
+     Replace clearing memory with for-loop with pvmemset function
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    win_seq = type of window sequence (WINDOW_SEQUENCE).
+
+    weight_index = index (Int) of LTP coefficient table for all windows in
+                   current frame.
+
+    delay = buffer (Int) containing delays for each window.
+
+    buffer = history buffer (Int16) containing the reconstructed time domain
+             signals of previous frames.
+
+    buffer_offset = value (Int) that indicates the location of the first
+                    element in the LTP circular buffer.  (Either 0 or 1024)
+
+    time_quant    = filterbank buffer (Int32) This buffer is used by the
+                    filterbank, but it's first 1024 elements are equivalent
+                    to the last 1024 elements in the conventionally
+                    implemented LTP buffer.  Using this buffer directly avoids
+                    costly duplication of memory.
+
+    predicted_samples = buffer (Int32) with length of 2048 to hold
+                        predicted time domain signals.
+
+    buffer_index = index into buffer where the first sample of data from
+                   the frame (t-2) (two frames ago) resides.  (Int)
+
+    frame_length = length of one frame, type of Int.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    Amount of shifting needed to grab the top 16 MSB from teh predicted buffer
+
+ Pointers and Buffers Modified:
+    predicted_samples contents are the newly calculated predicted time
+    domain signals
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Long term prediction (LTP) is used to reduce the redundancy of a signal
+ between successive coding frames. This function performs prediction by
+ applying 1-tap IIR filtering to calculate the predicted time domain
+ signals of current frame from previous reconstructed frames stored in
+ time domain history buffer.
+
+ The equation used for IIR filter is as following.
+
+            y(n) = weight * x(n - delay)
+
+    where   y(n) ----- predicted time domain signals
+            x(n) ----- reconstructed time domain signals
+            weight ----- LTP coefficient
+            delay ----- optimal delay from 0 to 2047
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3: Audio
+        Subpart 4.6.6   Long Term Prediction (LTP)
+
+ (2) MPEG-2 NBC Audio Decoder
+     "This software module was originally developed by Nokia in the course
+     of development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC13818-7,
+     14496-1, 2 and 3. This software module is an implementation of a part
+     of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2
+     aac/MPEG-4 Audio standard. ISO/IEC  gives users of the MPEG-2aac/MPEG-4
+     Audio standards free license to this software module or modifications
+     thereof for use in hardware or software products claiming conformance
+     to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to use this
+     software module in hardware or software products are advised that this
+     use may infringe existing patents. The original developer of this
+     software module, the subsequent editors and their companies, and ISO/IEC
+     have no liability for use of this software module or modifications
+     thereof in an implementation. Copyright is not released for non MPEG-2
+     aac/MPEG-4 Audio conforming products. The original developer retains
+     full right to use the code for the developer's own purpose, assign or
+     donate the code to a third party and to inhibit third party from using
+     the code for non MPEG-2 aac/MPEG-4 Audio conforming products. This
+     copyright notice must be included in all copies or derivative works.
+     Copyright (c)1997.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pPredicted_samples = &predicted_samples[0];
+
+    weight = codebook[weight_index];
+
+    IF (win_seq != EIGHT_SHORT_SEQUENCE)
+    THEN
+
+        block_length = frame_length << 1;
+
+        lag = delay[0];
+
+        j = block_length - lag;
+
+        IF (lag < frame_length)
+        THEN
+
+            num_samples = frame_length + lag;
+
+        ELSE
+
+            num_samples = block_length;
+
+        ENDIF
+
+        pBuffer = &buffer[j];
+
+        FOR (i = num_samples; i>0; i--)
+
+            *pPredicted_samples = weight * (*pBuffer);
+            pPredicted_samples = pPredicted_samples + 1;
+            pBuffer = pBuffer + 1;
+
+        ENDFOR
+
+        FOR (i = block_length - num_samples; i>0; i--)
+
+            *pPredicted_samples = 0;
+            pPredicted_samples = pPredicted_samples + 1;
+
+        ENDFOR
+
+    ELSE
+
+        FOR (wnd = 0; wnd < short_window_num; wnd++)
+
+            IF (win_prediction_used[wnd] != FALSE)
+            THEN
+
+                delay[wnd] = delay[0] + ltp_short_lag[wnd];
+
+                lag = delay[wnd];
+
+                j = wnd*short_block_length - lag;
+
+                IF (lag < short_frame_length)
+                THEN
+
+                    num_samples = short_frame_length + lag;
+
+                ELSE
+
+                    num_samples = short_block_length;
+
+                ENDIF
+
+                pBuffer = &buffer[j];
+
+                FOR (i = num_samples; i>0; i--)
+
+                    *pPredicted_samples = weight * (*pBuffer);
+                    pPredicted_samples = pPredicted_samples + 1;
+                    pBuffer = pBuffer + 1;
+
+                ENDFOR
+
+                FOR (i = short_block_length - num_samples; i>0; i--)
+
+                    *pPredicted_samples = 0;
+                    pPredicted_samples = pPredicted_samples + 1;
+
+                ENDFOR
+
+            ELSE
+
+                CALL pv_memset(
+                        pPredicted_samples,
+                        0,
+                        sizeof(*pPredicted_samples)*short_block_length);
+                MODIFYING (predicted_samples[]);
+
+                pPredicted_samples = pPredicted_samples + short_block_length;
+
+            ENDIF [ IF (win_prediction_used[wnd] != FALSE) ]
+
+        ENDFOR [ FOR (wnd=0; wnd<short_window_num; wnd++) ]
+
+    ENDIF [ IF (win_seq != EIGHT_SHORT_SEQUENCE) ]
+
+    RETURN
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "e_window_sequence.h"
+#include "ltp_common_internal.h"
+#include "long_term_prediction.h"
+#include "aac_mem_funcs.h"
+#include "pv_normalize.h"
+#include "window_block_fxp.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
+----------------------------------------------------------------------------*/
+/* Purpose: Codebook for LTP weight coefficients. Stored in Q15 format */
+const UInt codebook[CODESIZE] =
+{
+    18705,  /* 0 */
+    22827,  /* 1 */
+    26641,  /* 2 */
+    29862,  /* 3 */
+    32273,  /* 4 */
+    34993,  /* 5 */
+    39145,  /* 6 */
+    44877   /* 7 */
+};
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int long_term_prediction(
+    WINDOW_SEQUENCE     win_seq,
+    const Int           weight_index,
+    const Int           delay[],
+    const Int16         buffer[],
+    const Int           buffer_offset,
+    const Int32         time_quant[],
+    Int32         predicted_samples[],    /* Q15 */
+    const Int           frame_length)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    /*
+     * Window index
+     *
+     * Int wnd;
+     *
+     * will be enabled when short window information is available.
+     */
+
+    /* Pointer to time domain history buffer */
+
+    const Int16 *pBuffer;
+
+    const Int32 *pTimeQuant = time_quant;
+
+    /* Pointer to array containing predicted samples */
+    Int32 *pPredicted_samples;
+
+    Int32   test;
+    Int32   datum;
+
+    /* IIR coefficient with Q15 format */
+    UInt    weight;
+
+    /* Length of one block (two frames) */
+    Int     block_length;
+
+    Int     shift;
+    Int     k;
+    Int     ltp_buffer_index;
+    Int     jump_point;
+    Int     lag;
+    Int     num_samples;
+
+    Int32   max = 0;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    /* Initialize pointers */
+    pPredicted_samples = &predicted_samples[0];
+
+    weight = codebook[weight_index];
+
+    /****************************************/
+    /* LTP decoding process for long window */
+    /****************************************/
+
+    if (win_seq != EIGHT_SHORT_SEQUENCE)
+    {
+        /****************************************************/
+        /* Prediction based on previous time domain signals */
+        /****************************************************/
+        block_length = frame_length << 1;
+
+        /* Calculate time lag for 1-tap IIR filter */
+        lag = delay[0];
+
+        ltp_buffer_index = block_length - lag;
+
+        /* Calculate number of samples used in IIR filter */
+        if (lag < frame_length)
+        {
+            num_samples = frame_length + lag;
+        }
+        else
+        {
+            num_samples = block_length;
+        }
+
+
+        /*
+         * Calculate the predicted time domain signals from the
+         * reconstructed time domain signals of previous frames.
+         */
+
+        /* The data is stored in TWO buffers, either as...
+         *
+         *                                       [   t ==  0  ]
+         *
+         * [   t == -1   ][   t == -2   ]
+         *
+         * OR...
+         *                                       [   t ==  0  ]
+         *
+         * [   t == -2   ][   t == -1   ]
+         *
+         *
+         *
+         * In the first case, all of the buffers are non-contiguous,
+         * and each must be handled separately.  Code for this first case
+         * will function correctly for both cases.
+         *
+         * In the second case, the buffers storing t == -2, and t == -1
+         * data are contiguous, and an optimization could take advantage
+         * of this, at the cost of an increase in code size for this function.
+         */
+
+        /* Decrement block_length by num_samples.  This is important
+         * for the loop at the end of the "ACCESS DATA IN THE LTP BUFFERS"
+         * section that sets all remaining samples in the block to zero.
+         */
+
+        block_length -= num_samples;
+
+
+
+
+
+
+        /*
+         ************************************ ACCESS DATA IN THE LTP BUFFERS
+         */
+
+        /*
+         * This section of the code handles the t == -2
+         * buffer, which corresponds to 0 <= ltp_buffer_index < 1024
+         *
+         * BUFFER t == -2
+         *
+         * [0][][][][][][][][][][][...][][][][][][][][][][][][1023]
+         *
+         */
+
+        jump_point = (frame_length - ltp_buffer_index);
+
+        if (jump_point > 0)
+        {
+            pBuffer = &(buffer[ltp_buffer_index + buffer_offset]);
+
+            for (k = jump_point; k > 0; k--)
+            {
+                /* Q15 = Q15 * Q0 */
+                test = (Int32) weight * (*(pBuffer++));
+                *(pPredicted_samples++) =  test;
+                max                   |= (test >> 31) ^ test;
+            }
+
+            num_samples -= jump_point;
+
+            ltp_buffer_index += jump_point;
+        }
+
+        /*
+         * This section of the code handles the t == -1
+         * buffer, which corresponds to 1024 <= ltp_buffer_index < 2048
+         *
+         * BUFFER t == -1
+         *
+         * [1024][][][][][][][][][][][...][][][][][][][][][][][][2047]
+         *
+         */
+
+        jump_point = 2 * frame_length - ltp_buffer_index;
+
+        pBuffer = &(buffer[ltp_buffer_index - buffer_offset]);
+
+        if (num_samples < jump_point)
+        {
+            jump_point = num_samples;
+        }
+
+        for (k = jump_point; k > 0; k--)
+        {
+            /* Q15 = Q15 * Q0 */
+            test = (Int32) weight * (*(pBuffer++));
+            *(pPredicted_samples++) =  test;
+            max                   |= (test >> 31) ^ test;
+        }
+
+        num_samples -= jump_point;
+
+        ltp_buffer_index += jump_point;
+
+        /*
+         * This section of the code handles the t == 0
+         * buffer, which corresponds to 2048 <= ltp_buffer_index < 3072
+         *
+         * BUFFER t == 0
+         *
+         * [2048][][][][][][][][][][][...][][][][][][][][][][][][3071]
+         *
+         */
+        for (k = num_samples; k > 0; k--)
+        {
+
+            datum = *(pTimeQuant++) >> SCALING;
+
+            /*
+             * Limit the values in the 32-bit filterbank's buffer to
+             * 16-bit resolution.
+             *
+             * Value's greater than 32767 or less than -32768 are saturated
+             * to 32767 and -32768, respectively.
+             */
+
+            test                    = (Int32)datum * weight;
+            *(pPredicted_samples++) =  test;
+            max                    |= (test >> 31) ^ test;
+
+        }
+
+        /* Set any remaining samples in the block to 0. */
+
+        pv_memset(
+            pPredicted_samples,
+            0,
+            block_length*sizeof(*pPredicted_samples));
+
+    } /* if (win_seq != EIGHT_SHORT_SEQUENCE) */
+
+
+    /*****************************************/
+    /* LTP decoding process for short window */
+    /*****************************************/
+
+    /*
+     * For short window LTP, since there is no "ltp_short_lag"
+     * information being passed, the following code for short
+     * window LTP will be applied in the future when those
+     * information are available.
+     */
+
+    /*
+     *----------------------------------------------------------------------------
+     *  else
+     *  {
+     *      for (wnd = 0; wnd < short_window_num; wnd++)
+     *      {
+     *          if (win_prediction_used[wnd] != FALSE)
+     *          {
+     *              delay[wnd] = delay[0] + ltp_short_lag[wnd];
+     *
+     *              lag = delay[wnd];
+     *
+     *              j = wnd*short_block_length - lag;
+     *
+     *              if (lag < short_frame_length)
+     *              {
+     *                  num_samples = short_frame_length + lag;
+     *              }
+     *              else
+     *              {
+     *                  num_samples = short_block_length;
+     *              }
+     *
+     *              pBuffer = &buffer[j];
+     *
+     *              for(i = num_samples; i>0; i--)
+     *              {
+     *                  *(pPredicted_samples++) = weight * (*(pBuffer++));
+     *              }
+     *
+     *              for(i = short_block_length - num_samples; i>0; i--)
+     *              {
+     *                  *(pPredicted_samples++) = 0;
+     *              }
+     *          }
+     *          else
+     *          {
+     *              pv_memset(
+     *                  pPredicted_samples,
+     *                  0,
+     *                  sizeof(*pPredicted_samples)*short_block_length);
+     *
+     *              pPredicted_samples += short_block_length;
+     *          }
+     *      }
+     *  }
+     *----------------------------------------------------------------------------
+     */
+
+    shift = 16 - pv_normalize(max);
+
+    if (shift < 0)
+    {
+        shift = 0;
+    }
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return (shift);
+} /* long_term_prediction */
+
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/long_term_prediction.h b/media/libstagefright/codecs/aacdec/long_term_prediction.h
new file mode 100644
index 0000000..014934b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/long_term_prediction.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: long_term_prediction.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified prototype with array size passed in per review
+              comments.
+
+ Description: Changed prototype with "weight_index" instead of "weight".
+
+ Description: Removed some passed in buffer size variables since they are
+              not being used for long window.
+
+ Description: Temporarily define LTP_Q_FORMAT for current release.
+              Need to change function prototype and pass out Q_format
+              information later.
+
+ Description: Updated function prototype to reflect the usage of a
+ circular buffer by LTP.
+
+ Description:  Updated function interface with new return type
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes function prototype declaration for long_term_prediction().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LONG_TERM_PREDICTION_H
+#define LONG_TERM_PREDICTION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_window_sequence.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define LTP_Q_FORMAT    (15)
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+    Int long_term_prediction(
+        WINDOW_SEQUENCE     win_seq,
+        const Int           weight_index,
+        const Int           delay[],
+        const Int16         buffer[],
+        const Int           buffer_offset,
+        const Int32         time_quant[],
+        Int32               predicted_samples[],    /* Q15 */
+        const Int           frame_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/long_term_synthesis.cpp b/media/libstagefright/codecs/aacdec/long_term_synthesis.cpp
new file mode 100644
index 0000000..c361db1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/long_term_synthesis.cpp
@@ -0,0 +1,1158 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: long_term_synthesis.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made the following changes based on the review comments.
+              1. Separated "shift_factor>=0" on line 395 to "shift_factor>0"
+                 and "shift_factor=0" two cases.
+              2. Added comments on line 393 to explain why factor 2 is being
+                 used to calculate shift_factor.
+              3. Added comments for short window implementation.
+              4. Changed "*(pPredicted_spectral++) = *pPredicted_spectral>>2"
+                 to "*(pPredicted++)>>=2" although they are the same.
+              5. Changed pseudo code "X+=Y" to "X=X+Y".
+              6. Fixed ending comment of "for" loop.
+              7. Passed in the size of the array and deleted some of the
+                 include files.
+
+ Description: Unroll the loops.
+
+ Description: Changed index "wnd" in previous line 584 with "wnd_offset"
+              and made other correspondent changes to the code.
+
+
+ Description: Based on Ken's suggestion, modified the function with the
+              passing-in Q format as scalefactor band basis in order to
+              simplify TNS block functions.
+
+ Description: Optimization.
+
+ Description: Made changes based on review comments.
+              1. Changed misspellings.
+              2. Changed win_sfb_top[] from two dimensional array to one
+              dimensional array and correspondently changed the code.
+              3. Changed function prototype to remove some redundant
+              informations.
+              4. Fixed the adjusting Q format part code.
+              5. Fixed lines 825, 826 with correct updating pointers.
+
+ Description: Due to TNS and LTP Q format issue, added code to adjust
+              predicted_spectral() to maximum resolution before perform
+              long term synthesis.
+
+ Description: Modified based on review comments.
+
+ Description: Changed "max" data type from UInt to UInt32.
+
+ Description: Changed so that nothing is done for the case of "all zero"
+ data coming from the output of Trans4m_time_2_freq. Also, included more
+ efficient calculation of the abs(x).  And, I updated the pseudocode.
+
+ Description: Use an auxiliary variable temp, to avoid using the same
+    pointer and a post-increment pointer in the same line. This may not
+    work with all compilers.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    win_seq = type of window sequence (WINDOW_SEQUENCE).
+    sfb_per_win = number of scalefactor bands for each window, 1024 for
+                  long window, 128 for short window, type of Int.
+    win_sfb_top = buffer (Int16) containing the top coefficient per
+                  scalefactor band for each window.
+    win_prediction_used = buffer (Int) containing the prediction flag
+                          information for short windows. Each item in the
+                          buffer toggles prediction on(1)/off(0) for each
+                          window separately.
+    sfb_prediction_used = buffer (Int) containing the prediction flag
+                          information for scalefactor band(sfb). Each item
+                          toggle prediction on(1)/off(0) on each scalefactor
+                          band of every window.
+    current_frame = channel buffer (Int32) containing the dequantized
+                    spectral coefficients or errors of current frame.
+    q_format = buffer (Int) containing Q format for each scalefactor band of
+               input current_frame.
+    predicted_spectral = buffer (Int32) containing predicted spectral
+                         components of current frame.
+    pred_q_format = Q format (Int) for predicted spectral components of
+                    current frame.
+    coef_per_win = number of coefficients per window for short windows.
+                   type of Int.
+    short_window_num = number of short windows, type of Int.
+    reconstruct_sfb_num = number of scalefactor bands used for reconstruction
+                          for short windows, type of Int.
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    current_frame contents are the dequantized spectrum with a prediction
+    vector added when prediction is turned on.
+
+    q_format contents are updated with the new Q format (Int) for each
+    scalefactor band of output current_frame buffer.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function performs long term synthesis using transmitted spectral
+ coeffients or errors and predicted spectral components.
+
+ Long term synthesis is part of long term prediction (LTP) which is used to
+ reduce the redundancy of a signal between successive coding frames. The
+ functionality of long term synthesis is to reconstruct the frequency domain
+ spectral by adding the predicted spectral components and the transmitted
+ spectral error when prediction is turned on.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ None
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3: Audio
+        Subpart 4.6.6   Long Term Prediction (LTP)
+
+ (2) MPEG-2 NBC Audio Decoder
+     "This software module was originally developed by Nokia in the course
+     of development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC13818-7,
+     14496-1, 2 and 3. This software module is an implementation of a part
+     of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2
+     aac/MPEG-4 Audio standard. ISO/IEC  gives users of the MPEG-2aac/MPEG-4
+     Audio standards free license to this software module or modifications
+     thereof for use in hardware or software products claiming conformance
+     to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to use this
+     software module in hardware or software products are advised that this
+     use may infringe existing patents. The original developer of this
+     software module, the subsequent editors and their companies, and ISO/IEC
+     have no liability for use of this software module or modifications
+     thereof in an implementation. Copyright is not released for non MPEG-2
+     aac/MPEG-4 Audio conforming products. The original developer retains
+     full right to use the code for the developer's own purpose, assign or
+     donate the code to a third party and to inhibit third party from using
+     the code for non MPEG-2 aac/MPEG-4 Audio conforming products. This
+     copyright notice must be included in all copies or derivative works.
+     Copyright (c)1997.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pPredicted_spectral = &predicted_spectral[0];
+    pPredicted_spectral_start = pPredicted_spectral;
+    pSfb_prediction_used = &sfb_prediction_used[0];
+
+    IF (win_seq != EIGHT_SHORT_SEQUENCE)
+    THEN
+
+        sfb_offset = 0;
+
+        pWinSfbTop = &pWin_sfb_top[0];
+
+        pQ_format = &q_format[0];
+
+        FOR (i = sfb_per_frame; i>0; i--)
+
+            IF (*(pSfb_prediction_used++) != FALSE)
+            THEN
+
+                pPredicted_offset = pPredicted_spectral_start +
+                                                            sfb_offset;
+                pCurrent_frame = &current_frame[sfb_offset];
+
+                quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
+
+                max = 0;
+
+                pPredicted_spectral = pPredicted_offset;
+
+                FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--)
+
+                    tmpInt32 = *(pPredicted_spectral++);
+
+                    IF (tmpInt32 < 0)
+                    THEN
+
+                        tmpInt32 = -tmpInt32;
+
+                    ENDIF
+
+                    max |= tmpInt32;
+
+                ENDFOR
+
+                tmpInt = 0;
+
+                IF (max != 0)
+                THEN
+
+                    WHILE (max < 0x40000000L)
+
+                        max <<= 1;
+                        tmpInt++;
+
+                    ENDWHILE
+
+                    pPredicted_spectral = pPredicted_offset;
+
+                    FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                        *(pPredicted_spectral++) <<= tmpInt;
+                        *(pPredicted_spectral++) <<= tmpInt;
+                        *(pPredicted_spectral++) <<= tmpInt;
+                        *(pPredicted_spectral++) <<= tmpInt;
+
+                    ENDFOR
+
+                    adjusted_pred_q = pred_q_format + tmpInt;
+
+                    pPredicted_spectral = pPredicted_offset;
+
+                    shift_factor = *(pQ_format) - adjusted_pred_q;
+
+                    IF ((shift_factor >= 0) && (shift_factor < 31))
+                    THEN
+
+                        shift_factor = shift_factor + 1;
+
+                        FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                            *(pCurrent_frame++) =
+                                (*pCurrent_frame>>shift_factor)
+                              + (*(pPredicted_spectral++)>>1);
+                            *(pCurrent_frame++) =
+                                (*pCurrent_frame>>shift_factor)
+                              + (*(pPredicted_spectral++)>>1);
+                            *(pCurrent_frame++) =
+                                (*pCurrent_frame>>shift_factor)
+                              + (*(pPredicted_spectral++)>>1);
+                            *(pCurrent_frame++) =
+                                (*pCurrent_frame>>shift_factor)
+                              + (*(pPredicted_spectral++)>>1);
+
+                        ENDFOR
+
+                        *(pQ_format) = adjusted_pred_q - 1;
+
+                    ELSEIF (shift_factor >= 31)
+                    THEN
+
+                        FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                            *(pCurrent_frame++) = *(pPredicted_spectral++);
+                            *(pCurrent_frame++) = *(pPredicted_spectral++);
+                            *(pCurrent_frame++) = *(pPredicted_spectral++);
+                            *(pCurrent_frame++) = *(pPredicted_spectral++);
+
+                        ENDFOR
+
+                        *(pQ_format) = adjusted_pred_q;
+
+                    ELSEIF ((shift_factor < 0) && (shift_factor > -31))
+                    THEN
+
+                        shift_factor = 1 - shift_factor;
+
+                        FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                (*(pPredicted_spectral++)>>shift_factor);
+                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                (*(pPredicted_spectral++)>>shift_factor);
+                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                (*(pPredicted_spectral++)>>shift_factor);
+                            *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                (*(pPredicted_spectral++)>>shift_factor);
+
+                        ENDFOR
+
+                        *(pQ_format) = *(pQ_format) - 1;
+
+                    ENDIF
+
+                ENDIF
+
+            ENDIF [ IF (*(pSfb_prediction_used++) != FALSE) ]
+
+            sfb_offset = *pWinSfbTop;
+            pWinSfbTop = pWinSfbTop + 1;
+            pQ_format = pQ_format + 1;
+
+        ENDFOR [ FOR (i = sfb_per_frame; i>0; i--) ]
+
+    ELSE
+
+        pCurrent_frame_start = &current_frame[0];
+
+        pQ_format_start = &q_format[0];
+
+        num_sfb = sfb_per_win[0];
+
+        FOR (wnd=0; wnd<short_window_num; wnd++)
+
+            pWinSfbTop = &pWin_sfb_top[0];
+
+            pQ_format = pQ_format_start;
+
+            IF (win_prediction_used[wnd] != FALSE)
+            THEN
+
+                sfb_offset = 0;
+
+                FOR (i = reconstruct_sfb_num; i > 0; i--)
+
+                    pPredicted_offset = pPredicted_spectral_start +
+                                                                sfb_offset;
+                    pCurrent_frame = pCurrent_frame_start + sfb_offset;
+
+                    quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
+
+                    max = 0;
+
+                    pPredicted_spectral = pPredicted_offset;
+
+                    FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--)
+
+                        tmpInt32 = *(pPredicted_spectral++);
+
+                        IF (tmpInt32 < 0)
+                        THEN
+
+                            tmpInt32 = -tmpInt32;
+
+                        ENDIF
+
+                        max |= tmpInt32;
+
+                    ENDFOR
+
+                    tmpInt = 0;
+
+                    IF (max != 0)
+                    THEN
+
+                        WHILE (max < 0x40000000L)
+
+                            max <<= 1;
+                            tmpInt++;
+
+                        ENDWHILE
+
+
+                        pPredicted_spectral = pPredicted_offset;
+
+                        FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                            *(pPredicted_spectral++) <<= tmpInt;
+                            *(pPredicted_spectral++) <<= tmpInt;
+                            *(pPredicted_spectral++) <<= tmpInt;
+                            *(pPredicted_spectral++) <<= tmpInt;
+
+                        ENDFOR
+
+                        adjusted_pred_q = pred_q_format + tmpInt;
+
+                        pPredicted_spectral = pPredicted_offset;
+
+                        shift_factor = *(pQ_format) - adjusted_pred_q;
+
+                        IF ((shift_factor >= 0) && (shift_factor < 31))
+                        THEN
+
+                            shift_factor = shift_factor + 1;
+
+                            FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                                *(pCurrent_frame++) =
+                                    (*pCurrent_frame>>shift_factor) +
+                                                (*(pPredicted_spectral++)>>1);
+                                *(pCurrent_frame++) =
+                                    (*pCurrent_frame>>shift_factor) +
+                                                (*(pPredicted_spectral++)>>1);
+                                *(pCurrent_frame++) =
+                                    (*pCurrent_frame>>shift_factor) +
+                                                (*(pPredicted_spectral++)>>1);
+                                *(pCurrent_frame++) =
+                                    (*pCurrent_frame>>shift_factor) +
+                                                (*(pPredicted_spectral++)>>1);
+
+                            ENDFOR
+
+                            *(pQ_format) = adjusted_pred_q - 1;
+
+                        ELSEIF (shift_factor >= 31)
+                        THEN
+
+                            FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                                *(pCurrent_frame++) = *(pPredicted_spectral++);
+                                *(pCurrent_frame++) = *(pPredicted_spectral++);
+                                *(pCurrent_frame++) = *(pPredicted_spectral++);
+                                *(pCurrent_frame++) = *(pPredicted_spectral++);
+
+                            ENDFOR
+
+                            *(pQ_format) = adjusted_pred_q;
+
+                        ELSEIF ((shift_factor < 0) && (shift_factor > -31))
+                        THEN
+
+                            shift_factor = 1 - shift_factor;
+
+                            FOR (j = quarter_sfb_width; j>0 ; j--)
+
+                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                    (*(pPredicted_spectral++)>>shift_factor);
+                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                    (*(pPredicted_spectral++)>>shift_factor);
+                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                    (*(pPredicted_spectral++)>>shift_factor);
+                                *(pCurrent_frame++) = (*pCurrent_frame>>1) +
+                                    (*(pPredicted_spectral++)>>shift_factor);
+
+                            ENDFOR
+
+                            *(pQ_format) = *(pQ_format) - 1;
+
+                        ENDIF
+
+                    ENDIF
+
+                    sfb_offset = *pWinSfbTop;
+                    pWinSfbTop = pWinSfbTop + 1;
+                    pQ_format = pQ_format + 1;
+
+                ENDFOR [ FOR (i = reconstruct_sfb_num; i > 0; i--) ]
+
+            ENDIF [ IF (win_prediction_used[wnd] != FALSE) ]
+
+            pPredicted_spectral_start = pPredicted_spectral_start + num_sfb;
+            pCurrent_frame_start = pCurrent_frame_start + num_sfb;
+            wnd_offset = wnd_offset + num_sfb;
+            pQ_format_start = pQ_format_start + num_sfb;
+
+        ENDFOR [ FOR (wnd=0; wnd<short_window_num; wnd++) ]
+
+    ENDIF [ IF (win_seq != EIGHT_SHORT_SEQUENCE) ]
+
+    RETURN
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "e_window_sequence.h"
+#include "long_term_synthesis.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 long_term_synthesis(
+    WINDOW_SEQUENCE     win_seq,
+    Int                 sfb_per_win,
+    Int16               win_sfb_top[],
+    Int                 win_prediction_used[],
+    Int                 sfb_prediction_used[],
+    Int32               current_frame[],
+    Int                 q_format[],         /* for each sfb */
+    Int32               predicted_spectral[],
+    Int                 pred_q_format,      /* for predicted_spectral[] */
+    Int                 coef_per_win,
+    Int                 short_window_num,
+    Int                 reconstruct_sfb_num)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    /* Scalefactor band offset */
+    Int sfb_offset;
+
+    /* Window index */
+    Int wnd;
+
+    /* Pointer to array containing predicted samples */
+    Int32 *pPredicted_spectral;
+
+    /* Pointer to the beginning of array containing predicted samples */
+    Int32 *pPredicted_spectral_start;
+
+    Int32 *pPredicted_offset;
+
+    /* Pointer to array containing current spectral components for a channel*/
+    Int32 *pCurrent_frame;
+
+    /* Another pointer to array containing current spectral components */
+    Int32 *pCurrent_frame_start;
+
+    /* Pointer to prediction flag for each scalefactor band */
+    Int *pSfb_prediction_used;
+
+    /* Pointer to top coef per scalefactor band */
+    Int16 *pWinSfbTop;
+
+    /* Pointer to q_format array */
+    Int *pQ_format;
+    Int *pQ_format_start;
+    Int32   temp;
+
+    Int i;
+    Int j;
+
+    Int quarter_sfb_width;
+    Int num_sfb;
+    Int shift_factor;
+
+    UInt32  max;
+    Int32   tmpInt32;
+
+    Int tmpInt;
+    Int adjusted_pred_q;
+    Int pred_shift;
+
+    /*----------------------------------------------------------------------------
+    ; Function body here
+    ----------------------------------------------------------------------------*/
+    /* Initialize pointers */
+    pPredicted_spectral = &predicted_spectral[0];
+    pPredicted_spectral_start = pPredicted_spectral;
+
+    /*
+     * NOTE:
+     * sfb_prediction_used[] start from 0 or 1 depending on nok_lt_decode.c;
+     * currently we agree to make it start from 0;
+     */
+    pSfb_prediction_used = &sfb_prediction_used[0];
+
+    /*********************************/
+    /* LTP synthesis for long window */
+    /*********************************/
+    if (win_seq != EIGHT_SHORT_SEQUENCE)
+    {
+
+        /*******************************************************/
+        /* Reconstruction of current frequency domain spectrum */
+        /*******************************************************/
+
+        /* Initialize scalefactor band offset */
+        sfb_offset = 0;
+
+        /*
+         * Reconstruction is processed on scalefactor band basis.
+         * 1. When prediction is turned on, all the predicted spectral
+         * components will be used for reconstruction.
+         * 2. When prediction is turned off, reconstruction is not
+         * needed. Spectral components of current frame will directly
+         * come from the transmitted data.
+         */
+        pWinSfbTop = &win_sfb_top[0];
+
+        pQ_format = &q_format[0];
+
+        for (i = sfb_per_win; i > 0; i--)
+        {
+            /* Check prediction flag for each scalefactor band. */
+            if (*(pSfb_prediction_used++) != FALSE)
+            {
+                /*
+                 * Prediction is on. Do reconstruction routine.
+                 * Reconstruct spectral component of current
+                 * frame by adding the predicted spectral
+                 * components and the quantized prediction
+                 * errors that reconstructed from transmitted
+                 * data when prediction is turned on.
+                 */
+
+                /* Set pointers to the offset of scalefactor bands */
+                pPredicted_offset = pPredicted_spectral_start +
+                                    sfb_offset;
+                pCurrent_frame = &current_frame[sfb_offset];
+
+                /*
+                 * (*pWinSfbTop - sfb_offset) is number of coefficients
+                 * of the scalefactor band.
+                 * ">>2" is used to set up for later unrolling the loop.
+                 */
+                quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
+
+                /*
+                 * Adjust pred_q_format and predicted_spectral() to
+                 * maximum resolution.
+                 */
+                max = 0;
+
+                pPredicted_spectral = pPredicted_offset;
+
+                /* Find the maximum absolute value */
+                for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--)
+                {
+                    tmpInt32 = *(pPredicted_spectral++);
+
+                    /*
+                     * Note: overflow is protected here even though
+                     * tmpInt32 = 0x80000000 is very rare case.
+                     *
+                     *  if (tmpInt32 == LONG_MIN)
+                     *  {
+                     *      tmpInt32 = LONG_MAX;
+                     *  }
+                     *  if (tmpInt32 < 0)
+                     *  {
+                     *      tmpInt32 = -tmpInt32;
+                     *  }
+                     */
+
+                    max |= tmpInt32 ^(tmpInt32 >> 31);
+                }
+
+                /*
+                 * IF the LTP data is all zeros
+                 * (max == 0) - do nothing for this sfb.
+                 */
+
+                if (max != 0)
+                {
+                    /* Find the number of bits to reach the max resolution */
+                    tmpInt = 0;
+
+                    while (max < 0x40000000L)
+                    {
+                        max <<= 1;
+                        tmpInt++;
+                    }
+
+                    /*
+                     * The following codes are combinded into shift factor
+                     * adjusting and reconstruction section.
+                     *
+                     * pPredicted_spectral = pPredicted_offset;
+                     * for(j = quarter_sfb_width; j>0 ; j--)
+                     * {
+                     *      *(pPredicted_spectral++) <<= tmpInt;
+                     *      *(pPredicted_spectral++) <<= tmpInt;
+                     *      *(pPredicted_spectral++) <<= tmpInt;
+                     *      *(pPredicted_spectral++) <<= tmpInt;
+                     * }
+                     *
+                     */
+
+                    /* Adjust Q format for predicted_spectral() */
+                    adjusted_pred_q = pred_q_format + tmpInt;
+
+                    /*
+                     * Adjust Q format to prevent overflow that may occur during
+                     * frequency domain reconstruction.
+                     *
+                     */
+                    pPredicted_spectral = pPredicted_offset;
+
+                    shift_factor = *(pQ_format) - adjusted_pred_q;
+
+                    if ((shift_factor >= 0) && (shift_factor < 31))
+                    {
+                        shift_factor = shift_factor + 1;
+                        pred_shift = tmpInt - 1;
+
+                        if (pred_shift >= 0)
+                        {
+                            for (j = quarter_sfb_width; j > 0 ; j--)
+                            {
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) << pred_shift);
+                            }
+                        }
+                        else
+                        {
+                            for (j = quarter_sfb_width; j > 0 ; j--)
+                            {
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) >> 1);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) >> 1);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) >> 1);
+                                temp = *pCurrent_frame >> shift_factor;
+                                *(pCurrent_frame++) = temp
+                                                      + (*(pPredicted_spectral++) >> 1);
+                            }
+                        }
+
+                        /* Updated new Q format for current scalefactor band */
+                        *(pQ_format) = adjusted_pred_q  - 1;
+                    }
+                    else if (shift_factor >= 31)
+                    {
+                        for (j = quarter_sfb_width; j > 0 ; j--)
+                        {
+                            *(pCurrent_frame++) =
+                                *(pPredicted_spectral++) << tmpInt;
+                            *(pCurrent_frame++) =
+                                *(pPredicted_spectral++) << tmpInt;
+                            *(pCurrent_frame++) =
+                                *(pPredicted_spectral++) << tmpInt;
+                            *(pCurrent_frame++) =
+                                *(pPredicted_spectral++) << tmpInt;
+                        }
+
+                        /* Updated new Q format for current scalefactor band */
+                        *(pQ_format) = adjusted_pred_q ;
+                    }
+                    else if ((shift_factor < 0) && (shift_factor > -31))
+                    {
+                        shift_factor = 1 - shift_factor;
+                        pred_shift = tmpInt - shift_factor;
+
+                        if (pred_shift >= 0)
+                        {
+                            for (j = quarter_sfb_width; j > 0 ; j--)
+                            {
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) << pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) << pred_shift);
+                            }
+                        }
+                        else
+                        {
+                            pred_shift = -pred_shift;
+
+                            for (j = quarter_sfb_width; j > 0 ; j--)
+                            {
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) >> pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) >> pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) >> pred_shift);
+                                temp = *pCurrent_frame >> 1;
+                                *(pCurrent_frame++) =  temp +
+                                                       (*(pPredicted_spectral++) >> pred_shift);
+                            }
+                        }
+
+                        /*
+                         * Updated new Q format for current scalefactor band
+                         *
+                         * This is NOT a pointer decrement
+                         */
+                        (*pQ_format)--;
+                    }
+
+                } /* if (max != 0) */
+
+                /*
+                 * For case (shift_factor <= -31), *pCurrent_frame and
+                 * *pQ_format do not need to be updated.
+                 */
+
+            } /* if (*(pSfb_prediction_used++) != FALSE) */
+
+            /* Updated to next scalefactor band. */
+            sfb_offset = *(pWinSfbTop++);
+
+            /* Updated pointer to next scalefactor band's Q-format */
+            pQ_format++;
+
+        } /* for (i = sfb_per_frame; i>0; i--) */
+
+    } /* if (win_seq!=EIGHT_SHORT_SEQUENCE) */
+
+    /**********************************/
+    /* LTP synthesis for short window */
+    /**********************************/
+    else
+    {
+        /******************************************************/
+        /*Reconstruction of current frequency domain spectrum */
+        /******************************************************/
+        pCurrent_frame_start = &current_frame[0];
+
+        pQ_format_start = &q_format[0];
+
+        num_sfb = sfb_per_win;
+
+        /* Reconstruction is processed on window basis */
+        for (wnd = 0; wnd < short_window_num; wnd++)
+        {
+            pWinSfbTop = &win_sfb_top[0];
+
+            pQ_format = pQ_format_start;
+
+            /* Check if prediction flag is on for each window */
+            if (win_prediction_used[wnd] != FALSE)
+            {
+                /* Initialize scalefactor band offset */
+                sfb_offset = 0;
+
+                /*
+                 * Reconstruction is processed on scalefactor band basis.
+                 * 1. When prediction is turned on, all the predicted
+                 * spectral components will be used for reconstruction.
+                 * 2. When prediction is turned off, reconstruction is
+                 * not needed. Spectral components of current frame
+                 * will directly come from the transmitted data.
+                 */
+
+                /*
+                 * According to ISO/IEC 14496-3 pg.91
+                 * Only the spectral components in first eight scalefactor
+                 * bands are added to the quantized prediction error.
+                 */
+                for (i = reconstruct_sfb_num; i > 0; i--)
+                {
+                    /* Set pointer to the offset of scalefactor bands */
+                    pPredicted_offset = pPredicted_spectral_start +
+                                        sfb_offset;
+                    pCurrent_frame = pCurrent_frame_start + sfb_offset;
+
+                    /*
+                     * Prediction is on. Do reconstruction routine.
+                     * Reconstruct spectral component of
+                     * current frame by adding the predicted
+                     * spectral components and the quantized
+                     * prediction errors that reconstructed
+                     * from transmitted data when prediction
+                     * is turned on.
+                     */
+
+                    /*
+                     * (*pWinSfbTop - sfb_offset) is number of coefficients
+                     * of the scalefactor band.
+                     * ">>2" is used to set up for later unrolling the loop.
+                     */
+                    quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2;
+
+                    /*
+                     * Adjust pred_q_format and predicted_spectral() to
+                     * maximum resolution.
+                     */
+                    max = 0;
+                    pPredicted_spectral = pPredicted_offset;
+
+                    /* Find the maximum absolute value */
+                    for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--)
+                    {
+                        tmpInt32 = *(pPredicted_spectral++);
+
+
+                        /*
+                         * Note: overflow is protected here even though
+                         * tmpInt32 = 0x80000000 is very rare case.
+                         *
+                         *  if (tmpInt32 == LONG_MIN)
+                         *  {
+                         *      tmpInt32 = LONG_MAX;
+                         *  }
+                         *  if (tmpInt32 < 0)
+                         *  {
+                         *      tmpInt32 = -tmpInt32;
+                         *  }
+                         */
+
+                        max |= tmpInt32 ^(tmpInt32 >> 31);
+                    }
+
+                    if (max != 0)
+                    {
+                        /* Find the number of bits to reach
+                         * the max resolution
+                         */
+                        tmpInt = 0;
+
+                        while (max < 0x40000000L)
+                        {
+                            max <<= 1;
+                            tmpInt++;
+                        }
+                        /*
+                         * The following codes are combined into shift factor
+                         * adjusting and reconstruction section.
+                         *
+                         * pPredicted_spectral = pPredicted_offset;
+                         * for(j = quarter_sfb_width; j>0 ; j--)
+                         * {
+                         *      *(pPredicted_spectral++) <<= tmpInt;
+                         *      *(pPredicted_spectral++) <<= tmpInt;
+                         *      *(pPredicted_spectral++) <<= tmpInt;
+                         *      *(pPredicted_spectral++) <<= tmpInt;
+                         * }
+                         *
+                         */
+
+                        /* Adjust Q format for predicted_spectral() */
+                        adjusted_pred_q = pred_q_format + tmpInt;
+
+                        /*
+                         * Adjust Q format to prevent overflow that may occur
+                         * during frequency domain reconstruction.
+                         */
+                        pPredicted_spectral = pPredicted_offset;
+
+                        shift_factor = *(pQ_format) - adjusted_pred_q;
+
+                        if ((shift_factor >= 0) && (shift_factor < 31))
+                        {
+                            shift_factor = shift_factor + 1;
+
+                            pred_shift = tmpInt - 1;
+
+                            if (pred_shift >= 0)
+                            {
+                                for (j = quarter_sfb_width; j > 0 ; j--)
+                                {
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) << pred_shift);
+
+                                }
+                            }
+                            else
+                            {
+                                for (j = quarter_sfb_width; j > 0 ; j--)
+                                {
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) >> 1);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) >> 1);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) >> 1);
+                                    temp = *pCurrent_frame >> shift_factor;
+                                    *(pCurrent_frame++) = temp
+                                                          + (*(pPredicted_spectral++) >> 1);
+                                }
+                            }
+
+                            /* Updated new Q format for current scalefactor band*/
+                            *(pQ_format) = adjusted_pred_q - 1;
+                        }
+                        else if (shift_factor >= 31)
+                        {
+                            for (j = quarter_sfb_width; j > 0 ; j--)
+                            {
+                                *(pCurrent_frame++) =
+                                    *(pPredicted_spectral++) << tmpInt;
+                                *(pCurrent_frame++) =
+                                    *(pPredicted_spectral++) << tmpInt;
+                                *(pCurrent_frame++) =
+                                    *(pPredicted_spectral++) << tmpInt;
+                                *(pCurrent_frame++) =
+                                    *(pPredicted_spectral++) << tmpInt;
+                            }
+
+                            /* Updated new Q format for current scalefactor band*/
+                            *(pQ_format) = adjusted_pred_q;
+                        }
+                        else if ((shift_factor < 0) && (shift_factor > -31))
+                        {
+                            shift_factor = 1 - shift_factor;
+
+                            pred_shift = tmpInt - shift_factor;
+
+                            if (pred_shift >= 0)
+                            {
+                                for (j = quarter_sfb_width; j > 0 ; j--)
+                                {
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) << pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) << pred_shift);
+
+                                }
+                            }
+                            else
+                            {
+                                pred_shift = -pred_shift;
+
+                                for (j = quarter_sfb_width; j > 0 ; j--)
+                                {
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) >> pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) >> pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) >> pred_shift);
+                                    temp = *pCurrent_frame >> 1;
+                                    *(pCurrent_frame++) =  temp +
+                                                           (*(pPredicted_spectral++) >> pred_shift);
+                                }
+                            }
+
+                            /* Updated new Q format for current scalefactor band*/
+                            *(pQ_format) = *(pQ_format) - 1;
+                        }
+
+                        /*
+                         * For case (shift_factor <= -31), *pCurrent_frame and
+                         * *pQ_format do not need to be updated.
+                         */
+
+                    } /* if (max != 0) */
+
+                    /* Updated to next scalefactor band. */
+                    sfb_offset = *(pWinSfbTop++);
+
+                    /* Updated pointer to next scalefactor band's Q-format */
+                    pQ_format++;
+
+                } /* for (i = reconstruct_sfb_num; i > 0; i--) */
+
+            } /* if (win_prediction_used[wnd] != FALSE) */
+
+            /* Updated to next window */
+            pPredicted_spectral_start += coef_per_win;
+            pCurrent_frame_start += coef_per_win;
+            pQ_format_start += num_sfb;
+
+        } /* for (wnd=0; wnd<short_window_num; wnd++) */
+
+    } /* else */
+
+    /*----------------------------------------------------------------------------
+    ; Return nothing or data or data pointer
+    ----------------------------------------------------------------------------*/
+    return;
+} /* long_term_synthesis */
+
+
diff --git a/media/libstagefright/codecs/aacdec/long_term_synthesis.h b/media/libstagefright/codecs/aacdec/long_term_synthesis.h
new file mode 100644
index 0000000..1195709
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/long_term_synthesis.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: long_term_synthesis.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: 1. Changed protoype with array size passed in per review
+                 comments.
+              2. Moved #define NUM_RECONSTRUCTED_SFB to ltp_common_internal.h
+
+ Description: Modified prototype based on review comments for new version
+          long_term_synthesis.c.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes function prototype declaration for long_term_synthesis().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LONG_TERM_SYNTHESIS_H
+#define LONG_TERM_SYNTHESIS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_window_sequence.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
+----------------------------------------------------------------------------*/
+void long_term_synthesis(
+    WINDOW_SEQUENCE     win_seq,
+    Int                 sfb_per_win,
+    Int16               win_sfb_top[],
+    Int                 win_prediction_used[],
+    Int                 sfb_prediction_used[],
+    Int32               current_frame[],
+    Int                 q_format[],
+    Int32               predicted_spectral[],
+    Int                 pred_q_format,
+    Int                 coef_per_win,
+    Int                 short_window_num,
+    Int                 reconstruct_sfb_num);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/lt_decode.cpp b/media/libstagefright/codecs/aacdec/lt_decode.cpp
new file mode 100644
index 0000000..e5f5f91
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/lt_decode.cpp
@@ -0,0 +1,507 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: lt_decode.c
+
+
+------------------------------------------------------------------------------
+
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  First round of optimizations.
+
+ Description:  pInputStream is now the 2nd parameter to this function.
+
+ Description:  Changed to work with MT's new get_ics_info.c function, which
+ only calls lt_decode if LTP is enabled.  This removes one grab from the
+ bitstream and one "if" from this code.  Also, changed setting of weight.
+ Now, rather than setting the actual weight, I only set the index into
+ a table in this function.
+
+ Description: Replace some instances of getbits to get9_n_lessbits
+              when the number of bits read is 9 or less and get1bits
+              when only 1 bit is read.
+
+ Who:                                   Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    win_type        Type of window (SHORT or LONG)
+                    [WINDOW_TYPE]
+
+    max_sfb         Maximum number of active scalefactor bands
+                    [Int]
+
+    pLt_pred        Pointer to structure containing information for
+                    long-term prediction.
+                    [LT_PRED_STATUS *]
+
+    pInputStream    Pointer to structure containing bitstream
+                    information.
+                    [BITS *]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    pLt_pred->weight_index - updated with index into weight table for LTP.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function decodes the bitstream elements for long term prediction
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by Nokia
+   in the course of development of the MPEG-2 AAC/MPEG-4 Audio standard
+   ISO/IEC13818-7, 14496-1, 2 and 3.  This software module is an implementation
+   of a part of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the
+   MPEG-2 aac/MPEG-4 Audio standard. ISO/IEC  gives users of the
+   MPEG-2aac/MPEG-4 Audio standards free license to this software module or
+   modifications thereof for use in hardware or software products claiming
+   conformance to the MPEG-2 aac/MPEG-4 Audio  standards. Those intending to
+   use this software module in hardware or software products are advised that
+   this use may infringe existing patents. The original developer of this
+   software module, the subsequent editors and their companies, and ISO/IEC
+   have no liability for use of this software module or modifications thereof
+   in an implementation. Copyright is not released for non MPEG-2 aac/MPEG-4
+   Audio conforming products. The original developer retains full right to use
+   the code for the developer's own purpose, assign or donate the code to a
+   third party and to inhibit third party from using the code for non
+   MPEG-2 aac/MPEG-4 Audio conforming products. This copyright notice
+   must be included in all copies or derivative works."
+   Copyright (c)1997.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pDelay[0] = (Int) getbits(
+                        LEN_LTP_LAG,
+                        pInputStream);
+
+    temp_reg  = (Int) getbits(
+                        LEN_LTP_COEF,
+                        pInputStream);
+
+    pLt_pred->weight = codebook[temp_reg];
+
+    last_band = max_sfb;
+
+    IF (win_type != EIGHT_SHORT_SEQUENCE)
+
+        IF (last_band > MAX_LT_PRED_LONG_SFB)
+
+            last_band = MAX_LT_PRED_LONG_SFB;
+
+        ENDIF
+
+        FOR (m = last_band; m > 0; m--)
+
+            *(pSfbPredictionUsed++) = (Int) getbits(
+                                               LEN_LTP_LONG_USED,
+                                               pInputStream);
+        ENDFOR
+
+        FOR (m = (max_sfb - last_band); m > 0; m--)
+
+            *(pSfbPredictionUsed++) = 0;
+
+        ENDFOR
+
+    ELSE
+
+        IF (last_band > MAX_LT_PRED_SHORT_SFB)
+
+            last_band = MAX_LT_PRED_SHORT_SFB;
+
+        ENDIF
+
+        prev_subblock = pDelay[0];
+
+        pWinPredictionUsed++;
+
+        pTempPtr = &pSfbPredictionUsed[0];
+
+        FOR (m = NUM_SHORT_WINDOWS; m > 0;)
+
+            m--;
+            temp_reg = (Int) getbits(
+                                LEN_LTP_SHORT_USED,
+                                pInputStream);
+
+            *(pWinPredictionUsed++) = temp_reg;
+
+            IF (temp_reg != FALSE)
+            {
+                *(pDelay++) = prev_subblock;
+
+                FOR (k = last_band; k > 0; k--)
+                {
+                    *(pTempPtr++) = 1;
+                }
+                break;
+            ELSE
+            {
+                pDelay++;
+                pTempPtr += last_band;
+            }
+
+        ENDFOR (m = NUM_SHORT_WINDOWS; m > 0;)
+
+        prev_subblock += LTP_LAG_OFFSET;
+
+        FOR (; m > 0; m--)
+
+            temp_reg = (Int) getbits (
+                                LEN_LTP_SHORT_USED,
+                                pInputStream);
+
+            *(pWinPredictionUsed++) = temp_reg;
+
+            IF (temp_reg != FALSE)
+
+                temp_reg = (Int) getbits(
+                                    LEN_LTP_SHORT_LAG_PRESENT,
+                                    pInputStream);
+                IF (temp_reg != 0)
+
+                    temp_reg  = (Int) getbits(
+                                         LEN_LTP_SHORT_LAG,
+                                         pInputStream);
+
+                    *(pDelay++) = prev_subblock - temp_reg;
+
+                ELSE
+
+                    *(pDelay++) = prev_subblock - LTP_LAG_OFFSET;
+
+                ENDIF
+
+                FOR (k = last_band; k > 0; k--)
+                    *(pTempPtr++) = 1;
+                ENDFOR
+
+            ELSE
+
+                pDelay++;
+                pTempPtr += last_band;
+
+            ENDIF
+
+        ENDFOR (; m > 0; m--)
+
+    ENDIF (win_type != EIGHT_SHORT_SEQUENCE)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "lt_decode.h"
+#include "ltp_common_internal.h"
+#include "window_block_fxp.h"
+#include "e_window_sequence.h"
+#include "s_lt_pred_status.h"
+#include "s_bits.h"
+#include "ibstream.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 lt_decode(
+    const WINDOW_SEQUENCE  win_type,
+    BITS            *pInputStream,
+    const Int              max_sfb,
+    LT_PRED_STATUS  *pLt_pred)
+{
+    Int wnd_num;
+    Int k;
+    Int last_band;
+    Int prev_subblock;
+    Int prev_subblock_nonzero;
+    Int temp_reg;
+
+    Bool *pWinPredictionUsed = pLt_pred->win_prediction_used;
+    Bool *pSfbPredictionUsed = pLt_pred->sfb_prediction_used;
+    Int  *pTempPtr;
+    Int  *pDelay = pLt_pred->delay;
+
+    pDelay[0] = (Int) get17_n_lessbits(
+                    LEN_LTP_LAG,  /* 11 bits */
+                    pInputStream);
+
+    pLt_pred->weight_index  = (Int) get9_n_lessbits(
+                                  LEN_LTP_COEF, /*  3 bits */
+                                  pInputStream);
+
+    last_band = max_sfb;
+
+    if (win_type != EIGHT_SHORT_SEQUENCE)
+    {
+
+        /* last_band = min(MAX_LT_PRED_LONG_SFB, max_sfb) MAX_SCFAC_BANDS */
+        if (last_band > MAX_LT_PRED_LONG_SFB)
+        {
+            last_band = MAX_LT_PRED_LONG_SFB;
+        }
+
+        for (k = last_band; k > 0; k--)
+        {
+            *(pSfbPredictionUsed++) = (Int) get1bits(pInputStream);
+        }
+
+        /*
+         * This is not a call to memset, because
+         * (max_sfb - last_band) should typically be a small value.
+         */
+        for (k = (max_sfb - last_band); k > 0; k--)
+        {
+            *(pSfbPredictionUsed++) = FALSE;
+        }
+    }
+    else /* (win_type == EIGHT_SHORT_SEQUENCE) */
+    {
+        /* last_band = min(MAX_LT_PRED_SHORT_SFB, max_sfb) */
+
+        if (last_band > MAX_LT_PRED_SHORT_SFB)
+        {
+            last_band = MAX_LT_PRED_SHORT_SFB;
+        }
+
+        /*
+         * The following two coding constructs are equivalent...
+         *
+         *  first_time == 1
+         *  for (wnd_num=NUM_SHORT_WINDOWS; wnd_num > 0; wnd_num--)
+         *  {
+         *     if (condition)
+         *     {
+         *       if (first_time == 1)
+         *       {
+         *           CODE SECTION A
+         *           first_time = 0;
+         *       }
+         *       else
+         *       {
+         *           CODE SECTION B
+         *       }
+         *     }
+         *  }
+         *
+         * -----------------------------------EQUIVALENT TO------------
+         *
+         *  wnd_num=NUM_SHORT_WINDOWS;
+         *
+         *  do
+         *  {
+         *     wnd_num--;
+         *     if (condition)
+         *     {
+         *         CODE SECTION A
+         *         break;
+         *     }
+         *  } while( wnd_num > 0)
+         *
+         *  while (wnd_num > 0)
+         *  {
+         *     if (condition)
+         *     {
+         *         CODE SECTION B
+         *     }
+         *     wnd_num--;
+         *  }
+         *
+         */
+
+        prev_subblock = pDelay[0];
+
+        pTempPtr = &pSfbPredictionUsed[0];
+
+        wnd_num = NUM_SHORT_WINDOWS;
+
+        prev_subblock_nonzero = prev_subblock;
+        prev_subblock += LTP_LAG_OFFSET;
+
+        do
+        {
+            /*
+             * Place decrement of wnd_num here, to insure
+             * that the decrement occurs before the
+             * break out of the do-while loop.
+             */
+            wnd_num--;
+
+            temp_reg = (Int) get1bits(pInputStream);
+
+            *(pWinPredictionUsed++) = temp_reg;
+
+            if (temp_reg != FALSE)
+            {
+                *(pDelay++) = prev_subblock_nonzero;
+
+                for (k = last_band; k > 0; k--)
+                {
+                    *(pTempPtr++) = TRUE;
+                }
+                for (k = (max_sfb - last_band); k > 0; k--)
+                {
+                    *(pTempPtr++) = FALSE;
+                }
+                break;
+
+            } /* if(pWinPredictionUsed) */
+            else
+            {
+                pDelay++;
+                pTempPtr += max_sfb;
+            }
+
+        }
+        while (wnd_num > 0);
+
+        /*
+         * This while loop picks up where the previous one left off.
+         * Notice that the code functions differently inside the loop
+         */
+
+        while (wnd_num > 0)
+        {
+            temp_reg = (Int) get1bits(pInputStream);
+
+            *(pWinPredictionUsed++) = temp_reg;
+
+            if (temp_reg != FALSE)
+            {
+                temp_reg = (Int) get1bits(pInputStream);
+                if (temp_reg != 0)
+                {
+                    temp_reg  = (Int) get9_n_lessbits(
+                                    LEN_LTP_SHORT_LAG,
+                                    pInputStream);
+
+                    *(pDelay++) = prev_subblock - temp_reg;
+                }
+                else
+                {
+                    *(pDelay++) = prev_subblock_nonzero;
+                }
+                for (k = last_band; k > 0; k--)
+                {
+                    *(pTempPtr++) = TRUE;
+                }
+                for (k = (max_sfb - last_band); k > 0; k--)
+                {
+                    *(pTempPtr++) = FALSE;
+                }
+
+            } /* if (temp_reg) */
+            else
+            {
+                pDelay++;
+                pTempPtr += max_sfb;
+            }
+
+            wnd_num--;
+
+        } /* while(wnd_num) */
+
+    } /* else (win_type == EIGHT_SHORT_SEQUENCE) */
+
+} /* lt_decode */
diff --git a/media/libstagefright/codecs/aacdec/lt_decode.h b/media/libstagefright/codecs/aacdec/lt_decode.h
new file mode 100644
index 0000000..c655270
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/lt_decode.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: lt_decode.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changing to move pInputStream to 2nd parameter.
+
+ Description: Replaced "e_WINDOW_TYPE.h" with "e_WINDOW_SEQUENCE.h"
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the global function declaration for lt_decode
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef LT_DECODE_H
+#define LT_DECODE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_window_sequence.h"
+#include "s_lt_pred_status.h"
+#include "s_bits.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
+----------------------------------------------------------------------------*/
+void lt_decode(
+    const WINDOW_SEQUENCE win_type,
+    BITS           *pInputStream,
+    const Int             max_sfb,
+    LT_PRED_STATUS *pLt_pred);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/lt_prediction.h b/media/libstagefright/codecs/aacdec/lt_prediction.h
new file mode 100644
index 0000000..e52a1e8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/lt_prediction.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/**************************************************************************
+
+This software module was originally developed by
+Nokia in the course of development of the MPEG-2 AAC/MPEG-4
+Audio standard ISO/IEC13818-7, 14496-1, 2 and 3.
+This software module is an implementation of a part
+of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the
+MPEG-2 aac/MPEG-4 Audio standard. ISO/IEC  gives users of the
+MPEG-2aac/MPEG-4 Audio standards free license to this software module
+or modifications thereof for use in hardware or software products
+claiming conformance to the MPEG-2 aac/MPEG-4 Audio  standards. Those
+intending to use this software module in hardware or software products
+are advised that this use may infringe existing patents. The original
+developer of this software module, the subsequent
+editors and their companies, and ISO/IEC have no liability for use of
+this software module or modifications thereof in an
+implementation. Copyright is not released for non MPEG-2 aac/MPEG-4
+Audio conforming products. The original developer retains full right to
+use the code for the developer's own purpose, assign or donate the code to a
+third party and to inhibit third party from using the code for non
+MPEG-2 aac/MPEG-4 Audio conforming products. This copyright notice
+must be included in all copies or derivative works.
+Copyright (c)1997.
+
+***************************************************************************/
+
+#ifndef _LT_PREDICTION_H
+#define _LT_PREDICTION_H
+
+#include "block.h"
+#include "ltp_common.h"
+#include "ibstream.h"
+#include "lt_decode.h"
+#include "s_frameinfo.h"
+#include "window_block.h"
+
+void init_lt_pred(LT_PRED_STATUS * lt_status);
+
+void lt_predict(
+    Int                  object,
+    FrameInfo           *pFrameInfo,
+    WINDOW_SEQUENCE      win_seq,
+    Wnd_Shape           *pWin_shape,
+    LT_PRED_STATUS  *pLt_status,
+    Real                *pPredicted_samples,
+    Real                *pOverlap_buffer,
+    Real                *pCurrent_frame_copy,
+    Real                 current_frame[]);
+
+short double_to_int(double sig_in);
+
+#endif /* not defined _LT_PREDICTION_H */
diff --git a/media/libstagefright/codecs/aacdec/ltp_common_internal.h b/media/libstagefright/codecs/aacdec/ltp_common_internal.h
new file mode 100644
index 0000000..d76ac75
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ltp_common_internal.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.
+ * -------------------------------------------------------------------
+ */
+/**************************************************************************
+
+This software module was originally developed by
+
+Mikko Suonio (Nokia)
+
+in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
+ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
+implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
+as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
+users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
+software module or modifications thereof for use in hardware or
+software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
+standards. Those intending to use this software module in hardware or
+software products are advised that this use may infringe existing
+patents. The original developer of this software module and his/her
+company, the subsequent editors and their companies, and ISO/IEC have
+no liability for use of this software module or modifications thereof
+in an implementation. Copyright is not released for non MPEG-2
+NBC/MPEG-4 Audio conforming products. The original developer retains
+full right to use the code for his/her own purpose, assign or donate
+the code to a third party and to inhibit third party from using the
+code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
+copyright notice must be included in all copies or derivative works.
+
+Copyright (c) 1997.
+
+***************************************************************************/
+
+#ifndef _LTP_COMMON_INTERNAL_H
+#define _LTP_COMMON_INTERNAL_H
+
+
+/*
+  Purpose:      Number of LTP coefficients. */
+#define LPC 1
+
+/*
+  Purpose:      Maximum LTP lag.  */
+#define DELAY 2048
+
+/*
+  Purpose:  Length of the bitstream element ltp_data_present.  */
+#define LEN_LTP_DATA_PRESENT 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_lag.  */
+#define LEN_LTP_LAG 11
+
+/*
+  Purpose:  Length of the bitstream element ltp_coef.  */
+#define LEN_LTP_COEF 3
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_used.  */
+#define LEN_LTP_SHORT_USED 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_lag_present.  */
+#define LEN_LTP_SHORT_LAG_PRESENT 1
+
+/*
+  Purpose:  Length of the bitstream element ltp_short_lag.  */
+#define LEN_LTP_SHORT_LAG 5
+
+/*
+  Purpose:  Offset of the lags written in the bitstream.  */
+#define LTP_LAG_OFFSET 16
+
+/*
+  Purpose:  Length of the bitstream element ltp_long_used.  */
+#define LEN_LTP_LONG_USED 1
+
+/*
+  Purpose:  Upper limit for the number of scalefactor bands
+        which can use lt prediction with long windows.
+  Explanation:  Bands 0..MAX_LT_PRED_SFB-1 can use lt prediction.  */
+#define MAX_LT_PRED_LONG_SFB 40
+
+/*
+  Purpose:  Upper limit for the number of scalefactor bands
+        which can use lt prediction with short windows.
+  Explanation:  Bands 0..MAX_LT_PRED_SFB-1 can use lt prediction.  */
+#define MAX_LT_PRED_SHORT_SFB 13
+
+/*
+   Purpose:      Buffer offset to maintain block alignment.
+   Explanation:  This is only used for a short window sequence.  */
+#define SHORT_SQ_OFFSET (BLOCK_LEN_LONG-(BLOCK_LEN_SHORT*4+BLOCK_LEN_SHORT/2))
+
+/*
+  Purpose:  Number of codes for LTP weight. */
+#define CODESIZE 8
+
+/* number of scalefactor bands used for reconstruction for short windows */
+#define NUM_RECONSTRUCTED_SFB (8)
+
+#endif /* _LTP_COMMON_INTERNAL_H */
diff --git a/media/libstagefright/codecs/aacdec/mdct_fxp.cpp b/media/libstagefright/codecs/aacdec/mdct_fxp.cpp
new file mode 100644
index 0000000..df371e8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mdct_fxp.cpp
@@ -0,0 +1,450 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mdct_fxp.c
+ Funtions: fft_rx2
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    data_quant  = Input vector, with quantized Q15 spectral lines:
+                  type Int32
+
+    Q_FFTarray  = Scratch memory used for in-place IFFT calculation,
+                  min size required 1024, type Int32
+
+    n           = Length of input vector "data_quant". Currently 256 or 2048.
+                  type const Int
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    shift = shift factor to reflect scaling introduced by FFT and mdct_fxp,
+
+ Pointers and Buffers Modified:
+    calculation are done in-place and returned in "data_quant"
+
+ Local Stores Modified:
+     None
+
+ Global Stores Modified:
+     None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    The MDCT is a linear orthogonal lapped transform, based on the idea of
+    time domain aliasing cancellation (TDAC).
+    MDCT is critically sampled, which means that though it is 50% overlapped,
+    a sequence data after MDCT has the same number of coefficients as samples
+    before the transform (after overlap-and-add). This means, that a single
+    block of MDCT data does not correspond to the original block on which the
+    MDCT was performed. When subsequent blocks of data are added (still using
+    50% overlap), the errors introduced by the transform cancels out.
+    Thanks to the overlapping feature, the MDCT is very useful for
+    quantization. It effectively removes the otherwise easily detectable
+    blocking artifact between transform blocks.
+    N = length of input vector X
+    X = vector of length N/2, will hold fixed point DCT
+    k = 0:1:N-1
+
+                        N-1
+            X(m) =  2   SUM   x(k)*cos(pi/(2*N)*(2*k+1+N/2)*(2*m+1))
+                        k=0
+
+
+    The window that completes the TDAC is applied before calling this function.
+    The MDCT can be calculated using an FFT, for this, the MDCT needs to be
+    rewritten as an odd-time odd-frequency discrete Fourier transform. Thus,
+    the MDCT can be calculated using only one n/4 point FFT and some pre and
+    post-rotation of the sample points.
+
+    Computation of the MDCT implies computing
+
+        x  = ( y   - y        ) + j( y       +  y       )
+         n      2n    N/2-1-2n        N-1-2n     N/2+2n
+
+    using the Fast discrete cosine transform as described in [2]
+
+    where x(n) is an input with N points
+
+    x(n) ----------------------------
+                                     |
+                                     |
+                    Pre-rotation by exp(j(2pi/N)(n+1/8))
+                                     |
+                                     |
+                              N/4- point FFT
+                                     |
+                                     |
+                    Post-rotation by exp(j(2pi/N)(k+1/8))
+                                     |
+                                     |
+                                      ------------- DCT
+
+    By considering the N/2 overlap, a relation between successive input blocks
+    is found:
+
+        x   (2n) = x (N/2 + 2n)
+         m+1        m
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should provide a fixed point MDCT with an average
+    quantization error less than 1 %.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] Analysis/Synthesis Filter Bank design based on time domain
+        aliasing cancellation
+        Jhon Princen, et. al.
+        IEEE Transactions on ASSP, vol ASSP-34, No. 5 October 1986
+        Pg 1153 - 1161
+
+    [2] Regular FFT-related transform kernels for DCT/DST based
+        polyphase filterbanks
+        Rolf Gluth
+        Proc. ICASSP 1991, pg. 2205 - 2208
+
+------------------------------------------------------------------------------
+  PSEUDO-CODE
+
+  Cx, Cy are complex number
+
+
+    exp = log2(n)-1
+
+    FOR ( k=0; k< n/4; k +=2)
+
+        Cx =   (data_quant[3n/4 + k] + data_quant[3n/4 - 1 - k]) +
+             j (data_quant[ n/4 + k] - data_quant[ n/4 - 1 - k])
+
+        Q_FFTarray = Cx * exp(-j(2pi/n)(k+1/8))
+
+    ENDFOR
+
+    FOR ( k=n/4; k< n/2; k +=2)
+
+        Cx =   (data_quant[3n/4 - 1 - k] + data_quant[ - n/4 + k]) +
+             j (data_quant[5n/4 - 1 - k] - data_quant[   n/4 + k])
+
+        Q_FFTarray = Cx * exp(-j(2pi/n)(k+1/8))
+
+    ENDFOR
+
+    CALL FFT( Q_FFTarray, n/4)
+
+    MODIFYING( Q_FFTarray )
+
+    RETURNING( shift )
+
+    FOR ( k=0; k< n/2; k +=2)
+
+        Cx = Q_FFTarray[ k] + j Q_FFTarray[ k+1]
+
+        Cy = 2 * Cx * exp(-j(2pi/n)(k+1/8))
+
+        data_quant[           k ] = - Real(Cy)
+        data_quant[ n/2 - 1 - k ] =   Imag(Cy)
+        data_quant[ n/2     + k ] = - Imag(Cy)
+        data_quant[ n       - k ] =   Real(Cy)
+
+    ENDFOR
+
+    MODIFIED    data_quant[]
+
+    RETURN      (-shift-1)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "mdct_fxp.h"
+#include "fft_rx4.h"
+#include "mix_radix_fft.h"
+#include "fwd_long_complex_rot.h"
+#include "fwd_short_complex_rot.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define ERROR_IN_FRAME_SIZE 10
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+Int mdct_fxp(
+    Int32   data_quant[],
+    Int32   Q_FFTarray[],
+    Int     n)
+{
+
+    Int32   temp_re;
+    Int32   temp_im;
+
+    Int32   temp_re_32;
+    Int32   temp_im_32;
+
+    Int16     cos_n;
+    Int16     sin_n;
+    Int32     exp_jw;
+    Int     shift;
+
+
+    const Int32 *p_rotate;
+
+
+    Int32   *p_data_1;
+    Int32   *p_data_2;
+    Int32   *p_data_3;
+    Int32   *p_data_4;
+
+    Int32 *p_Q_FFTarray;
+
+    Int32   max1;
+
+    Int k;
+    Int n_2   = n >> 1;
+    Int n_4   = n >> 2;
+    Int n_8   = n >> 3;
+    Int n_3_4 = 3 * n_4;
+
+    switch (n)
+    {
+        case SHORT_WINDOW_TYPE:
+            p_rotate = (Int32 *)exp_rotation_N_256;
+            break;
+
+        case LONG_WINDOW_TYPE:
+            p_rotate = (Int32 *)exp_rotation_N_2048;
+            break;
+
+        default:
+            /*
+             *  There is no defined behavior for a non supported frame
+             *  size. By returning a fixed scaling factor, the input will
+             *  scaled down and this will be heard as a low level noise
+             */
+            return(ERROR_IN_FRAME_SIZE);
+
+    }
+
+    /*--- Reordering and Pre-rotation by exp(-j(2pi/N)(r+1/8))   */
+    p_data_1 = &data_quant[n_3_4];
+    p_data_2 = &data_quant[n_3_4 - 1];
+    p_data_3 = &data_quant[n_4];
+    p_data_4 = &data_quant[n_4 - 1];
+
+    p_Q_FFTarray = Q_FFTarray;
+
+    max1 = 0;
+
+    for (k = n_8; k > 0; k--)
+    {
+        /*
+         *  scale down to ensure numbers are Q15
+         *  temp_re and temp_im are 32-bit but
+         *  only the lower 16 bits are used
+         */
+
+        temp_re = (*(p_data_1++) + *(p_data_2--)) >> 1;
+        temp_im = (*(p_data_3++) - *(p_data_4--)) >> 1;
+
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+
+        exp_jw = *p_rotate++;
+
+        cos_n = (Int16)(exp_jw >> 16);
+        sin_n = (Int16)(exp_jw & 0xFFFF);
+
+        temp_re_32 = temp_re * cos_n + temp_im * sin_n;
+        temp_im_32 = temp_im * cos_n - temp_re * sin_n;
+        *(p_Q_FFTarray++) = temp_re_32;
+        *(p_Q_FFTarray++) = temp_im_32;
+        max1         |= (temp_re_32 >> 31) ^ temp_re_32;
+        max1         |= (temp_im_32 >> 31) ^ temp_im_32;
+
+
+        p_data_1++;
+        p_data_2--;
+        p_data_4--;
+        p_data_3++;
+    }
+
+
+    p_data_1 = &data_quant[n - 1];
+    p_data_2 = &data_quant[n_2 - 1];
+    p_data_3 = &data_quant[n_2];
+    p_data_4 =  data_quant;
+
+    for (k = n_8; k > 0; k--)
+    {
+        /*
+         *  scale down to ensure numbers are Q15
+         */
+        temp_re = (*(p_data_2--) - *(p_data_4++)) >> 1;
+        temp_im = (*(p_data_1--) + *(p_data_3++)) >> 1;
+
+        p_data_2--;
+        p_data_1--;
+        p_data_4++;
+        p_data_3++;
+
+        /*
+         * cos_n + j*sin_n == exp(j(2pi/N)(k+1/8))
+         */
+
+        exp_jw = *p_rotate++;
+
+        cos_n = (Int16)(exp_jw >> 16);
+        sin_n = (Int16)(exp_jw & 0xFFFF);
+
+        temp_re_32 = temp_re * cos_n + temp_im * sin_n;
+        temp_im_32 = temp_im * cos_n - temp_re * sin_n;
+
+        *(p_Q_FFTarray++) = temp_re_32;
+        *(p_Q_FFTarray++) = temp_im_32;
+        max1         |= (temp_re_32 >> 31) ^ temp_re_32;
+        max1         |= (temp_im_32 >> 31) ^ temp_im_32;
+
+
+    } /* for(k) */
+
+
+
+    p_Q_FFTarray = Q_FFTarray;
+
+    if (max1)
+    {
+
+        if (n != SHORT_WINDOW_TYPE)
+        {
+
+            shift = mix_radix_fft(
+                        Q_FFTarray,
+                        &max1);
+
+            shift += fwd_long_complex_rot(
+                         Q_FFTarray,
+                         data_quant,
+                         max1);
+
+        }
+        else        /*  n_4 is 64 */
+        {
+
+            shift = fft_rx4_short(
+                        Q_FFTarray,
+                        &max1);
+
+            shift += fwd_short_complex_rot(
+                         Q_FFTarray,
+                         data_quant,
+                         max1);
+        }
+
+    }
+    else
+    {
+        shift = -31;
+    }
+
+    /*
+     *  returns shift introduced by FFT and mdct_fxp, 12 accounts for
+     *  regular downshift (14) and MDCT scale factor (-2)
+     *  number are returned as 16 bits
+     */
+    return (12 - shift);
+
+} /* mdct_fxp */
+
diff --git a/media/libstagefright/codecs/aacdec/mdct_fxp.h b/media/libstagefright/codecs/aacdec/mdct_fxp.h
new file mode 100644
index 0000000..b8d5a80
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mdct_fxp.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mdct_fxp.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: This extern had the incorrect length of the arrays.  The true
+ lengths are 128 and 1024, not 64 and 512.
+
+ Description:  Modified interface so a vector with extended precision is
+               returned. Added copyright notice.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function mdct_fxp()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MDCT_FXP_H
+#define MDCT_FXP_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define     LONG_WINDOW_TYPE  2048
+#define     SHORT_WINDOW_TYPE  256
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    extern const Int exp_rotation_N_256[128];
+    extern const Int exp_rotation_N_2048[1024];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+    Int mdct_fxp(
+        Int32   data_quant[],
+        Int32   Q_FFTarray[],
+        Int     n);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* MDCT_FXP_H */
diff --git a/media/libstagefright/codecs/aacdec/mdct_tables_fxp.cpp b/media/libstagefright/codecs/aacdec/mdct_tables_fxp.cpp
new file mode 100644
index 0000000..709cbf2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mdct_tables_fxp.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mdct_tables_fxp.c
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Created from fft_rx2.c
+
+ Description:  Modified to include forward and inverse tables
+
+ Who:                       Date:
+ Description:
+
+  ------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+    MDCT rotation tables fixpoint tables
+
+    For a table with N complex points:
+
+    cos_n + j*sin_n == exp(j(2pi/N)(n+1/8))
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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 FUNCTION REFERENCES
+    ; Declare functions defined elsewhere and referenced in this module
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+
+
+
+    extern const Int32 exp_rotation_N_256[64] =
+    {
+
+        0x5A820047,  0x5A7A0280, 0x5A6304B8, 0x5A3E06EF,
+        0x5A0C0926,  0x59CB0B5B, 0x597D0D8E, 0x59210FBF,
+        0x58B711EE,  0x5840141A, 0x57BB1643, 0x57281868,
+        0x56881A8A,  0x55DB1CA8, 0x55201EC1, 0x545820D5,
+        0x538322E5,  0x52A224EF, 0x51B326F3, 0x50B828F1,
+        0x4FB12AE9,  0x4E9D2CDA, 0x4D7D2EC5, 0x4C5230A8,
+        0x4B1A3284,  0x49D73458, 0x48883624, 0x472F37E7,
+        0x45CA39A2,  0x445A3B54, 0x42E03CFD, 0x415C3E9C,
+        0x3FCE4032,  0x3E3541BE, 0x3C944340, 0x3AE844B7,
+        0x39344624,  0x37774786, 0x35B148DD, 0x33E44A29,
+        0x320E4B69,  0x30304C9E, 0x2E4B4DC6, 0x2C5F4EE3,
+        0x2A6C4FF4,  0x287250F8, 0x267251F0, 0x246D52DB,
+        0x226153BA,  0x2051548B, 0x1E3B5550, 0x1C215607,
+        0x1A0256B1,  0x17DF574E, 0x15B957DD, 0x138F585F,
+        0x116358D3,  0x0F335939, 0x0D015992, 0x0ACE59DD,
+        0x08985A1A,  0x06625A49, 0x042A5A6A, 0x01F25A7D
+    };
+
+
+
+
+
+
+    extern const Int32 exp_rotation_N_2048[512] =
+    {
+
+        0x5A820009,  0x5A820050, 0x5A820097, 0x5A8100DE,
+        0x5A810125,  0x5A80016C, 0x5A7E01B3, 0x5A7D01FA,
+        0x5A7B0242,  0x5A790289, 0x5A7702D0, 0x5A750317,
+        0x5A72035E,  0x5A7003A5, 0x5A6D03EC, 0x5A6A0433,
+        0x5A66047A,  0x5A6304C1, 0x5A5F0508, 0x5A5B054F,
+        0x5A560596,  0x5A5205DD, 0x5A4D0624, 0x5A48066A,
+        0x5A4306B1,  0x5A3E06F8, 0x5A38073F, 0x5A320786,
+        0x5A2C07CD,  0x5A260814, 0x5A20085A, 0x5A1908A1,
+        0x5A1208E8,  0x5A0B092F, 0x5A040975, 0x59FC09BC,
+        0x59F40A03,  0x59EC0A49, 0x59E40A90, 0x59DC0AD7,
+        0x59D30B1D,  0x59CA0B64, 0x59C10BAA, 0x59B80BF1,
+        0x59AE0C37,  0x59A50C7E, 0x599B0CC4, 0x59910D0A,
+        0x59860D51,  0x597C0D97, 0x59710DDD, 0x59660E23,
+        0x595B0E6A,  0x594F0EB0, 0x59440EF6, 0x59380F3C,
+        0x592C0F82,  0x59200FC8, 0x5913100E, 0x59061054,
+        0x58F9109A,  0x58EC10E0, 0x58DF1126, 0x58D1116B,
+        0x58C411B1,  0x58B611F7, 0x58A7123C, 0x58991282,
+        0x588A12C8,  0x587B130D, 0x586C1353, 0x585D1398,
+        0x584E13DD,  0x583E1423, 0x582E1468, 0x581E14AD,
+        0x580D14F2,  0x57FD1538, 0x57EC157D, 0x57DB15C2,
+        0x57CA1607,  0x57B9164C, 0x57A71690, 0x579516D5,
+        0x5783171A,  0x5771175F, 0x575E17A3, 0x574C17E8,
+        0x5739182C,  0x57261871, 0x571218B5, 0x56FF18FA,
+        0x56EB193E,  0x56D71982, 0x56C319C6, 0x56AF1A0A,
+        0x569A1A4F,  0x56851A93, 0x56701AD6, 0x565B1B1A,
+        0x56461B5E,  0x56301BA2, 0x561A1BE5, 0x56041C29,
+        0x55EE1C6D,  0x55D81CB0, 0x55C11CF3, 0x55AA1D37,
+        0x55931D7A,  0x557C1DBD, 0x55651E00, 0x554D1E43,
+        0x55351E86,  0x551D1EC9, 0x55051F0C, 0x54EC1F4F,
+        0x54D31F91,  0x54BB1FD4, 0x54A12016, 0x54882059,
+        0x546F209B,  0x545520DE, 0x543B2120, 0x54212162,
+        0x540721A4,  0x53EC21E6, 0x53D12228, 0x53B62269,
+        0x539B22AB,  0x538022ED, 0x5364232E, 0x53492370,
+        0x532D23B1,  0x531123F2, 0x52F42434, 0x52D82475,
+        0x52BB24B6,  0x529E24F7, 0x52812538, 0x52642578,
+        0x524625B9,  0x522825FA, 0x520B263A, 0x51EC267A,
+        0x51CE26BB,  0x51B026FB, 0x5191273B, 0x5172277B,
+        0x515327BB,  0x513427FB, 0x5114283A, 0x50F4287A,
+        0x50D428BA,  0x50B428F9, 0x50942938, 0x50742978,
+        0x505329B7,  0x503229F6, 0x50112A35, 0x4FF02A74,
+        0x4FCE2AB2,  0x4FAD2AF1, 0x4F8B2B2F, 0x4F692B6E,
+        0x4F472BAC,  0x4F242BEA, 0x4F022C29, 0x4EDF2C67,
+        0x4EBC2CA4,  0x4E992CE2, 0x4E752D20, 0x4E522D5D,
+        0x4E2E2D9B,  0x4E0A2DD8, 0x4DE62E15, 0x4DC22E53,
+        0x4D9D2E90,  0x4D792ECD, 0x4D542F09, 0x4D2F2F46,
+        0x4D0A2F83,  0x4CE42FBF, 0x4CBF2FFB, 0x4C993038,
+        0x4C733074,  0x4C4D30B0, 0x4C2630EC, 0x4C003127,
+        0x4BD93163,  0x4BB2319E, 0x4B8B31DA, 0x4B643215,
+        0x4B3D3250,  0x4B15328B, 0x4AED32C6, 0x4AC53301,
+        0x4A9D333C,  0x4A753376, 0x4A4C33B1, 0x4A2433EB,
+        0x49FB3425,  0x49D2345F, 0x49A83499, 0x497F34D3,
+        0x4955350C,  0x492C3546, 0x4902357F, 0x48D835B9,
+        0x48AD35F2,  0x4883362B, 0x48583664, 0x482E369C,
+        0x480336D5,  0x47D7370E, 0x47AC3746, 0x4781377E,
+        0x475537B6,  0x472937EE, 0x46FD3826, 0x46D1385E,
+        0x46A43895,  0x467838CD, 0x464B3904, 0x461E393B,
+        0x45F13972,  0x45C439A9, 0x459739E0, 0x45693A16,
+        0x453C3A4D,  0x450E3A83, 0x44E03AB9, 0x44B13AEF,
+        0x44833B25,  0x44553B5B, 0x44263B90, 0x43F73BC6,
+        0x43C83BFB,  0x43993C30, 0x43693C65, 0x433A3C9A,
+        0x430A3CCF,  0x42DA3D04, 0x42AA3D38, 0x427A3D6C,
+        0x424A3DA0,  0x42193DD4, 0x41E93E08, 0x41B83E3C,
+        0x41873E6F,  0x41563EA3, 0x41253ED6, 0x40F33F09,
+        0x40C23F3C,  0x40903F6F, 0x405E3FA1, 0x402C3FD4,
+        0x3FFA4006,  0x3FC74038, 0x3F95406A, 0x3F62409C,
+        0x3F2F40CE,  0x3EFC4100, 0x3EC94131, 0x3E964162,
+        0x3E634193,  0x3E2F41C4, 0x3DFB41F5, 0x3DC74226,
+        0x3D934256,  0x3D5F4286, 0x3D2B42B6, 0x3CF642E6,
+        0x3CC24316,  0x3C8D4346, 0x3C584375, 0x3C2343A5,
+        0x3BEE43D4,  0x3BB84403, 0x3B834432, 0x3B4D4460,
+        0x3B18448F,  0x3AE244BD, 0x3AAC44EB, 0x3A754519,
+        0x3A3F4547,  0x3A094575, 0x39D245A2, 0x399B45CF,
+        0x396445FD,  0x392D462A, 0x38F64656, 0x38BF4683,
+        0x388746B0,  0x385046DC, 0x38184708, 0x37E04734,
+        0x37A84760,  0x3770478B, 0x373847B7, 0x36FF47E2,
+        0x36C7480D,  0x368E4838, 0x36554863, 0x361D488E,
+        0x35E348B8,  0x35AA48E2, 0x3571490C, 0x35384936,
+        0x34FE4960,  0x34C44989, 0x348B49B3, 0x345149DC,
+        0x34164A05,  0x33DC4A2E, 0x33A24A56, 0x33684A7F,
+        0x332D4AA7,  0x32F24ACF, 0x32B74AF7, 0x327C4B1F,
+        0x32414B46,  0x32064B6E, 0x31CB4B95, 0x31904BBC,
+        0x31544BE3,  0x31184C0A, 0x30DD4C30, 0x30A14C56,
+        0x30654C7C,  0x30294CA2, 0x2FEC4CC8, 0x2FB04CEE,
+        0x2F734D13,  0x2F374D38, 0x2EFA4D5D, 0x2EBD4D82,
+        0x2E804DA7,  0x2E434DCB, 0x2E064DEF, 0x2DC94E13,
+        0x2D8C4E37,  0x2D4E4E5B, 0x2D104E7E, 0x2CD34EA2,
+        0x2C954EC5,  0x2C574EE8, 0x2C194F0A, 0x2BDB4F2D,
+        0x2B9D4F4F,  0x2B5E4F71, 0x2B204F93, 0x2AE14FB5,
+        0x2AA34FD7,  0x2A644FF8, 0x2A255019, 0x29E6503A,
+        0x29A7505B,  0x2968507C, 0x2929509C, 0x28E950BC,
+        0x28AA50DC,  0x286A50FC, 0x282B511C, 0x27EB513B,
+        0x27AB515B,  0x276B517A, 0x272B5199, 0x26EB51B7,
+        0x26AB51D6,  0x266A51F4, 0x262A5212, 0x25E95230,
+        0x25A9524E,  0x2568526B, 0x25275288, 0x24E652A5,
+        0x24A652C2,  0x246452DF, 0x242352FB, 0x23E25318,
+        0x23A15334,  0x235F5350, 0x231E536B, 0x22DC5387,
+        0x229B53A2,  0x225953BD, 0x221753D8, 0x21D553F3,
+        0x2193540D,  0x21515427, 0x210F5442, 0x20CD545B,
+        0x208B5475,  0x2048548F, 0x200654A8, 0x1FC354C1,
+        0x1F8154DA,  0x1F3E54F2, 0x1EFB550B, 0x1EB85523,
+        0x1E76553B,  0x1E335553, 0x1DF0556A, 0x1DAC5582,
+        0x1D695599,  0x1D2655B0, 0x1CE355C7, 0x1C9F55DD,
+        0x1C5C55F4,  0x1C18560A, 0x1BD55620, 0x1B915636,
+        0x1B4D564B,  0x1B095661, 0x1AC55676, 0x1A82568B,
+        0x1A3E569F,  0x19F956B4, 0x19B556C8, 0x197156DC,
+        0x192D56F0,  0x18E95704, 0x18A45717, 0x1860572A,
+        0x181B573E,  0x17D75750, 0x17925763, 0x174D5775,
+        0x17095788,  0x16C4579A, 0x167F57AB, 0x163A57BD,
+        0x15F557CE,  0x15B057DF, 0x156B57F0, 0x15265801,
+        0x14E15812,  0x149C5822, 0x14575832, 0x14115842,
+        0x13CC5851,  0x13875861, 0x13415870, 0x12FC587F,
+        0x12B6588E,  0x1271589D, 0x122B58AB, 0x11E558B9,
+        0x11A058C7,  0x115A58D5, 0x111458E2, 0x10CE58F0,
+        0x108858FD,  0x1042590A, 0x0FFD5916, 0x0FB75923,
+        0x0F71592F,  0x0F2A593B, 0x0EE45947, 0x0E9E5952,
+        0x0E58595E,  0x0E125969, 0x0DCC5974, 0x0D85597E,
+        0x0D3F5989,  0x0CF95993, 0x0CB2599D, 0x0C6C59A7,
+        0x0C2559B1,  0x0BDF59BA, 0x0B9959C4, 0x0B5259CD,
+        0x0B0B59D5,  0x0AC559DE, 0x0A7E59E6, 0x0A3859EE,
+        0x09F159F6,  0x09AA59FE, 0x09645A05, 0x091D5A0D,
+        0x08D65A14,  0x08905A1B, 0x08495A21, 0x08025A28,
+        0x07BB5A2E,  0x07745A34, 0x072D5A3A, 0x06E75A3F,
+        0x06A05A44,  0x06595A49, 0x06125A4E, 0x05CB5A53,
+        0x05845A57,  0x053D5A5C, 0x04F65A60, 0x04AF5A63,
+        0x04685A67,  0x04215A6A, 0x03DA5A6D, 0x03935A70,
+        0x034C5A73,  0x03055A76, 0x02BE5A78, 0x02775A7A,
+        0x02305A7C,  0x01E95A7D, 0x01A25A7F, 0x015B5A80,
+        0x01135A81,  0x00CC5A82, 0x00855A82, 0x003E5A82
+    };
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/media/libstagefright/codecs/aacdec/mdst.cpp b/media/libstagefright/codecs/aacdec/mdst.cpp
new file mode 100644
index 0000000..19f82e3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mdst.cpp
@@ -0,0 +1,294 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: mdst.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input length 64
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    mdst
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#include "pv_audio_type_defs.h"
+#include "synthesis_sub_band.h"
+#include "dct16.h"
+#include "dct64.h"
+#include "mdst.h"
+
+#ifdef HQ_SBR
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#include "fxp_mul32.h"
+#include "dst32.h"
+
+
+#define Qfmt1(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+#define Qfmt(a)   (Int32)(a*((Int32)1<<27) + (a>=0?0.5F:-0.5F))
+
+const Int32 CosTable_32[32] =
+{
+    Qfmt1(0.50015063602065F),  Qfmt1(0.50135845244641F),
+    Qfmt1(0.50378872568104F),  Qfmt1(0.50747117207256F),
+    Qfmt1(0.51245147940822F),  Qfmt1(0.51879271310533F),
+    Qfmt1(0.52657731515427F),  Qfmt1(0.53590981690799F),
+    Qfmt1(0.54692043798551F),  Qfmt1(0.55976981294708F),
+    Qfmt1(0.57465518403266F),  Qfmt1(0.59181853585742F),
+    Qfmt1(0.61155734788251F),  Qfmt1(0.63423893668840F),
+    Qfmt1(0.66031980781371F),  Qfmt1(0.69037212820021F),
+    Qfmt1(0.72512052237720F),  Qfmt1(0.76549416497309F),
+    Qfmt1(0.81270209081449F),  Qfmt1(0.86834471522335F),
+    Qfmt(0.93458359703641F),  Qfmt(1.01440826499705F),
+    Qfmt(1.11207162057972F),  Qfmt(1.23383273797657F),
+    Qfmt(1.38929395863283F),  Qfmt(1.59397228338563F),
+    Qfmt(1.87467598000841F),  Qfmt(2.28205006800516F),
+    Qfmt(2.92462842815822F),  Qfmt(4.08461107812925F),
+    Qfmt(6.79675071167363F),  Qfmt(10.18693908361573F)
+};
+
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; mdst_32
+----------------------------------------------------------------------------*/
+
+void mdst_32(Int32 vec[], Int32 scratch_mem[])
+{
+
+    Int i;
+    const Int32 *pt_cos = CosTable_32;
+    Int32 *pt_vec = vec;
+    Int32 tmp1;
+    Int32 tmp2;
+
+
+
+    Int32 tmp3;
+
+    tmp3 = *(pt_vec++);
+    tmp2 = *(pt_vec);
+
+    for (i = 5; i != 0; i--)
+    {
+        *(pt_vec++)  += tmp3;
+        tmp1 = *(pt_vec);
+        *(pt_vec++)  += tmp2;
+        tmp3 = *(pt_vec);
+        *(pt_vec++)  += tmp1;
+        tmp2 = *(pt_vec);
+        *(pt_vec++)  += tmp3;
+        tmp1 = *(pt_vec);
+        *(pt_vec++)  += tmp2;
+        tmp3 = *(pt_vec);
+        *(pt_vec++)  += tmp1;
+        tmp2 = *(pt_vec);
+    }
+
+    *(pt_vec)  += tmp3;
+
+    dst_32(vec, scratch_mem);
+
+    pt_vec = vec;
+
+    for (i = 5; i != 0; i--)
+    {
+        *(pt_vec)   = fxp_mul32_Q31((*(pt_vec) << 1) + tmp2, *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q31((*(pt_vec) << 1) - tmp2, *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q31((*(pt_vec) << 1) + tmp2, *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q31((*(pt_vec) << 1) - tmp2, *(pt_cos++));
+        pt_vec++;
+    }
+
+    tmp2 >>= 1;
+    for (i = 3; i != 0; i--)
+    {
+        *(pt_vec)   = fxp_mul32_Q27((*(pt_vec) + tmp2), *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q27((*(pt_vec) - tmp2), *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q27((*(pt_vec) + tmp2), *(pt_cos++));
+        pt_vec++;
+        *(pt_vec)   = fxp_mul32_Q27((*(pt_vec) - tmp2), *(pt_cos++));
+        pt_vec++;
+    }
+
+    *(pt_vec - 1)   <<= 1;
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; mdct_32
+----------------------------------------------------------------------------*/
+
+void mdct_32(Int32 vec[])
+{
+    Int i;
+    Int32 *pt_vec  = vec;
+    Int32 tmp1, tmp2;
+
+
+    const Int32 *pt_CosTable = CosTable_32;
+
+
+    for (i = 5; i != 0; i--)
+    {
+        *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q31(*(pt_vec) << 1, *(pt_CosTable++));
+        pt_vec++;
+    }
+    for (i = 3; i != 0; i--)
+    {
+        *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++));
+        pt_vec++;
+        *(pt_vec) = fxp_mul32_Q27(*(pt_vec), *(pt_CosTable++));
+        pt_vec++;
+    }
+    *(pt_vec - 1)   <<= 1;
+
+
+    dct_32(vec);
+
+
+    pt_vec  = &vec[31];
+
+    tmp1 = *(pt_vec--);
+
+    for (i = 5; i != 0; i--)
+    {
+        tmp2 = *(pt_vec);
+        *(pt_vec--)  += tmp1;
+        tmp1 = *(pt_vec);
+        *(pt_vec--)  += tmp2;
+        tmp2 = *(pt_vec);
+        *(pt_vec--)  += tmp1;
+        tmp1 = *(pt_vec);
+        *(pt_vec--)  += tmp2;
+        tmp2 = *(pt_vec);
+        *(pt_vec--)  += tmp1;
+        tmp1 = *(pt_vec);
+        *(pt_vec--)  += tmp2;
+    }
+
+    *(pt_vec)  += tmp1;
+
+}
+
+#endif /*  HQ_SBR  */
+
+
+/*----------------------------------------------------------------------------
+; dct_32
+----------------------------------------------------------------------------*/
+
+
+void dct_32(Int32 vec[])
+{
+
+    pv_split(&vec[16]);
+
+    dct_16(&vec[16], 0);
+    dct_16(vec, 1);     // Even terms
+
+    pv_merge_in_place_N32(vec);
+}
+
+#endif  /* AAC_PLUS */
+
+
diff --git a/media/libstagefright/codecs/aacdec/mdst.h b/media/libstagefright/codecs/aacdec/mdst.h
new file mode 100644
index 0000000..5b3e1c9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mdst.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mdst.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef MDST_H
+#define MDST_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    void mdst_32(Int32 vec[], Int32 scratch_mem[]);
+
+    void  dct_32(Int32 vec[]);
+
+    void mdct_32(Int32 vec[]);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* MDST_H */
diff --git a/media/libstagefright/codecs/aacdec/mix_radix_fft.cpp b/media/libstagefright/codecs/aacdec/mix_radix_fft.cpp
new file mode 100644
index 0000000..6081c46
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mix_radix_fft.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mix_radix_fft.c
+ Funtions: mix_radix_fft
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Eliminated pointer dependency ( pData_1) on Buffer address.
+               Modified for-loop to countdown loops.
+
+ Description:  No shift information going in/out from fft_rx4_long.
+
+ Description:
+            (1) Increased precision on the radix 2 fft coeff. (from Q10 to Q12)
+            (2) Increased precision on the input (from 0.5 to 1.0).
+            (3) Eliminated hardly used condition (exp = 0).
+            (4) Change interface to fft_rx4_long, so now the same function is
+                used for forward and inverse calculations.
+
+ Description:  per code review comments, eliminated unnecessary headers
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Data         = Input vector, with quantized spectral with a pre-rotation
+                   by exp(j(2pi/N)(k+1/8))
+                   type Int32 *
+
+    peak_value   = Input, carries the maximum value in input vector "Data"
+                   Output, maximum value computed in the first FFT, used
+                   to set precision on next stages
+                   type Int32 *
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    exponent = shift factor to reflect signal scaling
+
+ Pointers and Buffers Modified:
+    Results are return in "Data"
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    mix_radix_fft() mixes radix-2 and radix-4 FFT. This is needed to be able
+    to use power of 4 length when the input length sequence is a power of 2.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    mix_radix_fft() should support only the FFT for the long window case of
+    the inverse modified cosine transform (IMDCT)
+------------------------------------------------------------------------------
+ REFERENCES
+
+  ------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+   MODIFY( x[] )
+   RETURN( exponent )
+
+------------------------------------------------------------------------------
+ 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 "fft_rx4.h"
+#include "mix_radix_fft.h"
+#include "pv_normalize.h"
+
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void digit_reversal_swapping(Int32 *y, Int32 *x);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Int mix_radix_fft(
+    Int32   *Data,
+    Int32   *peak_value
+)
+
+{
+
+    const Int32     *p_w;
+    Int32   *pData_1;
+    Int32   *pData_2;
+
+    Int32   *pData_3;
+    Int32   *pData_4;
+
+    Int32   exp_jw;
+    Int32   max1;
+    Int32   max2;
+    Int32   temp1;
+    Int32   temp2;
+    Int32   temp3;
+    Int32   temp4;
+    Int32   diff1;
+    Int32   diff2;
+    Int     i;
+    Int   exp;
+
+    max1 = *peak_value;
+    p_w  = w_512rx2;
+
+    pData_1 = Data;
+    pData_3 = Data + HALF_FFT_RX4_LENGTH_FOR_LONG;
+
+
+    /*
+     * normalization to 0.9999 (0x7FFF) guarantees proper operation
+     */
+
+    exp = 8 - pv_normalize(max1);   /* use 24 bits for mix radix fft */
+
+    if (exp < 4)
+    {
+        exp = 4;
+    }
+
+
+    temp1      = (*pData_3);
+    pData_4    = pData_3 + FFT_RX4_LENGTH_FOR_LONG;
+    temp2      = (*pData_4++);
+
+
+
+    diff1      = (temp1  - temp2) >> exp;
+    *pData_3++ = (temp1  + temp2) >> exp;
+
+    temp3      = (*pData_3);
+    temp4      = (*pData_4);
+
+    *pData_4-- = -diff1;
+    *pData_3++ = (temp3  + temp4) >> exp;
+    *pData_4   = (temp3  - temp4) >> exp;
+
+    temp1      = (*pData_1);
+    pData_2    = pData_1 + FFT_RX4_LENGTH_FOR_LONG;
+    temp2      = (*pData_2++);
+    temp4      = (*pData_2);
+
+    *pData_1++ = (temp1  + temp2) >> exp;
+
+    temp3      = (*pData_1);
+    diff1      = (temp1  - temp2) >> exp ;
+
+    *pData_1++ = (temp3  + temp4) >> exp;
+    *pData_2-- = (temp3  - temp4) >> exp;
+    *pData_2   =  diff1;
+
+    temp1      = (*pData_3);
+    pData_4    = pData_3 + FFT_RX4_LENGTH_FOR_LONG;
+    temp2      = (*pData_4++);
+
+
+    for (i = ONE_FOURTH_FFT_RX4_LENGTH_FOR_LONG - 1; i != 0; i--)
+    {
+        /*
+         * radix 2 Butterfly
+         */
+
+        diff1      = (temp1  - temp2) >> (exp - 4);
+        *pData_3++ = (temp1  + temp2) >> exp;
+
+        temp3      = (*pData_3);
+        temp4      = (*pData_4);
+
+        exp_jw     = *p_w++;
+
+
+        diff2      = (temp3  - temp4) >> (exp - 4);
+        *pData_3++ = (temp3  + temp4) >> exp;
+
+        *pData_4-- = -cmplx_mul32_by_16(diff1,  diff2, exp_jw) >> 3;
+        *pData_4   =  cmplx_mul32_by_16(diff2, -diff1, exp_jw) >> 3;
+
+
+        temp1      = (*pData_1);
+        pData_2    = pData_1 + FFT_RX4_LENGTH_FOR_LONG;
+        temp2      = (*pData_2++);
+        temp4      = (*pData_2);
+
+        *pData_1++ = (temp1  + temp2) >> exp;
+
+        temp3      = (*pData_1);
+        diff1      = (temp1  - temp2) >> (exp - 4);
+
+        diff2      = (temp3  - temp4) >> (exp - 4);
+        *pData_1++ = (temp3  + temp4) >> exp;
+
+        *pData_2-- =  cmplx_mul32_by_16(diff2, -diff1, exp_jw) >> 3;
+        *pData_2   =  cmplx_mul32_by_16(diff1,  diff2, exp_jw) >> 3;
+
+        temp1      = (*pData_3);
+        pData_4    = pData_3 + FFT_RX4_LENGTH_FOR_LONG;
+        temp2      = (*pData_4++);
+
+    }/* for i  */
+
+
+    fft_rx4_long(
+        Data,
+        &max1);
+
+
+    fft_rx4_long(
+        &Data[FFT_RX4_LENGTH_FOR_LONG],
+        &max2);
+
+    digit_reversal_swapping(Data, &Data[FFT_RX4_LENGTH_FOR_LONG]);
+
+    *peak_value = max1 | max2;
+
+    return(exp);
+}
+
diff --git a/media/libstagefright/codecs/aacdec/mix_radix_fft.h b/media/libstagefright/codecs/aacdec/mix_radix_fft.h
new file mode 100644
index 0000000..563c280
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/mix_radix_fft.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: mix_radix_fft.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions mix_radix_fft
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MIX_RADIX_FFT_H
+#define MIX_RADIX_FFT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define     FFT_RX4_LENGTH_FOR_LONG         512
+#define     HALF_FFT_RX4_LENGTH_FOR_LONG    (FFT_RX4_LENGTH_FOR_LONG>>1)
+#define     ONE_FOURTH_FFT_RX4_LENGTH_FOR_LONG   (FFT_RX4_LENGTH_FOR_LONG>>2)
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+    Int mix_radix_fft(
+        Int32   *Data,
+        Int32   *peak_value);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* MIX_RADIX_FFT_H */
diff --git a/media/libstagefright/codecs/aacdec/ms_map_mask.h b/media/libstagefright/codecs/aacdec/ms_map_mask.h
new file mode 100644
index 0000000..fbbec78
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ms_map_mask.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ [Describe the contents of the include file.]
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MS_MAP_MASK_H
+#define MS_MAP_MASK_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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 MS_map_mask(
+    FrameInfo  *info,
+    Int        *group,
+    Int        *mask,
+    Int        *cb_map);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/ms_synt.cpp b/media/libstagefright/codecs/aacdec/ms_synt.cpp
new file mode 100644
index 0000000..1f25516
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ms_synt.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ms_synt.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Cleaned up a bit, not finished.
+
+ Description:
+ Copied in code from pns_intensity_right.c, which has the same structure as
+ this file.  Also, merged in code from ms_map_mask.c
+
+ Description:
+ (1) Various optimizations (eliminated extra variables by making use of a
+ single temporary register throughout the code, etc.)
+ (2) Wrote pseudocode, pasted in correct function template, etc.
+
+ Description:  Unrolled loops to get speed up code
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    wins_in_group        = Number of windows in the current group.
+                           [const Int]
+
+    coef_per_win         = Number of coefficients per window.
+                           [const Int]
+
+    num_bands            = Number of scalefactor bands.
+                           [const Int]
+
+    band_length          = Number of coefficients per scalefactor band.
+                           [const Int]
+
+    pFirst_Window_CoefsL = Array containing the spectral coefficients for
+                           the left channel.
+                           [Int32 *, length LN]
+    pFirst_Window_CoefsR = Array containing the spectral coefficients for
+                           the right channel.
+                           [Int32 *, length LN]
+    q_formatLeft         = Array containing the q-format used to encode each
+                           scalefactor band's data on the left channel.
+                           [Int *, length MAXBANDS]
+    q_formatRight        = Array containing the q-format used to encode each
+                           scalefactor band's data on the right channel.
+                           [Int *, length MAXBANDS]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+   pFirst_Window_CoefsL  The coefficients in the group will be modified per the
+                         formula for M/S stereo on each scalefactor band where
+                         M/S stereo is active.
+
+   pFirst_Window_CoefsR  The coefficients in the group will be modified per the
+                         formula for M/S stereo on each scalefactor band where
+                         M/S stereo is active.
+
+   q_formatLeft          The q_format may be modified on scalefactor bands
+                         where M/S stereo is active.
+
+   q_formatRight         The q_format may be modified on scalefactor bands
+                         where M/S stereo is active.
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This module applies the formula for M/S coding to one grouped scalefactor
+ band.  The ISO code has a similar function which applies M/S coding to an
+ entire frame.
+
+ It is the calling function's responsibility to check the map_mask array, which
+ is filled by the function getmask.  If a scalefactor band is identified as
+ using M/S stereo, the coefficients in that array are calculated using
+ the following formula...
+
+ TempLeft = LeftCoefficient;
+
+ LeftCoefficient  = LeftCoefficient  + RightCoefficient;
+ RightCoefficient = TempLeft         - RightCoefficient;
+
+ This function should be inlined if the compiler supports C99 inlining,
+ as this short function is only called by sfb_tools_ms().
+ Therefore, inlining will not increase the code size.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.7.1   M/S stereo
+        Subpart 4.6.2     ScaleFactors
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    start_indx = 0;
+
+    pCoefR = coefLeft;
+    pCoefL = coefRight;
+
+    FOR (win_indx = wins_in_group; win_indx > 0; win_indx--)
+
+
+        tempInt = q_formatLeft[start_indx] - q_formatRight[start_indx];
+
+        IF (tempInt > 0)
+        THEN
+
+            shift_left_chan  = 1 + tempInt;
+            shift_right_chan = 1;
+
+            q_formatLeft[start_indx]  = (q_formatRight[start_indx] - 1);
+            q_formatRight[start_indx] = (q_formatRight[start_indx] - 1);
+
+        ELSE
+            shift_left_chan  = 1;
+            shift_right_chan = 1 - tempInt;
+
+            q_formatRight[start_indx] = (q_formatLeft[start_indx] - 1);
+            q_formatLeft[start_indx]  = (q_formatLeft[start_indx] - 1);
+
+        ENDIF
+
+        FOR (tempInt = band_length; tempInt > 0; tempInt--)
+
+            temp_left  = *(pCoefL) >> shift_left_chan;
+            temp_right = *(pCoefR) >> shift_right_chan;
+
+            *(pCoefL++) = temp_left + temp_right;
+            *(pCoefR++) = temp_left - temp_right;
+
+        ENDFOR
+
+        tempInt = (coef_per_win - band_length);
+
+        pCoefR = pCoefR + tempInt;
+        pCoefL = pCoefL + tempInt;
+
+        start_indx = start_indx + num_bands;
+
+    ENDFOR
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor 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 "pv_audio_type_defs.h"
+#include "ms_synt.h"
+#include "fxp_mul32.h"
+#include "aac_mem_funcs.h"
+#include "window_block_fxp.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 ms_synt(
+    const Int   wins_in_group,
+    const Int   coef_per_win,
+    const Int   num_bands,
+    const Int   band_length,
+    Int32 coefLeft[],
+    Int32 coefRight[],
+    Int q_formatLeft[],
+    Int q_formatRight[])
+{
+
+    Int32 *pCoefL = coefLeft;
+    Int32 *pCoefR = coefRight;
+    Int start_indx = 0;
+
+
+    if (band_length < 0 || band_length > LONG_WINDOW)
+    {
+        return;     /*  avoid any processing on error condition */
+    }
+
+
+    Int nextWinPtrUpdate = (coef_per_win - band_length);
+
+    for (Int win_indx = wins_in_group; win_indx > 0; win_indx--)
+    {
+
+        if (q_formatRight[start_indx] < 31)
+        {
+            Int tempInt = q_formatLeft[start_indx] - q_formatRight[start_indx];
+
+            /* Normalize the left and right channel to the same q-format */
+            if (tempInt > 0)
+            {
+                /*
+                 * shift_left_chan and shift_right_chan each have an offset
+                 * of 1.  Even if the left and right channel share the same
+                 * q-format, we must shift each by 1 to guard against
+                 * overflow.
+                 */
+                Int shift_left_chan  = 1 + tempInt;
+
+                /*
+                 * Following code line is equivalent to...
+                 * q_formatLeft  = q_formatRight - 1;
+                 * q_formatRight = q_formatRight - 1;
+                 */
+                q_formatLeft[start_indx] = --(q_formatRight[start_indx]);
+
+
+                /*
+                 *  band_length is always an even number (check tables in pg.66 IS0 14496-3)
+                 */
+
+                Int32 temp_left  = *(pCoefL) >> shift_left_chan;
+                Int32 temp_right = *(pCoefR) >> 1;
+
+
+
+                for (Int i = band_length; i != 0; i--)
+                {
+                    *(pCoefL++) = temp_left + temp_right;
+                    *(pCoefR++) = temp_left - temp_right;
+                    temp_left  = *(pCoefL) >> shift_left_chan;
+                    temp_right = *(pCoefR) >> 1;
+
+                }
+
+            }
+            else
+            {
+                /*
+                 * shift_left_chan and shift_right_chan each have an offset
+                 * of 1.  Even if the left and right channel share the same
+                 * q-format, we must shift each by 1 to guard against
+                 * overflow.
+                 */
+                Int shift_right_chan = 1 - tempInt;
+
+                /*
+                 * Following code line is equivalent to...
+                 * q_formatRight = q_formatLeft - 1;
+                 * q_formatLeft  = q_formatLeft - 1;
+                 */
+                q_formatRight[start_indx] = --(q_formatLeft[start_indx]);
+
+                /*
+                 *  band_length is always an even number (check tables in pg.66 IS0 14496-3)
+                 */
+
+                Int32 temp_left  = *(pCoefL) >> 1;
+                Int32 temp_right = *(pCoefR) >> shift_right_chan;
+
+                for (Int i = band_length; i != 0; i--)
+                {
+                    *(pCoefL++) = temp_left + temp_right;
+                    *(pCoefR++) = temp_left - temp_right;
+
+                    temp_left  = *(pCoefL) >> 1;
+                    temp_right = *(pCoefR) >> shift_right_chan;
+
+                }
+            }
+
+        }
+        else
+        {
+            /*
+             *  Nothing on right channel, just copy left into right
+             */
+            q_formatRight[start_indx] = (q_formatLeft[start_indx]);
+
+            pv_memcpy(pCoefR, pCoefL, band_length*sizeof(*pCoefR));
+            pCoefR += band_length;
+            pCoefL += band_length;
+        }
+
+        /*
+         * Increment the window pointers so they point
+         * to the next window in the group
+         */
+        pCoefL += nextWinPtrUpdate;
+        pCoefR += nextWinPtrUpdate;
+
+        start_indx += num_bands;
+
+    } /* for (win_indx) */
+
+    return;
+
+} /* MS_synt */
diff --git a/media/libstagefright/codecs/aacdec/ms_synt.h b/media/libstagefright/codecs/aacdec/ms_synt.h
new file mode 100644
index 0000000..a00e6e2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ms_synt.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ms_synt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Updated to reflect new functionality of ms_synt() routine.
+ (ms_synt now only decodes one grouped scalefactor band at a time.)
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes the function declaration for ms_synt().
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef MS_SYNT_H
+#define MS_SYNT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+void ms_synt(
+    const Int   wins_in_group,
+    const Int   coef_per_win,
+    const Int   num_bands,
+    const Int   band_length,
+    Int32 spectralCoefLeft[],
+    Int32 spectralCoefRight[],
+    Int   q_formatLeft[],
+    Int   q_formatRight[]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pns_corr.cpp b/media/libstagefright/codecs/aacdec/pns_corr.cpp
new file mode 100644
index 0000000..4cfe720
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_corr.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pns_corr.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made changes per review comments, the most major of which
+ being the change of the scaling into a 16 x 16 multiply.
+
+ Description: When the multiplication of two 16-bits variables is stored in
+              an 32-bits variable, the result should be typecasted explicitly
+              to Int32 before it is stored.
+              *(pCoefRight++) = (Int32) tempInt2 * multiplier;
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    scale        =  Multiplier used to scale the noise extracted from the left
+                    channel for use on the right.
+                    [const Int]
+
+    coef_per_win =  Number of coefficients per window.
+                    (128 for short, 1024 for long)
+                    [const Int]
+
+    sfb_per_win  =  Number of scalefactors per window.
+                    [const Int]
+
+    wins_in_group = The number of windows in the group being decoded.
+                    [const Int]
+
+    band_length  =  The length of the scalefactor band being decoded.
+                    [const Int]
+
+    sfb_prediction_used =  Flag that denotes the activation of long term
+                           prediction on a per-scalefactor band,
+                           non-grouped basis.
+                           [const Int *, length MAX_SFB]
+
+    q_formatLeft = The Q-format for the left channel's fixed-point spectral
+                   coefficients, on a per-scalefactor band, non-grouped basis.
+                   [const Int]
+
+    q_formatRight = The Q-format for the right channel's fixed-point spectral
+                    coefficients, on a per-scalefactor band, non-grouped basis.
+                    [Int *, length MAX_SFB]
+
+    coefLeft = Array containing the fixed-point spectral coefficients
+               for the left channel.
+               [const Int32 *, length 1024]
+
+    coefRight = Array containing the fixed-point spectral coefficients
+                for the right channel.
+                [Int32 *, length 1024]
+
+ Local Stores/Buffers/Pointers Needed:
+
+ Global Stores/Buffers/Pointers Needed:
+
+ Outputs:
+
+ Pointers and Buffers Modified:
+    pcoefRight  Contains the new spectral information
+
+    q_formatRight       Q-format may be updated with changed to fixed-point
+                        data in coefRight.
+
+    sfb_prediction_used              LTP may be disabled by presence of PNS tool on the
+                        same scalefactor band.
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function derives noise from the left channel.  The PNS tool is assumed
+ to have been used on the same scalefactor band on the left channel.  The
+ noise on the left/right channels are not necessarily of the same amplitude,
+ and therefore have separate scalefactors.  The noise is thus scaled by the
+ difference between the two transmitted scalefactors.  This scaling is done
+ in fixed-point using a constant 4-element table.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.7.1   M/S stereo
+        Subpart 4.6.12.3  Decoding Process (PNS)
+        Subpart 4.6.2     ScaleFactors
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    q_format = q_formatLeft - (scale >> 2);
+    q_format = q_format - 1;
+    q_formatRight = q_format;
+
+    multiplier = hcb2_scale_mod_4[scale & 0x3];
+
+    pCoefLeft = coefLeft;
+    pCoefRight = coefRight;
+
+    start_indx = 0;
+
+    FOR (win_indx = wins_in_group; win_indx > 0; win_indx--)
+
+        q_formatRight[start_indx] = q_format;
+
+        sfb_prediction_used[start_indx] = FALSE;
+
+        start_indx = start_indx + sfb_per_win;
+
+        FOR (tempInt = band_length; tempInt > 0; tempInt--)
+
+            *(pCoefRight) = (*(pCoefLeft) >> 9) * multiplier;
+            pCoefRight = pCoefRight + 1;
+            pCoefLeft = pCoefLeft + 1;
+
+        ENDFOR
+
+        tempInt = (coef_per_win - band_length);
+        pCoefRight = pCoefRight + tempInt;
+        pCoefLeft = pCoefLeft + tempInt;
+
+    ENDFOR
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor 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 "pv_audio_type_defs.h"
+#include "pns_corr.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
+----------------------------------------------------------------------------*/
+
+const UInt hcb2_scale_mod_4[4] =
+{
+    32768,  /* (2.0^0.00)*2^15 */
+    38968,  /* (2.0^0.25)*2^15 */
+    46341,  /* (2.0^0.50)*2^15 */
+    55109
+}; /* (2.0^0.75)*2^15 */
+
+/*----------------------------------------------------------------------------
+; 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 pns_corr(
+    const Int scale,
+    const Int coef_per_win,
+    const Int sfb_per_win,
+    const Int wins_in_group,
+    const Int band_length,
+    const Int q_formatLeft,
+    Int q_formatRight[],
+    const Int32 coefLeft[],
+    Int32 coefRight[])
+{
+    Int tempInt;
+    Int nextWinPtrUpdate;
+
+    Int q_format;
+
+    Int start_indx;
+    Int win_indx;
+
+    const Int32   *pCoefLeft;
+    Int32   *pCoefRight;
+
+    UInt multiplier;
+
+    /*
+     * Generate noise correlated with the noise on the left channel
+     *
+     */
+
+    /*
+     * scale is interpreted as 2^(scale/4)
+     * Therefore, we can adjust the q-format by floor(scale/4)
+     * and save some complexity in the multiplier.
+     */
+    q_format = q_formatLeft - (scale >> 2);
+
+    /*
+     * Reduce the q-format by 1 to guard against overflow.
+     * This must be done because the hcb2_scale_mod_4 table
+     * must be stored in a common q-format, and we must shift
+     * by 16 to get *pCoefLeft into a 16-bit value, but we
+     * cannot store 2^0*2^16 and 2^0.75*2^16 in a table.
+     */
+    q_format--;
+
+    multiplier = hcb2_scale_mod_4[scale & 0x3];
+
+    pCoefLeft  = coefLeft;
+    pCoefRight = coefRight;
+
+    nextWinPtrUpdate = (coef_per_win - band_length);
+
+    /*
+     * Step through all the windows in this group, replacing this
+     * band in each window's spectrum with correlated random noise
+     */
+
+    start_indx = 0;
+
+    for (win_indx = wins_in_group; win_indx > 0; win_indx--)
+    {
+        /*
+         * Set the q-format for all scalefactor bands in the group.
+         * Normally, we could not assume that grouped scalefactors
+         * share the same q-format.
+         * However, here we can make this assumption.  The reason
+         * being -- if this function is called, it is assumed
+         * PNS was used on the left channel.  When PNS is used,
+         * all scalefactors in a group share the same q-format.
+         *
+         */
+        q_formatRight[start_indx] = q_format;
+
+        start_indx += sfb_per_win;
+
+        /* reconstruct right noise values */
+        for (tempInt = band_length; tempInt > 0; tempInt--)
+        {
+            *(pCoefRight++) = (Int32)(*(pCoefLeft++) >> 16) * multiplier;
+        }
+
+        pCoefRight += nextWinPtrUpdate;
+        pCoefLeft  += nextWinPtrUpdate;
+
+    } /* for (win_indx) */
+
+    return;
+
+} /* void pns_corr */
diff --git a/media/libstagefright/codecs/aacdec/pns_corr.h b/media/libstagefright/codecs/aacdec/pns_corr.h
new file mode 100644
index 0000000..c892a8c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_corr.h
@@ -0,0 +1,95 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pns_corr.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Made changes per review comments.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Contains the function declaration for pns_corr.c
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PNS_CORR_H
+#define PNS_CORR_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+void pns_corr(
+    const Int scale,
+    const Int coef_per_win,
+    const Int sfb_per_win,
+    const Int wins_in_group,
+    const Int band_length,
+    const Int q_formatLeft,
+    Int q_formatRight[],
+    const Int32 coefLeft[],
+    Int32 coefRight[]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pns_intensity_right.cpp b/media/libstagefright/codecs/aacdec/pns_intensity_right.cpp
new file mode 100644
index 0000000..f2d50c1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_intensity_right.cpp
@@ -0,0 +1,653 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pns_intensity_right.c
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    hasmask    = mask status for the frame. Enumerated.
+
+    pFrameInfo = Pointer to structure that holds information about each group.
+                 (long block flag, number of windows, scalefactor bands
+                  per group, etc.)
+                 [const pFrameInfo * const]
+
+    group      = Array that contains indexes of the
+                 first window in the next group.
+                 [const Int *, length num_win]
+
+    mask_map   = Array that denotes whether M/S stereo is turned on for
+                 each grouped scalefactor band.
+                 [const Int *, length MAX_SFB]
+
+    codebook_map = Array that denotes which Huffman codebook was used for
+                   the encoding of each grouped scalefactor band.
+                   [const Int *, length MAX_SFB]
+
+    factorsL     =  Array of grouped scalefactors for left chan.
+                    [const Int *, length MAX_SFB]
+
+    factorsR     =  Array of scalefactors for right chan.
+                    [const Int *, length MAX_SFB]
+
+    sfb_prediction_used =  Flag that denotes the activation of long term prediction
+                           on a per-scalefactor band, non-grouped basis.
+                           [const Int *, length MAX_SFB]
+
+    ltp_data_present = Flag that indicates whether LTP is enbaled for this frame.
+                       [const Bool]
+
+    coefLeft = Array containing the fixed-point spectral coefficients
+                       for the left channel.
+                       [Int32 *, length 1024]
+
+    coefRight = Array containing the fixed-point spectral coefficients
+                        for the right channel.
+                        [Int32 *, length 1024]
+
+    q_formatLeft = The Q-format for the left channel's fixed-point spectral
+                   coefficients, on a per-scalefactor band, non-grouped basis.
+                   [Int *, length MAX_SFB]
+
+    q_formatRight = The Q-format for the right channel's fixed-point spectral
+                    coefficients, on a per-scalefactor band, non-grouped basis.
+                    [Int *, length MAX_SFB]
+
+    pCurrentSeed  = Pointer to the current seed for the random number
+                    generator in the function gen_rand_vector().
+                    [Int32 * const]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coefLeft  = Contains the new spectral information.
+
+    coefRight = Contains the new spectral information.
+
+    q_formatLeft      = Q-format may be updated with changed to fixed-point
+                        data in coefLeft.
+
+    q_formatRight     = Q-format may be updated with changed to fixed-point
+                        data in coefRight.
+
+    pCurrentSeed      = Value pointed to by pCurrentSeed updated by calls
+                        to gen_rand_vector().
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function steps through all of the scalefactor bands, looking for
+ either PNS or IS to be enabled on the right channel.
+
+ If the codebook used is >= NOISE_HCB, the code then checks for the use
+ of Huffman codebooks NOISE_HCB, INTENSITY_HCB, or INTENSITY_HCB2.
+
+ When a SFB utilizing the codebook NOISE_HCB is detected, a check is made to
+ see if M/S has also been enabled for that SFB.
+
+ If M/S is not enabled, the band's spectral information is filled with
+ scaled random data.   The scaled random data is generated by the function
+ gen_rand_vector.  This is done across all windows in the group.
+
+ If M/S is enabled, the band's spectral information is derived from the data
+ residing in the same band on the left channel.  The information on the right
+ channel has independent scaling, so this is a bit more involved than a
+ direct copy of the information on the left channel.  This is done by calling
+ the inline function pns_corr().
+
+ When a SFB utilizing an intensity codebook is detected, the band's spectral
+ information is generated from the information on the left channel.
+ This is done across all windows in the group.  M/S being enabled has the
+ effect of reversing the sign of the data on the right channel.  This code
+ resides in the inline function intensity_right().
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.7.1   M/S stereo
+        Subpart 4.6.7.2.3 Decoding Process (Intensity Stereo)
+        Subpart 4.6.12.3  Decoding Process (PNS)
+        Subpart 4.6.2     ScaleFactors
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+    pCoefRight = coefRight;
+    pCoefLeft = coefLeft;
+
+    window_start = 0;
+    tot_sfb = 0;
+    start_indx = 0;
+
+    coef_per_win = pFrameInfo->coef_per_win[0];
+
+    sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+    DO
+        pBand     = pFrameInfo->win_sfb_top[window_start];
+
+        partition = *pGroup;
+        pGroup = pGroup + 1;
+
+        band_start = 0;
+
+        wins_in_group = (partition - window_start);
+
+        FOR (sfb = sfb_per_win; sfb > 0; sfb--)
+
+            band_stop = *(pBand);
+            pBand = pBand + 1;
+
+            codebook = *(pCodebookMap);
+            pCodebookMap = pCodebookMap + 1;
+
+            mask_enabled = *(pMaskMap);
+            pMaskMap = pMaskMap + 1;
+
+            band_length = band_stop - band_start;
+
+            IF (codebook == NOISE_HCB)
+
+                sfb_prediction_used[tot_sfb] &= ltp_data_present;
+
+                IF (sfb_prediction_used[tot_sfb] == FALSE)
+
+                    mask_enabled = mask_enabled AND hasmask;
+
+                    IF (mask_enabled == FALSE)
+
+                        pWindow_CoefR = &(pCoefRight[band_start]);
+
+                        start_indx = tot_sfb;
+
+                        FOR (win_indx = wins_in_group;
+                             win_indx > 0;
+                             win_indx--)
+
+                            CALL
+                            q_formatRight[start_indx] =
+                                 gen_rand_vector(
+                                     pWindow_CoefR,
+                                     band_length,
+                                     pCurrentSeed,
+                                     *(pFactorsRight));
+                            MODIFYING
+                                pCoefRight[band_start]
+                            RETURNING
+                                q_formatRight[start_indx]
+
+                            pWindow_CoefR += coef_per_win;
+
+                            start_indx = start_indx + sfb_per_win;
+
+                        ENDFOR
+
+                    ELSE
+                        CALL
+                        pns_corr(
+                             (*(pFactorsRight) -
+                              *(pFactorsLeft) ),
+                             coef_per_win,
+                             sfb_per_win,
+                             wins_in_group,
+                             band_length,
+                             q_formatLeft[tot_sfb],
+                            &(q_formatRight[tot_sfb]),
+                            &(pCoefLeft[band_start]),
+                            &(pCoefRight[band_start]));
+
+                        MODIFYING
+                            pCoefRightt[band_start]
+                            q_formatRight[tot_sfb]
+                        RETURNING
+                NONE
+                    ENDIF
+
+                ENDIF
+
+            ELSE IF (codebook >= INTENSITY_HCB2)
+
+                mask_enabled = mask_enabled AND hasmask;
+
+                CALL
+                    intensity_right(
+                        *(pFactorsRight),
+                        coef_per_win,
+                        sfb_per_win,
+                        wins_in_group,
+                        band_length,
+                        codebook,
+                        mask_enabled,
+                       &(q_formatLeft[tot_sfb]),
+                       &(q_formatRight[tot_sfb]),
+                       &(pCoefLeft[band_start]),
+                       &(pCoefRight[band_start]));
+
+                MODIFYING
+                    pCoefRightt[band_start]
+                    q_formatRight[tot_sfb]
+                RETURNING
+                    NONE
+
+            ENDIF
+
+            band_start = band_stop;
+
+            tot_sfb = tot_sfb + 1;
+
+        ENDFOR
+
+        coef_per_win = coef_per_win * (wins_in_group);
+
+        wins_in_group = wins_in_group - 1;
+
+        tot_sfb = tot_sfb + sfb_per_win * wins_in_group;
+        pFactorsRight = pFactorsRight + sfb_per_win * wins_in_group;
+        pFactorsLeft  = pFactorsLeft + sfb_per_win * wins_in_group;
+
+        pCoefRight = pCoefRight + coef_per_win;
+        pCoefLeft  = pCoefLeft + coef_per_win;
+
+        window_start = partition;
+
+    WHILE (partition < pFrameInfo->num_win);
+
+    return;
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+   When the code is written for a specific target processor 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 "pv_audio_type_defs.h"
+#include "pns_intensity_right.h"
+#include "e_huffmanconst.h"
+#include "gen_rand_vector.h"
+#include "intensity_right.h"
+#include "pns_corr.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 pns_intensity_right(
+    const Int        hasmask,
+    const FrameInfo * const pFrameInfo,
+    const Int        group[],
+    const Bool       mask_map[],
+    const Int        codebook_map[],
+    const Int        factorsL[],
+    const Int        factorsR[],
+    Int        sfb_prediction_used[],
+    const Bool       ltp_data_present,
+    Int32      coefLeft[],
+    Int32      coefRight[],
+    Int        q_formatLeft[MAXBANDS],
+    Int        q_formatRight[MAXBANDS],
+    Int32 * const pCurrentSeed)
+{
+
+    Int32   *pCoefRight;
+    Int32   *pWindow_CoefR;
+
+    Int32   *pCoefLeft;
+
+    Int     tot_sfb;
+    Int     start_indx;
+    Int     sfb;
+
+    Int     band_length;
+    Int     band_start;
+    Int     band_stop;
+    Int     coef_per_win;
+
+    Int     codebook;
+    Int     partition;
+    Int     window_start;
+
+    Int     sfb_per_win;
+    Int     wins_in_group;
+    Int     win_indx;
+
+    const Int16 *pBand;
+    const Int   *pFactorsLeft  = factorsL;
+    const Int   *pFactorsRight = factorsR;
+    const Int   *pCodebookMap  = codebook_map;
+    const Int   *pGroup        = group;
+    const Bool  *pMaskMap      = mask_map;
+
+    Bool mask_enabled;
+
+    pCoefRight = coefRight;
+    pCoefLeft = coefLeft;
+
+    window_start = 0;
+    tot_sfb = 0;
+    start_indx = 0;
+
+    /*
+     * Each window in the frame should have the same number of coef's,
+     * so coef_per_win is constant in all the loops
+     */
+    coef_per_win = pFrameInfo->coef_per_win[0];
+
+    /*
+     * Because the number of scalefactor bands per window should be
+     * constant for each frame, sfb_per_win can be determined outside
+     * of the loop.
+     *
+     * For 44.1 kHz sampling rate   sfb_per_win = 14 for short windows
+     *                              sfb_per_win = 49 for long  windows
+     */
+
+    sfb_per_win = pFrameInfo->sfb_per_win[0];
+
+    do
+    {
+        pBand     = pFrameInfo->win_sfb_top[window_start];
+
+        /*----------------------------------------------------------
+        Partition is equal to the first window in the next group
+
+        { Group 0    }{      Group 1      }{    Group 2 }{Group 3}
+        [win 0][win 1][win 2][win 3][win 4][win 5][win 6][win 7]
+
+        pGroup[0] = 2
+        pGroup[1] = 5
+        pGroup[2] = 7
+        pGroup[3] = 8
+        -----------------------------------------------------------*/
+        partition = *(pGroup++);
+
+        band_start = 0;
+
+        wins_in_group = (partition - window_start);
+
+        for (sfb = sfb_per_win; sfb > 0; sfb--)
+        {
+            /* band is offset table, band_stop is last coef in band */
+            band_stop = *(pBand++);
+
+            codebook = *(pCodebookMap++);
+
+            mask_enabled = *(pMaskMap++);
+
+            /*
+             * When a tool utilizing sfb is found, apply the correct tool
+             * to that sfb in each window in the group
+             *
+             * Example...  sfb[3] == NOISE_HCB
+             *
+             * [ Group 1                                      ]
+             * [win 0                 ][win 1                 ]
+             * [0][1][2][X][4][5][6][7][0][1][2][X][4][5][6][7]
+             *
+             * The for(sfb) steps through the sfb's 0-7 in win 0.
+             *
+             * Finding sfb[3]'s codebook == NOISE_HCB, the code
+             * steps through all the windows in the group (they share
+             * the same scalefactors) and replaces that sfb with noise.
+             */
+
+            /*
+             * Experimental results suggest that ms_synt is the most
+             * commonly used tool, so check for it first.
+             *
+             */
+
+            band_length = band_stop - band_start;
+
+            if (codebook == NOISE_HCB)
+            {
+                sfb_prediction_used[tot_sfb] &= ltp_data_present;
+
+                if (sfb_prediction_used[tot_sfb] == FALSE)
+                {
+                    /*
+                     * The branch and the logical AND interact in the
+                     * following manner...
+                     *
+                     * mask_enabled == 0 hasmask == X -- gen_rand_vector
+                     * mask_enabled == 1 hasmask == 1 -- pns_corr
+                     * mask_enabled == 0 hasmask == 1 -- gen_rand_vector
+                     * mask_enabled == 1 hasmask == 2 -- gen_rand_vector
+                     * mask_enabled == 0 hasmask == 2 -- gen_rand_vector
+                     */
+
+                    mask_enabled &= hasmask;
+
+                    if (mask_enabled == FALSE)
+                    {
+                        pWindow_CoefR = &(pCoefRight[band_start]);
+
+                        /*
+                         * Step through all the windows in this group,
+                         * replacing this band in each window's
+                         * spectrum with random noise
+                         */
+                        start_indx = tot_sfb;
+
+                        for (win_indx = wins_in_group;
+                                win_indx > 0;
+                                win_indx--)
+                        {
+
+                            /* generate random noise */
+                            q_formatRight[start_indx] =
+                                gen_rand_vector(
+                                    pWindow_CoefR,
+                                    band_length,
+                                    pCurrentSeed,
+                                    *(pFactorsRight));
+
+                            pWindow_CoefR += coef_per_win;
+
+                            start_indx += sfb_per_win;
+                        }
+
+                    }
+                    else
+                    {
+                        pns_corr(
+                            (*(pFactorsRight) -
+                             *(pFactorsLeft)),
+                            coef_per_win,
+                            sfb_per_win,
+                            wins_in_group,
+                            band_length,
+                            q_formatLeft[tot_sfb],
+                            &(q_formatRight[tot_sfb]),
+                            &(pCoefLeft[band_start]),
+                            &(pCoefRight[band_start]));
+
+                    } /* if (mask_map == FALSE) */
+
+                } /* if (sfb_prediction_used[tot_sfb] == FALSE) */
+
+            } /* if (codebook == 0) */
+            else if (codebook >= INTENSITY_HCB2)
+            {
+                /*
+                 * The logical AND flags the inversion of intensity
+                 * in the following manner.
+                 *
+                 * mask_enabled == X hasmask == 0 -- DO NOT INVERT
+                 * mask_enabled == 0 hasmask == X -- DO NOT INVERT
+                 * mask_enabled == 1 hasmask == 1 -- DO     INVERT
+                 * mask_enabled == 0 hasmask == 1 -- DO NOT INVERT
+                 * mask_enabled == 1 hasmask == 2 -- DO NOT INVERT
+                 * mask_enabled == 0 hasmask == 2 -- DO NOT INVERT
+                 */
+
+                mask_enabled &= hasmask;
+
+                intensity_right(
+                    *(pFactorsRight),
+                    coef_per_win,
+                    sfb_per_win,
+                    wins_in_group,
+                    band_length,
+                    codebook,
+                    mask_enabled,
+                    &(q_formatLeft[tot_sfb]),
+                    &(q_formatRight[tot_sfb]),
+                    &(pCoefLeft[band_start]),
+                    &(pCoefRight[band_start]));
+
+            } /* END else codebook must be INTENSITY_HCB or ... */
+
+            band_start = band_stop;
+
+            tot_sfb++;
+
+            pFactorsLeft++;
+            pFactorsRight++;
+
+        } /* for (sfb) */
+
+        /*
+         * Increment pCoefRight and pCoefLeft by
+         * coef_per_win * the number of windows
+         */
+
+        pCoefRight += coef_per_win * wins_in_group;
+        pCoefLeft  += coef_per_win * wins_in_group--;
+
+        /*
+         * Increase tot_sfb by sfb_per_win times the number of windows minus 1.
+         * The minus 1 comes from the fact that tot_sfb is already pointing
+         * to the first sfb in the 2nd window of the group.
+         */
+        tot_sfb += sfb_per_win * wins_in_group;
+
+        pFactorsRight += sfb_per_win * wins_in_group;
+        pFactorsLeft  += sfb_per_win * wins_in_group;
+
+        window_start = partition;
+
+    }
+    while (partition < pFrameInfo->num_win);
+
+    /* pFrameInfo->num_win = 1 for long windows, 8 for short_windows */
+
+    return;
+
+} /* pns_intensity_right() */
+
+
diff --git a/media/libstagefright/codecs/aacdec/pns_intensity_right.h b/media/libstagefright/codecs/aacdec/pns_intensity_right.h
new file mode 100644
index 0000000..7b6f79f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_intensity_right.h
@@ -0,0 +1,106 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pns_intensity_right.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Add hasmask parameter
+
+ Description: Changed name to from right_ch_sfb_tools_ms to intensity_right
+ to more correct reflect the purpose of the function.
+
+ Who:                                  Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the function declaration for
+ pns_intensity_right.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PNS_INTENSITY_RIGHT_H
+#define PNS_INTENSITY_RIGHT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_frameinfo.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
+----------------------------------------------------------------------------*/
+void pns_intensity_right(
+    const Int        hasmask,
+    const FrameInfo * const pFrameInfo,
+    const Int        group[],
+    const Bool       mask_map[],
+    const Int        codebook_map[],
+    const Int        factorsL[],
+    const Int        factorsR[],
+    Int        sfb_prediction_used[],
+    const Bool       ltp_data_present,
+    Int32      spectralCoefLeft[],
+    Int32      spectralCoefRight[],
+    Int        q_formatLeft[MAXBANDS],
+    Int        q_formatRight[MAXBANDS],
+    Int32     * const pCurrentSeed);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pns_left.cpp b/media/libstagefright/codecs/aacdec/pns_left.cpp
new file mode 100644
index 0000000..2446de2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_left.cpp
@@ -0,0 +1,431 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+ Pathname: pns_left.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Brought code in-line with PV standards.
+               Merged PNS and Intensity blocks into one function.
+               Modified routine to interface with a fixed-point implementation.
+               Modified variable names for clarity.
+               Improved for-loop structure that was previously checking
+               the codebook used in each scale factor band multiple times.
+
+ Description:  Added some comments for clarity.
+
+ Description:  Changed strategy for q-format.  Q-format for SFBs should not
+ be grouped.
+
+ Description: Function had to be modified to obey new interpretation of the
+ sfb_prediction_used flag.  LTP takes precedence, and PNS should not be
+ executed when a collision occurs between these two tools.
+
+ Description:
+ (1) Added flag "ltp_data_present"
+ (2) Where feasible, I updated the code to resemble right_ch_sfb_tools_ms.c
+     Just for conformance, readability.
+
+ Description: Added include file - "e_huffmanconst.h"
+
+ Description: The same "Factors" pointer indexing problem that existed in
+ right_ch_sfb_tools_ms also existed here in pns_left.c
+
+ Description:  Modified how groups and windows are handled, as the multigroup
+ case was not correct
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    const FrameInfo *pFrameInfo         = Pointer to structure that holds
+                                          information about each group.
+                                          (long block flag,
+                                           number of windows,
+                                           scalefactor bands per group, etc.)
+
+    const Int        group[]            = Array that contains indexes of the
+                                          the first window in the next group.
+
+    const Int        codebook_map[]     = Array that denotes which Huffman
+                                          codebook was used for the encoding
+                                          of each scalefactor band.
+
+    const Int        factors[]          = Array of scalefactors
+
+    Int              sfb_prediction_used[] = Flag that denotes the activation
+                                             of long term prediction on a sfb
+                                             basis.
+
+    Bool             ltp_data_present   = Flag that denotes whether LTP
+                                          is active for the entire frame.  If
+                                          this flag is FALSE,
+                                          sfb_prediction_used is garbage.
+
+    Int32            spectral_coef[]    = Array of pointers pointing to the
+                                          spectral coef's for the LEFT channel.
+
+    Int              q_format[]           = Q-format for the information
+                                            pointed to by spectral_coef.
+                                            Indexed by scalefactor band.
+
+    Int32           *pCurrentSeed         = Pointer to the current seed for the
+                                            random number generator.
+                                            (gen_rand_vector)
+
+ Local Stores/Buffers/Pointers Needed:
+
+ Global Stores/Buffers/Pointers Needed:
+
+ Outputs:
+
+ Pointers and Buffers Modified:
+    Int32  spectral_coef[]    =   Contains the new spectral information
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ The function steps through each scalefactor band in the group, and
+ checks for the use of Huffman codebook NOISE_HCB.
+
+ When a SFB utilizing NOISE_HCB is detected, the band in every window in the
+ group has its spectral information filled with scaled random data.
+
+ The scaled random data is generated by the function gen_rand_vector.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This module shall replace bands that were encoded with the Huffman codebook
+ NOISE_HCB with random noise as returned from gen_rand_vector().  The result
+ shall be perceptually indistinguishable from the result obtained by the
+ ISO decoder.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.5.5   Figures
+        Subpart 4.6.2   ScaleFactors
+        Subpart 4.6.12  Perceptual Noise Substituion (PNS)
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pFirst_Window_Coefs = spectral_coef;
+
+    window_start = 0;
+
+    tot_sfb = 0;
+
+    DO
+
+        num_bands = pFrameInfo->sfb_per_win[window_start];
+        pBand     = pFrameInfo->win_sfb_top[window_start];
+
+        partition = *(pGroup);
+        pGroup = pGroup + 1;
+
+        band_start = 0;
+
+        coef_per_win = pFrameInfo->coef_per_win[window_start];
+
+        wins_in_group = (partition - window_start);
+
+        FOR (sfb = num_bands; sfb > 0; sfb--)
+
+            band_stop = *pBand;
+            pBand = pBand + 1;
+
+            IF (*(pCodebookMap++) == NOISE_HCB )
+
+                tempInt = sfb_prediction_used[tot_sfb] AND ltp_data_present;
+
+                IF (tempInt == FALSE)
+
+                    pWindow_Coef = pFirst_Window_Coefs + band_start;
+
+                    band_length = (band_stop - band_start);
+
+                    start_indx = tot_sfb;
+
+                    tempInt = *(pFactors);
+
+                    FOR (win_indx = wins_in_group; win_indx > 0; win_indx--)
+
+                        CALL gen_rand_vector( pWindow_CoefR,
+                                              band_length,
+                                              pCurrentSeed,
+                                              tempInt);
+
+                        MODIFYING pWindow_CoefR = scaled random noise
+                                  pCurrentSeed  = current state of the random
+                                                  noise generator.
+
+                        RETURNING q_format[start_indx] = q-format for this sfb.
+
+                        pWindow_Coef = pWindow_Coef + coef_per_win;
+
+                        start_indx = start_indx +
+                                     pFrameInfo->sfb_per_win[win_indx];
+
+                    ENDFOR
+
+                ENDIF
+
+            ENDIF
+
+            band_start = band_stop;
+
+            tot_sfb = tot_sfb + 1;
+
+            pFactors = pFactors + 1;
+
+        ENDFOR
+
+        coef_per_win = coef_per_win * wins_in_group;
+        wins_in_group = wins_in_group - 1;
+
+        tot_sfb = tot_sfb + num_bands * wins_in_group;
+        pFactors = pFactors + num_bands * wins_in_group;
+
+        pFirst_Window_Coefs = pFirst_Window_Coefs + coef_per_win;
+
+        window_start = partition;
+
+    WHILE (partition < pFrameInfo->num_win);
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "pns_left.h"
+#include "e_huffmanconst.h"
+#include "gen_rand_vector.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 pns_left(
+    const FrameInfo *pFrameInfo,
+    const Int        group[],
+    const Int        codebook_map[],
+    const Int        factors[],
+    const Int        sfb_prediction_used[],
+    const Bool       ltp_data_present,
+    Int32      spectral_coef[],
+    Int        q_format[],
+    Int32     *pCurrentSeed)
+{
+
+    Int     tot_sfb;
+    Int     start_indx;
+
+    Int     sfb;
+    Int     band_stop;
+
+    const Int16  *pBand;
+
+    const Int *pCodebookMap = &(codebook_map[0]);
+    const Int *pGroup   = &(group[0]);
+    const Int *pFactors = &(factors[0]);
+
+    Int     tempInt;
+    Int32  *pWindow_Coef;
+
+
+    Int32   *spec;
+
+    Int partition;
+    Int win_indx;
+
+    tot_sfb = 0;
+
+    spec = spectral_coef;
+
+    /* PNS goes by group */
+    win_indx = 0;
+    partition = 0;
+    do
+    {
+        Int num_bands = pFrameInfo->sfb_per_win[partition];
+        pBand = pFrameInfo->win_sfb_top[partition];
+
+        /*----------------------------------------------------------
+        Partition is equal to the first window in the next group
+
+        { Group 0    }{      Group 1      }{    Group 2 }{Group 3}
+        [win 0][win 1][win 2][win 3][win 4][win 5][win 6][win 7]
+
+        pGroup[0] = 2
+        pGroup[1] = 5
+        pGroup[2] = 7
+        pGroup[3] = 8
+        -----------------------------------------------------------*/
+
+        partition = *pGroup++;      /* partition = index of last sbk in group */
+
+        do
+        {
+            Int band_start = 0;
+            for (sfb = 0; sfb < num_bands; sfb++)
+            {
+                band_stop = pBand[sfb]; /* band is offset table, band_stop is last coef in band */
+
+                Int band_length =  band_stop - band_start;
+                if (pCodebookMap[sfb] == NOISE_HCB)
+                {
+
+                    tempInt = sfb_prediction_used[tot_sfb] & ltp_data_present;
+
+                    if (tempInt == FALSE)
+                    {
+                        /* generate random noise */
+                        pWindow_Coef = spec + band_start;
+
+                        tempInt = pFactors[sfb];
+
+                        start_indx = tot_sfb++;
+
+                        /* reconstruct noise substituted values */
+                        /* generate random noise */
+
+                        q_format[start_indx] = gen_rand_vector(pWindow_Coef,
+                                                               band_length,
+                                                               pCurrentSeed,
+                                                               tempInt);
+
+                    }   /* if (sfb_prediction_used[tot_sfb] == FALSE) */
+
+                }   /* if (*(pCodebookMap++) == NOISE_HCB) */
+                else
+                {
+                    tot_sfb ++;     /*  update absolute sfb counter  */
+                }
+
+                band_start = band_stop;
+
+            }   /* for (sfb) */
+
+            spec += pFrameInfo->coef_per_win[win_indx++];
+            pFactors += num_bands;
+
+        }
+        while (win_indx < partition);
+
+        pCodebookMap += pFrameInfo->sfb_per_win[win_indx-1];
+
+    }
+    while (partition < pFrameInfo->num_win);
+
+
+    return;
+
+} /* pns */
diff --git a/media/libstagefright/codecs/aacdec/pns_left.h b/media/libstagefright/codecs/aacdec/pns_left.h
new file mode 100644
index 0000000..c44b13c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pns_left.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pns_left.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Removed #defines of LEFT and RIGHT, and the extra include
+ file "e_huffmanconst.h"
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Contains the function definition for pns_left.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PNS_LEFT_H
+#define PNS_LEFT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_frameinfo.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pns_left(
+        const FrameInfo *pFrameInfo,
+        const Int        group[],
+        const Int        codebook_map[],
+        const Int        factors[],
+        const Int        sfb_prediction_used[],
+        const Bool       ltp_data_present,
+        Int32      spectral_coef[],
+        Int        q_format[],
+        Int32     *pCurrentSeed);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
+
+
+
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.cpp b/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.cpp
new file mode 100644
index 0000000..48432f8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.cpp
@@ -0,0 +1,311 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_all_pass_filter_coeff.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Decorrelation is achieved by means of all-pass filtering
+
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "pv_audio_type_defs.h"
+#include    "s_ps_dec.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_all_pass_fract_delay_filter.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
+----------------------------------------------------------------------------*/
+
+
+const Int16 aRevLinkDecaySerCoeff[NO_ALLPASS_CHANNELS][NO_SERIAL_ALLPASS_LINKS] =
+{
+
+
+    { Qfmt15(0.74915491616071f),  Qfmt15(0.64942584030892f),  Qfmt15(0.56297290849050f) },
+    { Qfmt15(0.71658296328416f),  Qfmt15(0.62118993420853f),  Qfmt15(0.53849582551265f) },
+    { Qfmt15(0.68401101040761f),  Qfmt15(0.59295402810815f),  Qfmt15(0.51401874253480f) },
+    { Qfmt15(0.65143905753106f),  Qfmt15(0.56471812200776f),  Qfmt15(0.97908331911390f) },      /*  3  */
+    { Qfmt15(0.61886710465450f),  Qfmt15(0.53648221590737f),  Qfmt15(0.93012915315822f) },
+    { Qfmt15(0.58629515177795f),  Qfmt15(0.50824630980698f),  Qfmt15(0.88117498720252f) },
+    { Qfmt15(0.55372319890140f),  Qfmt15(0.48001040370660f),  Qfmt15(0.83222082124682f) },
+    { Qfmt15(0.52115124602484f),  Qfmt15(0.45177449760621f),  Qfmt15(0.78326665529112f) },
+    { Qfmt15(0.48857929314829f),  Qfmt15(0.42353859150582f),  Qfmt15(0.73431248933542f) },
+    { Qfmt15(0.45600734027174f),  Qfmt15(0.39530268540543f),  Qfmt15(0.68535832337974f) },
+    { Qfmt15(0.42343538739519f),  Qfmt15(0.36706677930504f),  Qfmt15(0.63640415742404f) },
+    { Qfmt15(0.39086343451863f),  Qfmt15(0.33883087320466f),  Qfmt15(0.58744999146834f) },
+    { Qfmt15(0.35829148164208f),  Qfmt15(0.31059496710427f),  Qfmt15(0.53849582551265f) },
+    { Qfmt15(0.32571952876553f),  Qfmt15(0.28235906100388f),  Qfmt15(0.48954165955695f) },
+    { Qfmt15(0.29314757588898f),  Qfmt15(0.25412315490349f),  Qfmt15(0.44058749360126f) },
+    { Qfmt15(0.26057562301242f),  Qfmt15(0.22588724880310f),  Qfmt15(0.39163332764556f) },
+    { Qfmt15(0.22800367013587f),  Qfmt15(0.19765134270272f),  Qfmt15(0.34267916168986f) },
+    { Qfmt15(0.19543171725932f),  Qfmt15(0.16941543660233f),  Qfmt15(0.29372499573418f) },
+    { Qfmt15(0.16285976438276f),  Qfmt15(0.14117953050194f),  Qfmt15(0.24477082977848f) },
+    { Qfmt15(0.13028781150621f),  Qfmt15(0.11294362440155f),  Qfmt15(0.19581666382278f) },
+    { Qfmt15(0.09771585862966f),  Qfmt15(0.08470771830116f),  Qfmt15(0.14686249786708f) },
+    { Qfmt15(0.06514390575311f),  Qfmt15(0.05647181220078f),  Qfmt15(0.09790833191140f) },
+    { Qfmt15(0.03257195287655f),  Qfmt15(0.02823590610039f),  Qfmt15(0.04895416595570f) }
+
+};
+
+
+
+
+
+const Char groupBorders[NO_IID_GROUPS + 1] =
+{
+    4,  5,  0,  1,  2,  3,  7,  6,   8,  9,  3,  4,
+    5,  6,  7,  8,  9,  11, 14, 18, 23, 35, 64
+};
+
+const Char bins2groupMap[NO_IID_GROUPS] =
+{
+    1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
+};
+
+
+
+
+/*
+ *  q_phi = 0.39
+ *
+ *  cos(pi*([3:22]+0.5)*q_phi)
+ */
+
+
+/*
+ *  sin(-pi*([3:22]+0.5)*q_phi)
+ */
+
+
+const Int32 aFractDelayPhaseFactor[NO_QMF_ALLPASS_CHANNELS] =
+{
+    0xCB5474A9,  0x5BEC5914, 0x72F3C7B0, 0xF1F480C6, 0x8389E21E,
+    0xB9BA6AFC,  0x4CDB665C, 0x7A57DA5D, 0x06088024, 0x89BECF04,
+    0xA9DB5EAC,  0x3BE5711F, 0x7EB9EDF7, 0x19F582A9, 0x92DDBD1F,
+    0x9C1B5008,  0x29767919, 0x7FFC0203, 0x2D3F8843, 0x9EABACDF
+};
+
+/*
+ *  q(m) = { 0.43, 0.75, 0.347 }
+ *
+ *  cos(pi*([3:22]+0.5)*q(m))        cos(pi*([3:22]+0.5)'*q)
+ *
+ *  sin(-pi*([3:22]+0.5)*q(m))
+ *
+ */
+
+
+const Int32 aaFractDelayPhaseFactorSerQmf[NO_QMF_ALLPASS_CHANNELS][3] =
+{
+    { 0x02037FFC,  0xCF0489BE, 0x9BFB4FE0 },
+    { 0x7D5719F5,  0xCF047642, 0x18947D9E },
+    { 0x34AD8B57,  0x7642CF04, 0x7ABF244A },
+    { 0x99A4B325,  0x89BECF04, 0x58EFA3F1 },
+    { 0x9EAB5321,  0x30FC7642, 0xD77E8694 },
+    { 0x3BE5711F,  0x30FC89BE, 0x819CEBC7 },
+    { 0x7B77DE39,  0x89BE30FC, 0xB3A166B8 },
+    { 0xF9F88024,  0x764230FC, 0x37C57336 },
+    { 0x81E8E9FE,  0xCF0489BE, 0x7FF103D2 },
+    { 0xCF047642,  0xCF047642, 0x3E8B9052 },
+    { 0x68B9499A,  0x7642CF04, 0xB9E594E8 },
+    { 0x5EACA9DB,  0x89BECF04, 0x80A00CA5 },
+    { 0xC09590D1,  0x30FC7642, 0xD05276CA },
+    { 0x85A925A3,  0x30FC89BE, 0x53486134 },
+    { 0x0A0B7F9B,  0x89BE30FC, 0x7CB2E319 },
+    { 0x7EB91209,  0x764230FC, 0x20078412 },
+    { 0x2D3F8843,  0xCF0489BE, 0xA0ECAA4D },
+    { 0x9504B9BA,  0xCF047642, 0x880D2CAE },
+    { 0xA4145914,  0x7642CF04, 0xF0287F04 },
+    { 0x42E16D23,  0x89BECF04, 0x694C48C7 }
+};
+
+/*
+ *  Fractional delay vector
+ *
+ *  phi_fract(k) = exp(-j*pi*q_phi*f_center(k))       0<= k <= SUBQMF_GROUPS
+ *
+ *  q_phi = 0.39
+ *  f_center(k) frequency vector
+ *
+ *
+ *  f_center(k) = {0.5/4,  1.5/4,  2.5/4,  3.5/4,
+ *                -1.5/4, -0.5/4,
+ *                 3.5/2,  2.5/2,  4.5/2,  5.5/2};
+ */
+
+
+
+const Int32 aFractDelayPhaseFactorSubQmf[SUBQMF_GROUPS] =
+{
+    0x7E80EC79,  0x72BAC73D, 0x5C45A749, 0x3D398F97, 0x72BA38C3,
+    0x7E801387,  0xBA919478, 0x05068019, 0x895DCFF2, 0x834E1CE7,
+};
+
+
+
+
+
+/*
+ *  Fractional delay length matrix
+ *
+ *  Q_fract(k,m) = exp(-j*pi*q(m)*f_center(k))
+ *
+ *  q(m) = { 0.43, 0.75, 0.347 }
+ *  f_center(k) frequency vector
+ *
+ *
+ *  f_center(k) = { 0.5/4,  1.5/4,  2.5/4,  3.5/4,
+ *                 -1.5/4, -0.5/4,
+ *                  3.5/2,  2.5/2,  4.5/2,  5.5/2};
+ */
+
+const Int32 aaFractDelayPhaseFactorSerSubQmf[SUBQMF_GROUPS][3] =
+{
+
+    { 0x7E2EEA7D,  0x7A7DDAD8, 0x7ED0EE9D },
+    { 0x6FEDC1E5,  0x51349D0E, 0x7574CD1E },
+    { 0x5506A052,  0x0C8C809E, 0x636CAF62 },
+    { 0x3085898D,  0xC3A98F1D, 0x4A0D9799 },
+    { 0x6FED3E1B,  0x513462F2, 0x757432E2 },
+    { 0x7E2E1583,  0x7A7D2528, 0x7ED01163 },
+    { 0xA4C8A634,  0xB8E36A6E, 0xD5AF8732 },
+    { 0xF0F580E3,  0x8276E707, 0x1A7382C3 },
+    { 0x80ABF2F4,  0x471D6A6E, 0x9D2FAEA4 },
+    { 0x9478456F,  0x7D8AE707, 0x8152EDAB }
+};
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.h b/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.h
new file mode 100644
index 0000000..0358acb
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_all_pass_filter_coeff.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_all_pass_filter_coeff.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for all pass filter coefficients
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_ALL_PASS_FILTER_COEFF_H
+#define PS_ALL_PASS_FILTER_COEFF_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+
+
+extern const Char groupBorders[NO_IID_GROUPS + 1];
+extern const Int16 aRevLinkDecaySerCoeff[NO_ALLPASS_CHANNELS][NO_SERIAL_ALLPASS_LINKS];
+extern const Int32  aRevLinkDelaySer[];
+extern const Int16 aFractDelayPhaseFactorReQmf[NO_QMF_ALLPASS_CHANNELS];
+extern const Int16 aFractDelayPhaseFactorImQmf[NO_QMF_ALLPASS_CHANNELS];
+/* the old center frequencies (found in "else") were too small (factor 1/2) */
+extern const Int16 aFractDelayPhaseFactorReSubQmf[SUBQMF_GROUPS];
+extern const Int16 aFractDelayPhaseFactorImSubQmf[SUBQMF_GROUPS];
+extern const Int32 aFractDelayPhaseFactorSubQmf[SUBQMF_GROUPS];
+extern const Int32 aFractDelayPhaseFactor[NO_QMF_ALLPASS_CHANNELS];
+extern const Int32 aaFractDelayPhaseFactorSerQmf[NO_QMF_ALLPASS_CHANNELS][3];
+extern const Int32 aaFractDelayPhaseFactorSerSubQmf[SUBQMF_GROUPS][3];
+extern const Char bins2groupMap[NO_IID_GROUPS];
+extern const Int32 aaFractDelayPhaseFactorSerReQmf[NO_QMF_ALLPASS_CHANNELS][3];
+extern const Int32 aaFractDelayPhaseFactorSerImQmf[NO_QMF_ALLPASS_CHANNELS][3];
+extern const Int32 aaFractDelayPhaseFactorSerReSubQmf[SUBQMF_GROUPS][3];
+extern const Int32 aaFractDelayPhaseFactorSerImSubQmf[SUBQMF_GROUPS][3];
+
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_ALL_PASS_FILTER_COEFF_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.cpp b/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.cpp
new file mode 100644
index 0000000..81761a6
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.cpp
@@ -0,0 +1,391 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_all_pass_fract_delay_filter.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Decorrelation
+  Decorrelation is achieved by means of all-pass filtering and delaying
+  Sub-band samples s_k(n) are converted into de-correlated sub-bands samples
+  d_k(n). k index for frequency, n time index
+
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+  Delay is introduced to compensate QMF bands not passed through Hybrid
+  Analysis
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "pv_audio_type_defs.h"
+#include    "ps_decorrelate.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_pwr_transient_detection.h"
+#include    "ps_all_pass_fract_delay_filter.h"
+#include    "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+/*
+ *  For lower subbands
+ *  Apply all-pass filtering
+ *
+ */
+
+
+void ps_all_pass_fract_delay_filter_type_I(UInt32 *delayBufIndex,
+        Int32 sb_delay,
+        const Int32 *ppFractDelayPhaseFactorSer,
+        Int32 ***pppRealDelayRBufferSer,
+        Int32 ***pppImagDelayRBufferSer,
+        Int32 *rIn,
+        Int32 *iIn)
+{
+
+    Int32 cmplx;
+    Int16 rTmp0;
+    Int32 rTmp;
+    Int32 iTmp;
+    Int32 *pt_rTmp;
+    Int32 *pt_iTmp;
+
+
+
+    /*
+     *  All pass filters
+     *                         2
+     *                        ___  Q_fract(k,m)*z^(-d(m))  -  a(m)*g_decay_slope(k)
+     *   z^(-2)*phi_fract(k)* | |  ------------------------------------------------
+     *                        m=0  1  - a(m)*g_decay_slope(k)*Q_fract(k,m)*z^(-d(m))
+     *
+     *
+     *    Fractional delay matrix:
+     *
+     *    Q_fract(k,m) = exp(-j*pi*q(m)*f_center(k))       0<= k <= SUBQMF_GROUPS
+     *
+     *    Vectors: a(m), q(m), d(m) are constants
+     *
+     *    m                              m     0       1       2
+     *                                 -------------------------------
+     *    delay length                 d(m) == 3       4       5      (Fs > 32 KHz)
+     *    fractional delay length      q(m) == 0.43    0.75    0.347
+     *    filter coefficient           a(m) == 0.65144 0.56472 0.48954
+     *
+     *             g_decay_slope(k) is given
+     */
+
+
+    Int32 tmp_r;
+    Int32 tmp_i;
+
+    pt_rTmp = &pppRealDelayRBufferSer[0][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[0][*(delayBufIndex++)][sb_delay];
+
+    cmplx  = *(ppFractDelayPhaseFactorSer++);        /* Q_fract(k,m)  */
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = Qfmt15(0.65143905753106f);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+
+
+    iTmp     =  fxp_mac32_by_16(-*iIn << 1, rTmp0, iTmp);  /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp << 1, rTmp0, *iIn);   /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn << 1, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp << 1, rTmp0, *rIn);
+
+    *rIn = rTmp;
+
+    pt_rTmp = &pppRealDelayRBufferSer[1][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[1][*(delayBufIndex++)][sb_delay];
+
+
+
+    cmplx  = *(ppFractDelayPhaseFactorSer++);        /* Q_fract(k,m)  */
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = Qfmt15(0.56471812200776f);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+
+
+    iTmp     =  fxp_mac32_by_16(-*iIn << 1, rTmp0, iTmp);  /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp << 1, rTmp0, *iIn);   /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn << 1, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp << 1, rTmp0, *rIn);
+    *rIn = rTmp;
+
+    pt_rTmp = &pppRealDelayRBufferSer[2][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[2][*(delayBufIndex)][sb_delay];
+
+
+    cmplx  = *(ppFractDelayPhaseFactorSer);        /* Q_fract(k,m)  */
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = Qfmt15(0.97908331911390f);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+
+
+    iTmp     =  fxp_mac32_by_16(-*iIn, rTmp0, iTmp);    /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp, rTmp0, *iIn);     /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp << 2;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp, rTmp0, *rIn);
+    *rIn = rTmp << 2;
+}
+
+
+void ps_all_pass_fract_delay_filter_type_II(UInt32 *delayBufIndex,
+        Int32 sb_delay,
+        const Int32 *ppFractDelayPhaseFactorSer,
+        Int32 ***pppRealDelayRBufferSer,
+        Int32 ***pppImagDelayRBufferSer,
+        Int32 *rIn,
+        Int32 *iIn,
+        Int32 decayScaleFactor)
+{
+
+    Int32 cmplx;
+    Int16 rTmp0;
+    Int32 rTmp;
+    Int32 iTmp;
+    Int32 *pt_rTmp;
+    Int32 *pt_iTmp;
+    const Int16 *pt_delay;
+
+
+
+    /*
+     *  All pass filters
+     *                         2
+     *                        ___  Q_fract(k,m)*z^(-d(m))  -  a(m)*g_decay_slope(k)
+     *   z^(-2)*phi_fract(k)* | |  ------------------------------------------------
+     *                        m=0  1  - a(m)*g_decay_slope(k)*Q_fract(k,m)*z^(-d(m))
+     *
+     *
+     *    Fractional delay matrix:
+     *
+     *    Q_fract(k,m) = exp(-j*pi*q(m)*f_center(k))       0<= k <= SUBQMF_GROUPS
+     *
+     *    Vectors: a(m), q(m), d(m) are constants
+     *
+     *    m                              m     0       1       2
+     *                                 -------------------------------
+     *    delay length                 d(m) == 3       4       5      (Fs > 32 KHz)
+     *    fractional delay length      q(m) == 0.43    0.75    0.347
+     *    filter coefficient           a(m) == 0.65144 0.56472 0.48954
+     *
+     *             g_decay_slope(k) is given
+     */
+
+
+    Int32 tmp_r;
+    Int32 tmp_i;
+
+    pt_rTmp = &pppRealDelayRBufferSer[0][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[0][*(delayBufIndex++)][sb_delay];
+
+    cmplx  = *(ppFractDelayPhaseFactorSer++);        /* Q_fract(k,m)  */
+    pt_delay = aRevLinkDecaySerCoeff[decayScaleFactor];
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = *(pt_delay++);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+
+
+    iTmp     =  fxp_mac32_by_16(-*iIn << 1, rTmp0, iTmp);  /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp << 1, rTmp0, *iIn);   /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn << 1, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp << 1, rTmp0, *rIn);
+    *rIn = rTmp;
+
+    pt_rTmp = &pppRealDelayRBufferSer[1][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[1][*(delayBufIndex++)][sb_delay];
+
+
+    cmplx  = *(ppFractDelayPhaseFactorSer++);        /* Q_fract(k,m)  */
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = *(pt_delay++);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+    iTmp     =  fxp_mac32_by_16(-*iIn << 1, rTmp0, iTmp);  /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp << 1, rTmp0, *iIn);   /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn << 1, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp << 1, rTmp0, *rIn);
+    *rIn = rTmp;
+
+    pt_rTmp = &pppRealDelayRBufferSer[2][*(delayBufIndex)][sb_delay];
+    pt_iTmp = &pppImagDelayRBufferSer[2][*(delayBufIndex)][sb_delay];
+
+
+    cmplx  = *(ppFractDelayPhaseFactorSer);        /* Q_fract(k,m)  */
+    tmp_r = *pt_rTmp << 1;
+    tmp_i = *pt_iTmp << 1;
+
+    rTmp = cmplx_mul32_by_16(tmp_r, -tmp_i,  cmplx);
+    rTmp0  = *(pt_delay);
+    iTmp = cmplx_mul32_by_16(tmp_i,  tmp_r,  cmplx);
+
+
+    iTmp     =  fxp_mac32_by_16(-*iIn, rTmp0, iTmp);    /* Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n) */
+    *pt_iTmp =  fxp_mac32_by_16(iTmp, rTmp0, *iIn);     /* y(n) = x(n) + a(m)*g_decay_slope(k)*( Q_fract(k,m)*y(n-1) - a(m)*g_decay_slope(k)*x(n)) */
+    *iIn = iTmp << 2;
+
+    rTmp     =  fxp_mac32_by_16(-*rIn, rTmp0, rTmp);
+    *pt_rTmp =  fxp_mac32_by_16(rTmp, rTmp0, *rIn);
+    *rIn = rTmp << 2;
+
+}
+
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.h b/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.h
new file mode 100644
index 0000000..b4e9876
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_all_pass_fract_delay_filter.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_all_pass_fract_delay_filter.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_all_pass_fract_delay_filter()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_ALL_PASS_FRACT_DELAY_FILTER_H
+#define PS_ALL_PASS_FRACT_DELAY_FILTER_H
+
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define R_SHIFT     29
+#define Q29_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+    void ps_all_pass_fract_delay_filter_type_I(UInt32 *delayBufIndex,
+    Int32 sb_delay,
+    const Int32 *ppFractDelayPhaseFactorSer,
+    Int32 ***pppRealDelayRBufferSer,
+    Int32 ***pppImagDelayRBufferSer,
+    Int32 *rIn,
+    Int32 *iIn);
+
+
+    void ps_all_pass_fract_delay_filter_type_II(UInt32 *delayBufIndex,
+            Int32 sb_delay,
+            const Int32 *ppFractDelayPhaseFactorSer,
+            Int32 ***pppRealDelayRBufferSer,
+            Int32 ***pppImagDelayRBufferSer,
+            Int32 *rIn,
+            Int32 *iIn,
+            Int32 decayScaleFactor);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_ALL_PASS_FRACT_DELAY_FILTER_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_allocate_decoder.cpp b/media/libstagefright/codecs/aacdec/ps_allocate_decoder.cpp
new file mode 100644
index 0000000..ab15651
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_allocate_decoder.cpp
@@ -0,0 +1,341 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_allocate_decoder.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Reuses AAC+ HQ right channel, which is not used when PS is enabled
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef HQ_SBR
+
+#ifdef PARAMETRICSTEREO
+
+#include    "s_sbr_channel.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_hybrid_filter_bank_allocation.h"
+#include    "s_ps_dec.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_allocate_decoder.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     30
+#define Q30_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const Int32  aRevLinkDelaySer[] = {3,  4,  5};
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int32 ps_allocate_decoder(SBRDECODER_DATA *self,
+                          UInt32  noSubSamples)
+{
+    Int32 i, j;
+    Int32 status;
+
+    Int32 *ptr1;
+    Int32 *ptr2;
+    Int32 *ptr3;
+    Int32 *ptr4;
+    Int32 *ptr5;
+    Int32 *ptr6;
+    Int32 *ptr7;
+
+    const Int32 pHybridResolution[] = { HYBRID_8_CPLX,
+                                        HYBRID_2_REAL,
+                                        HYBRID_2_REAL
+                                      };
+
+    STRUCT_PS_DEC *h_ps_dec = self->hParametricStereoDec;
+
+    /* initialisation */
+    h_ps_dec->noSubSamples = noSubSamples;
+
+    h_ps_dec->invNoSubSamples = Q30_fmt(1.0f) / noSubSamples;
+
+    /*
+     *  Reuse AAC+ HQ right channel, which is not used when PS is enabled
+     */
+    ptr1 = (Int32 *)(self->SbrChannel[1].frameData.codecQmfBufferReal[0]);   /*  reuse un-used right channel QMF_FILTER Synthesis buffer */
+
+    ptr2 = (&ptr1[658]);  /*  reuse un-used right channel QMF_FILTER Synthesis buffer */
+    /* 1162 - 658 = 504
+     *            = NO_QMF_ALLPASS_CHANNELS*2 (Re&Im)*( 3 + 4 + 5) + ( 3 + 4 + 5)*2 (Re&Im)
+     */
+
+    ptr3 = (&ptr1[1162]);  /*  reuse un-used right channel QMF_FILTER Synthesis buffer */
+    /* 1426 - 1162 = 264
+     *            = SUBQMF_GROUPS*2 (Re&Im)*( 3 + 4 + 5) + ( 3 + 4 + 5)*2 (Re&Im)
+     */
+
+    ptr4 = (&ptr1[1426]);  /*  high freq generation buffers */
+
+    ptr5 = (&ptr1[1490]);  /*  high freq generation buffers */
+
+    ptr6 = (&ptr1[1618]);  /*  high freq generation buffers */
+
+    ptr7 = (&ptr1[1810]);  /*  high freq generation buffers */
+
+    /*  whole allocation requires 1871 words, sbrQmfBufferImag has 1920 words */
+
+
+    h_ps_dec->aPeakDecayFast =  ptr1;
+    ptr1 += NO_BINS;
+
+    h_ps_dec->aPrevNrg =  ptr1;
+    ptr1 += NO_BINS;
+
+    h_ps_dec->aPrevPeakDiff = ptr1;
+    ptr1 += NO_BINS;
+
+
+
+    status = ps_hybrid_filter_bank_allocation(&h_ps_dec->hHybrid,
+             NO_QMF_CHANNELS_IN_HYBRID,
+             pHybridResolution,
+             &ptr1);
+    h_ps_dec->mHybridRealLeft = ptr1;
+    ptr1 += SUBQMF_GROUPS;
+
+    h_ps_dec->mHybridImagLeft = ptr1;
+    ptr1 += SUBQMF_GROUPS;
+
+    h_ps_dec->mHybridRealRight = ptr1;
+    ptr1 += SUBQMF_GROUPS;
+
+    h_ps_dec->mHybridImagRight = ptr1;
+    ptr1 += SUBQMF_GROUPS;
+
+
+    h_ps_dec->delayBufIndex   = 0;
+
+
+
+    for (i = 0 ; i < NO_DELAY_CHANNELS ; i++)   /* 41  */
+    {
+        if (i < SHORT_DELAY_START)              /* 12  */
+        {
+            h_ps_dec->aNoSampleDelay[i] = LONG_DELAY;
+        }
+        else
+        {
+            h_ps_dec->aNoSampleDelay[i] = SHORT_DELAY;
+        }
+    }
+
+
+    h_ps_dec->aaRealDelayBufferQmf = (Int32 **)ptr6;
+    ptr6 += NO_QMF_ICC_CHANNELS * sizeof(Int32 *) / sizeof(Int32);
+
+    h_ps_dec->aaImagDelayBufferQmf = (Int32 **)ptr7;
+    ptr7 += NO_QMF_ICC_CHANNELS * sizeof(Int32 *) / sizeof(Int32);
+
+    h_ps_dec->aaRealDelayBufferSubQmf = (Int32 **)ptr1;
+    ptr1 += SUBQMF_GROUPS * sizeof(Int32 *) / sizeof(Int32);
+
+    h_ps_dec->aaImagDelayBufferSubQmf = (Int32 **)ptr1;
+    ptr1 += SUBQMF_GROUPS * sizeof(Int32 *) / sizeof(Int32);
+
+    for (i = 0; i < NO_QMF_ICC_CHANNELS; i++)   /* 61 */
+    {
+        int delay;
+
+        if (i < NO_QMF_ALLPASS_CHANNELS)    /* 20 */
+        {
+            delay = 2;
+            h_ps_dec->aaRealDelayBufferQmf[i] = (Int32 *)ptr4;
+            ptr4 += delay;
+
+            h_ps_dec->aaImagDelayBufferQmf[i] = (Int32 *)ptr5;
+            ptr5 += delay;
+        }
+        else
+        {
+
+            if (i >= (NO_QMF_ALLPASS_CHANNELS + SHORT_DELAY_START))
+            {
+                delay = SHORT_DELAY;
+            }
+            else
+            {
+                delay = LONG_DELAY;
+            }
+
+            h_ps_dec->aaRealDelayBufferQmf[i] = (Int32 *)ptr1;
+            ptr1 += delay;
+
+            h_ps_dec->aaImagDelayBufferQmf[i] = (Int32 *)ptr1;
+            ptr1 += delay;
+        }
+    }
+
+    for (i = 0; i < SUBQMF_GROUPS; i++)
+    {
+        h_ps_dec->aaRealDelayBufferSubQmf[i] = (Int32 *)ptr1;
+        ptr1 += DELAY_ALLPASS;
+
+        h_ps_dec->aaImagDelayBufferSubQmf[i] = (Int32 *)ptr1;
+        ptr1 += DELAY_ALLPASS;
+
+    }
+
+    for (i = 0 ; i < NO_SERIAL_ALLPASS_LINKS ; i++) /*  NO_SERIAL_ALLPASS_LINKS == 3 */
+    {
+
+        h_ps_dec->aDelayRBufIndexSer[i] = 0;
+
+        h_ps_dec->aaaRealDelayRBufferSerQmf[i] = (Int32 **)ptr2;
+        ptr2 += aRevLinkDelaySer[i];
+
+        h_ps_dec->aaaImagDelayRBufferSerQmf[i] = (Int32 **)ptr2;
+        ptr2 += aRevLinkDelaySer[i];
+
+        h_ps_dec->aaaRealDelayRBufferSerSubQmf[i] = (Int32 **)ptr3;
+        ptr3 += aRevLinkDelaySer[i];
+
+        h_ps_dec->aaaImagDelayRBufferSerSubQmf[i] = (Int32 **)ptr3;
+        ptr3 += aRevLinkDelaySer[i];
+
+        for (j = 0; j < aRevLinkDelaySer[i]; j++)
+        {
+            h_ps_dec->aaaRealDelayRBufferSerQmf[i][j] = ptr2;
+            ptr2 += NO_QMF_ALLPASS_CHANNELS;    /* NO_QMF_ALLPASS_CHANNELS == 20 */
+
+            h_ps_dec->aaaImagDelayRBufferSerQmf[i][j] = ptr2;
+            ptr2 += NO_QMF_ALLPASS_CHANNELS;
+
+            h_ps_dec->aaaRealDelayRBufferSerSubQmf[i][j] = ptr3;
+            ptr3 += SUBQMF_GROUPS;
+
+            h_ps_dec->aaaImagDelayRBufferSerSubQmf[i][j] = ptr3;
+            ptr3 += SUBQMF_GROUPS;
+
+        }
+    }
+
+
+    for (i = 0; i < NO_IID_GROUPS; i++)         /*  NO_IID_GROUPS == 22   */
+    {
+        h_ps_dec->h11Prev[i] = Q30_fmt(1.0f);
+        h_ps_dec->h12Prev[i] = Q30_fmt(1.0f);
+    }
+
+
+
+    return status;
+} /*END CreatePsDec*/
+#endif
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_allocate_decoder.h b/media/libstagefright/codecs/aacdec/ps_allocate_decoder.h
new file mode 100644
index 0000000..d5f152f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_allocate_decoder.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_allocate_decoder.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_allocate_decoder()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_ALLOCATE_DECODER_H
+#define PS_ALLOCATE_DECODER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int32 ps_allocate_decoder(SBRDECODER_DATA *self,
+    UInt32  noSubSamples);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_ALLOCATE_DECODER_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_applied.cpp b/media/libstagefright/codecs/aacdec/ps_applied.cpp
new file mode 100644
index 0000000..77fd8a7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_applied.cpp
@@ -0,0 +1,216 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_applied.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Applies Parametric Stereo Tool to a QMF-analized mono signal
+        providing a stereo image as output
+
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+#include    "aac_mem_funcs.h"
+#include    "ps_stereo_processing.h"
+#include    "ps_decorrelate.h"
+#include    "ps_hybrid_synthesis.h"
+#include    "ps_hybrid_analysis.h"
+#include    "ps_applied.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 ps_applied(STRUCT_PS_DEC *h_ps_dec,
+                Int32 rIntBufferLeft[][64],
+                Int32 iIntBufferLeft[][64],
+                Int32 *rIntBufferRight,
+                Int32 *iIntBufferRight,
+                Int32 scratch_mem[],
+                Int32 band)
+
+{
+
+    /*
+     *  Get higher frequency resolution in the lower QMF subbands
+     *  creating sub-subbands
+     */
+    ps_hybrid_analysis(rIntBufferLeft,
+                       iIntBufferLeft,
+                       h_ps_dec->mHybridRealLeft,
+                       h_ps_dec->mHybridImagLeft,
+                       h_ps_dec->hHybrid,
+                       scratch_mem,
+                       band);
+
+    /*
+     *  By means of delaying and all-pass filtering, sub-subbands of
+     *  left ch. are decorrelate to creates right ch. sub-subbands
+     */
+
+    ps_decorrelate(h_ps_dec,
+                   *rIntBufferLeft,
+                   *iIntBufferLeft,
+                   rIntBufferRight,
+                   iIntBufferRight,
+                   scratch_mem);
+
+    /*
+     *  sub-subbands of left and right ch. are processed according to
+     *  stereo clues.
+     */
+
+    ps_stereo_processing(h_ps_dec,
+                         *rIntBufferLeft,
+                         *iIntBufferLeft,
+                         rIntBufferRight,
+                         iIntBufferRight);
+
+    /*
+     *  Reconstruct stereo signals
+     */
+
+    ps_hybrid_synthesis((const Int32*)h_ps_dec->mHybridRealLeft,
+                        (const Int32*)h_ps_dec->mHybridImagLeft,
+                        *rIntBufferLeft,
+                        *iIntBufferLeft,
+                        h_ps_dec->hHybrid);
+
+    ps_hybrid_synthesis((const Int32*)h_ps_dec->mHybridRealRight,
+                        (const Int32*)h_ps_dec->mHybridImagRight,
+                        rIntBufferRight,
+                        iIntBufferRight,
+                        h_ps_dec->hHybrid);
+
+}/* END ps_applied */
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_applied.h b/media/libstagefright/codecs/aacdec/ps_applied.h
new file mode 100644
index 0000000..231d9c3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_applied.h
@@ -0,0 +1,101 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_applied.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions ps_applied()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_APPLIED_H
+#define PS_APPLIED_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_applied(STRUCT_PS_DEC *h_ps_dec,
+    Int32 rIntBufferLeft[][64],
+    Int32 iIntBufferLeft[][64],
+    Int32 *rIntBufferRight,
+    Int32 *iIntBufferRight,
+    Int32 scratch_mem[],
+    Int32 band);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_APPLIED_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_bstr_decoding.cpp b/media/libstagefright/codecs/aacdec/ps_bstr_decoding.cpp
new file mode 100644
index 0000000..c7ed60b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_bstr_decoding.cpp
@@ -0,0 +1,304 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_bstr_decoding.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Decodes parametric stereo
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include "pv_audio_type_defs.h"
+#include "aac_mem_funcs.h"
+#include "ps_bstr_decoding.h"
+#include "ps_decode_bs_utils.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
+----------------------------------------------------------------------------*/
+
+const Int32 aNoIidBins[3] = {NO_LOW_RES_IID_BINS, NO_IID_BINS, NO_HI_RES_BINS};
+const Int32 aNoIccBins[3] = {NO_LOW_RES_ICC_BINS, NO_ICC_BINS, NO_HI_RES_BINS};
+const Int32 aFixNoEnvDecode[4] = {0, 1, 2, 4};
+
+/*----------------------------------------------------------------------------
+; 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 ps_bstr_decoding(STRUCT_PS_DEC *ps_dec)
+{
+    UInt32 env;
+    Int32 noIidSteps;
+
+    if (!ps_dec->bPsDataAvail)
+    {
+        ps_dec->noEnv = 0;
+    }
+
+    noIidSteps = ps_dec->bFineIidQ ? NO_IID_STEPS_FINE : NO_IID_STEPS;
+
+    for (env = 0; env < ps_dec->noEnv; env++)
+    {
+        Int32 *aPrevIidIndex;
+        Int32 *aPrevIccIndex;
+        if (env == 0)
+        {
+            aPrevIidIndex = ps_dec->aIidPrevFrameIndex;
+            aPrevIccIndex = ps_dec->aIccPrevFrameIndex;
+        }
+        else
+        {
+            aPrevIidIndex = ps_dec->aaIidIndex[env-1];
+            aPrevIccIndex = ps_dec->aaIccIndex[env-1];
+        }
+
+        /*
+         * Differential Decoding of IID parameters over time/frequency
+         */
+        differential_Decoding(ps_dec->bEnableIid,
+                              ps_dec->aaIidIndex[env],
+                              aPrevIidIndex,
+                              ps_dec->abIidDtFlag[env],
+                              aNoIidBins[ps_dec->freqResIid],
+                              (ps_dec->freqResIid) ? 1 : 2,
+                              -noIidSteps,
+                              noIidSteps);
+
+        /*
+         * Differential Decoding of ICC parameters over time/frequency
+         */
+        differential_Decoding(ps_dec->bEnableIcc,
+                              ps_dec->aaIccIndex[env],
+                              aPrevIccIndex,
+                              ps_dec->abIccDtFlag[env],
+                              aNoIccBins[ps_dec->freqResIcc],
+                              (ps_dec->freqResIcc) ? 1 : 2,
+                              0,
+                              NO_ICC_STEPS - 1);
+
+
+    }   /* for (env=0; env<ps_dec->noEnv; env++) */
+
+    if (ps_dec->noEnv == 0)
+    {
+        ps_dec->noEnv = 1;
+
+        if (ps_dec->bEnableIid)
+        {   /*  NO_HI_RES_BINS == 34 */
+            pv_memmove(ps_dec->aaIidIndex[ps_dec->noEnv-1],
+                       ps_dec->aIidPrevFrameIndex,
+                       NO_HI_RES_BINS*sizeof(*ps_dec->aIidPrevFrameIndex));
+
+        }
+        else
+        {
+            pv_memset((void *)ps_dec->aaIidIndex[ps_dec->noEnv-1],
+                      0,
+                      NO_HI_RES_BINS*sizeof(**ps_dec->aaIidIndex));
+        }
+        if (ps_dec->bEnableIcc)
+        {
+            pv_memmove(ps_dec->aaIccIndex[ps_dec->noEnv-1],
+                       ps_dec->aIccPrevFrameIndex,
+                       NO_HI_RES_BINS*sizeof(*ps_dec->aIccPrevFrameIndex));
+        }
+        else
+        {
+            pv_memset((void *)ps_dec->aaIccIndex[ps_dec->noEnv-1],
+                      0,
+                      NO_HI_RES_BINS*sizeof(**ps_dec->aaIccIndex));
+        }
+    }
+
+    pv_memmove(ps_dec->aIidPrevFrameIndex,
+               ps_dec->aaIidIndex[ps_dec->noEnv-1],
+               NO_HI_RES_BINS*sizeof(*ps_dec->aIidPrevFrameIndex));
+
+    pv_memmove(ps_dec->aIccPrevFrameIndex,
+               ps_dec->aaIccIndex[ps_dec->noEnv-1],
+               NO_HI_RES_BINS*sizeof(*ps_dec->aIccPrevFrameIndex));
+
+    ps_dec->bPsDataAvail = 0;
+
+    if (ps_dec->bFrameClass == 0)
+    {
+        Int32 shift;
+
+        shift = ps_dec->noEnv >> 1;
+
+        ps_dec->aEnvStartStop[0] = 0;
+
+        for (env = 1; env < ps_dec->noEnv; env++)
+        {
+            ps_dec->aEnvStartStop[env] =
+                (env * ps_dec->noSubSamples) >> shift;
+        }
+
+        ps_dec->aEnvStartStop[ps_dec->noEnv] = ps_dec->noSubSamples;
+    }
+    else
+    {   /* if (ps_dec->bFrameClass != 0) */
+        ps_dec->aEnvStartStop[0] = 0;
+
+        if (ps_dec->aEnvStartStop[ps_dec->noEnv] < ps_dec->noSubSamples)
+        {
+            ps_dec->noEnv++;
+            ps_dec->aEnvStartStop[ps_dec->noEnv] = ps_dec->noSubSamples;
+
+            pv_memmove(ps_dec->aaIidIndex[ps_dec->noEnv],
+                       ps_dec->aaIidIndex[ps_dec->noEnv-1],
+                       NO_HI_RES_BINS*sizeof(**ps_dec->aaIidIndex));
+
+            pv_memmove(ps_dec->aaIccIndex[ps_dec->noEnv],
+                       ps_dec->aaIccIndex[ps_dec->noEnv-1],
+                       NO_HI_RES_BINS*sizeof(**ps_dec->aaIccIndex));
+        }
+
+        for (env = 1; env < ps_dec->noEnv; env++)
+        {
+            UInt32 thr;
+            thr = ps_dec->noSubSamples - ps_dec->noEnv + env;
+
+            if (ps_dec->aEnvStartStop[env] > thr)
+            {
+                ps_dec->aEnvStartStop[env] = thr;
+            }
+            else
+            {
+                thr = ps_dec->aEnvStartStop[env-1] + 1;
+
+                if (ps_dec->aEnvStartStop[env] < thr)
+                {
+                    ps_dec->aEnvStartStop[env] = thr;
+                }
+            }
+        }
+    }   /* if (ps_dec->bFrameClass == 0) ... else */
+
+    for (env = 0; env < ps_dec->noEnv; env++)
+    {
+        if (ps_dec->freqResIid == 2)
+        {
+            map34IndexTo20(ps_dec->aaIidIndex[env]);
+        }
+        if (ps_dec->freqResIcc == 2)
+        {
+            map34IndexTo20(ps_dec->aaIccIndex[env]);
+        }
+    }
+
+
+}
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_bstr_decoding.h b/media/libstagefright/codecs/aacdec/ps_bstr_decoding.h
new file mode 100644
index 0000000..5212bf8d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_bstr_decoding.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_bstr_decoding.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions ps_bstr_decoding()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_BSTR_DECODING_H
+#define PS_BSTR_DECODING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+extern const Int32 aNoIidBins[3];
+extern const Int32 aNoIccBins[3];
+
+extern const Int32 aFixNoEnvDecode[4];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_bstr_decoding(STRUCT_PS_DEC *h_ps_dec);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_BSTR_DECODING_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_channel_filtering.cpp b/media/libstagefright/codecs/aacdec/ps_channel_filtering.cpp
new file mode 100644
index 0000000..03a53df
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_channel_filtering.cpp
@@ -0,0 +1,281 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_hybrid_analysis.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Does Hybrid analysis
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "s_hybrid.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_fft_rx8.h"
+#include    "ps_channel_filtering.h"
+#include    "pv_audio_type_defs.h"
+#include    "fxp_mul32.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define R_SHIFT     29
+#define Q29_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt31(a)   (Int32)(-a*((Int32)1<<31)  + (a>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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 two_ch_filtering(const Int32 *pQmf_r,
+                      const Int32 *pQmf_i,
+                      Int32 *mHybrid_r,
+                      Int32 *mHybrid_i)
+{
+
+    Int32 cum0;
+    Int32 cum1;
+    Int32 cum2;
+    Int32 tmp1;
+    Int32 tmp2;
+
+    tmp1 = pQmf_r[ 1] + pQmf_r[11];
+    tmp2 = pQmf_i[ 1] + pQmf_i[11];
+    cum1 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp1);
+    cum2 =   fxp_mul32_Q31(Qfmt31(0.03798975052098f), tmp2);
+    tmp1 = pQmf_r[ 3] + pQmf_r[ 9];
+    tmp2 = pQmf_i[ 3] + pQmf_i[ 9];
+    cum1 =   fxp_msu32_Q31(cum1, Qfmt31(0.14586278335076f), tmp1);
+    cum2 =   fxp_msu32_Q31(cum2, Qfmt31(0.14586278335076f), tmp2);
+    tmp1 = pQmf_r[ 5] + pQmf_r[ 7];
+    tmp2 = pQmf_i[ 5] + pQmf_i[ 7];
+    cum1 =   fxp_mac32_Q31(cum1, Qfmt31(0.61193261090336f), tmp1);
+    cum2 =   fxp_mac32_Q31(cum2, Qfmt31(0.61193261090336f), tmp2);
+
+    cum0 = pQmf_r[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */
+
+    mHybrid_r[0] = (cum0 + cum1);
+    mHybrid_r[1] = (cum0 - cum1);
+
+    cum0 = pQmf_i[HYBRID_FILTER_DELAY] >> 1;  /* HYBRID_FILTER_DELAY == 6 */
+
+    mHybrid_i[0] = (cum0 + cum2);
+    mHybrid_i[1] = (cum0 - cum2);
+
+}
+
+
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void eight_ch_filtering(const Int32 *pQmfReal,
+                        const Int32 *pQmfImag,
+                        Int32 *mHybridReal,
+                        Int32 *mHybridImag,
+                        Int32 scratch_mem[])
+
+{
+
+    Int32 real;
+    Int32 imag;
+    Int32 tmp1;
+    Int32 tmp2;
+
+    real  = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfReal[ 4]);
+
+    real  = fxp_mac32_Q31(real, Qfmt31(0.01055120626280f), pQmfReal[12]);
+    imag  = fxp_mul32_Q29(Q29_fmt(-0.06989827306334f), pQmfImag[ 4]);
+
+    imag  = fxp_mac32_Q31(imag, Qfmt31(0.01055120626280f), pQmfImag[12]);
+
+    mHybridReal[2] = (imag - real);
+    mHybridImag[2] = -(imag + real);
+
+    real  = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfReal[ 3]);
+
+    real  = fxp_mac32_Q31(real, Qfmt31(0.04540841899650f), pQmfReal[11]);
+    imag  = fxp_mul32_Q29(Q29_fmt(-0.07266113929591f), pQmfImag[ 3]);
+
+    imag  = fxp_mac32_Q31(imag, Qfmt31(0.04540841899650f), pQmfImag[11]);
+
+    tmp1           =  fxp_mul32_Q29(Q29_fmt(-0.38268343236509f), real);
+    mHybridReal[3] =  fxp_mac32_Q29(Q29_fmt(0.92387953251129f), imag, tmp1);
+    tmp2           =  fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real);
+    mHybridImag[3] =  fxp_mac32_Q29(Q29_fmt(-0.38268343236509f), imag, tmp2);
+
+
+    mHybridImag[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfReal[ 2] - pQmfReal[10]));
+    mHybridReal[4] = fxp_mul32_Q31(Qfmt31(0.09093731860946f), (pQmfImag[10] - pQmfImag[ 2]));
+
+
+    real  = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfReal[ 1]);
+
+    real  = fxp_mac32_Q31(real, Qfmt31(0.14532227859182f), pQmfReal[ 9]);
+    imag  = fxp_mul32_Q29(Q29_fmt(-0.02270420949825f), pQmfImag[ 1]);
+
+    imag  = fxp_mac32_Q31(imag, Qfmt31(0.14532227859182f), pQmfImag[ 9]);
+
+    tmp1           =  fxp_mul32_Q29(Q29_fmt(0.92387953251129f), imag);
+
+    mHybridReal[5] =  fxp_mac32_Q31(tmp1, Qfmt31(0.76536686473018f), real);
+    tmp2           =  fxp_mul32_Q29(Q29_fmt(-0.92387953251129f), real);
+
+    mHybridImag[5] =  fxp_mac32_Q31(tmp2, Qfmt31(0.76536686473018f), imag);
+
+    real  = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfReal[ 0]);
+
+    real  = fxp_mac32_Q31(real, Qfmt31(0.13979654612668f), pQmfReal[ 8]);
+    imag  = fxp_mul32_Q29(Q29_fmt(-0.00527560313140f), pQmfImag[ 0]);
+
+    imag  = fxp_mac32_Q31(imag, Qfmt31(0.13979654612668f), pQmfImag[ 8]);
+
+    mHybridReal[6] = (imag + real);
+    mHybridImag[6] = (imag - real);
+
+
+    tmp1            =  fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfReal[ 7]);
+    mHybridReal[7]  =  fxp_mac32_Q31(tmp1, Qfmt31(0.09026515280366f), pQmfImag[ 7]);
+
+    tmp2            =  fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfReal[ 7]);
+
+    mHybridImag[7]  =  fxp_mac32_Q31(tmp2, Qfmt31(0.21791935610828f), pQmfImag[ 7]);
+
+    mHybridReal[0] = pQmfReal[HYBRID_FILTER_DELAY] >> 3;
+    mHybridImag[0] = pQmfImag[HYBRID_FILTER_DELAY] >> 3;
+
+    tmp1           =  fxp_mul32_Q29(Q29_fmt(-0.04513257640183f), pQmfImag[ 5]);
+
+    mHybridReal[1] =  fxp_mac32_Q31(tmp1, Qfmt31(0.21791935610828f), pQmfReal[ 5]);
+
+
+    tmp2            =  fxp_mul32_Q31(Qfmt31(0.21791935610828f), pQmfImag[ 5]);
+    mHybridImag[1]  =  fxp_mac32_Q31(tmp2, Qfmt31(0.09026515280366f), pQmfReal[ 5]);
+
+    /*
+     *  8*ifft
+     */
+
+    ps_fft_rx8(mHybridReal, mHybridImag, scratch_mem);
+
+}
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_channel_filtering.h b/media/libstagefright/codecs/aacdec/ps_channel_filtering.h
new file mode 100644
index 0000000..19cda79
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_channel_filtering.h
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_channel_filtering.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions two_ch_filtering()
+ and  eight_ch_filtering()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_CHANNEL_FILTERING_H
+#define PS_CHANNEL_FILTERING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void two_ch_filtering(const Int32 *pQmf_r,
+    const Int32 *pQmf_i,
+    Int32 *mHybrid_r,
+    Int32 *mHybrid_i);
+
+
+    void eight_ch_filtering(const Int32 *pQmfReal,
+                            const Int32 *pQmfImag,
+                            Int32 *mHybridReal,
+                            Int32 *mHybridImag,
+                            Int32 scratch_mem[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_CHANNEL_FILTERING_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_constants.h b/media/libstagefright/codecs/aacdec/ps_constants.h
new file mode 100644
index 0000000..d5b2ad4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_constants.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+*******************************************************************************/
+/*
+*/
+#ifndef PS_CONSTANTS_H
+#define PS_CONSTANTS_H
+
+
+#define NO_SUB_QMF_CHANNELS         12
+#define NO_QMF_CHANNELS_IN_HYBRID   3
+#define NO_QMF_CHANNELS             64
+#define NO_ALLPASS_CHANNELS         23
+#define NO_DELAY_CHANNELS           (NO_QMF_CHANNELS-NO_ALLPASS_CHANNELS)
+#define DELAY_ALLPASS               2
+#define SHORT_DELAY_START           12
+#define SHORT_DELAY                 1
+#define LONG_DELAY                  14
+#define NO_QMF_ALLPASS_CHANNELS    (NO_ALLPASS_CHANNELS-NO_QMF_CHANNELS_IN_HYBRID)
+#define NO_QMF_ICC_CHANNELS        (NO_QMF_ALLPASS_CHANNELS+NO_DELAY_CHANNELS)
+#define HYBRIDGROUPS                8
+#define DECAY_CUTOFF                3
+#define NO_SERIAL_ALLPASS_LINKS     3
+#define MAX_NO_PS_ENV               5
+#define NEGATE_IPD_MASK                 ( 0x00001000 )
+#define NO_BINS                         ( 20 )
+#define NO_HI_RES_BINS                  ( 34 )
+#define NO_LOW_RES_BINS                 ( NO_IID_BINS / 2 )
+#define NO_IID_BINS                     ( NO_BINS )
+#define NO_ICC_BINS                     ( NO_BINS )
+#define NO_LOW_RES_IID_BINS             ( NO_LOW_RES_BINS )
+#define NO_LOW_RES_ICC_BINS             ( NO_LOW_RES_BINS )
+#define SUBQMF_GROUPS                   ( 10 )
+#define QMF_GROUPS                      ( 12 )
+#define NO_IID_GROUPS                   ( SUBQMF_GROUPS + QMF_GROUPS )
+#define NO_IID_STEPS                    ( 7 )
+#define NO_IID_STEPS_FINE               ( 15 )
+#define NO_ICC_STEPS                    ( 8 )
+#define NO_IID_LEVELS                   ( 2 * NO_IID_STEPS + 1 )
+#define NO_IID_LEVELS_FINE              ( 2 * NO_IID_STEPS_FINE + 1 )
+#define NO_ICC_LEVELS                   ( NO_ICC_STEPS )
+
+
+
+#endif      /*  PS_CONSTANTS_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.cpp b/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.cpp
new file mode 100644
index 0000000..241da34
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_decode_bs_utils.c
+
+  Functions:
+        GetNrBitsAvailable
+        differential_Decoding
+        map34IndexTo20
+        limitMinMax
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Decode bitstream parametric stereo's utilities
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include "aac_mem_funcs.h"
+#include "s_ps_dec.h"
+#include "ps_decode_bs_utils.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
+----------------------------------------------------------------------------*/
+
+Int32 GetNrBitsAvailable(HANDLE_BIT_BUFFER hBitBuf)
+{
+
+    return (hBitBuf->bufferLen - hBitBuf->nrBitsRead);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+;
+;   Differential Decoding of parameters over time/frequency
+----------------------------------------------------------------------------*/
+
+void differential_Decoding(Int32 enable,
+                           Int32 *aIndex,
+                           Int32 *aPrevFrameIndex,
+                           Int32 DtDf,
+                           Int32 nrElements,
+                           Int32 stride,
+                           Int32 minIdx,
+                           Int32 maxIdx)
+{
+    Int32 i;
+    Int32 *ptr_aIndex;
+
+    if (enable == 1)
+    {
+        ptr_aIndex = aIndex;
+
+        if (DtDf == 0)
+        {
+            *(ptr_aIndex) = limitMinMax(*ptr_aIndex, minIdx, maxIdx);
+            ptr_aIndex++;
+
+            for (i = 1; i < nrElements; i++)
+            {
+                *(ptr_aIndex) = limitMinMax(aIndex[i-1] + *ptr_aIndex, minIdx, maxIdx);
+                ptr_aIndex++;
+            }
+        }
+        else
+        {
+            if (stride == 1)
+            {
+                for (i = 0; i < nrElements; i++)
+                {
+                    *(ptr_aIndex) = limitMinMax(aPrevFrameIndex[i] + *ptr_aIndex, minIdx, maxIdx);
+                    ptr_aIndex++;
+                }
+            }
+            else
+            {
+                for (i = 0; i < nrElements; i++)
+                {
+                    *(ptr_aIndex) = limitMinMax(aPrevFrameIndex[(i<<1)] + *ptr_aIndex, minIdx, maxIdx);
+                    ptr_aIndex++;
+                }
+            }
+        }
+    }
+    else
+    {
+        pv_memset((void *)aIndex, 0, nrElements*sizeof(*aIndex));
+    }
+    if (stride == 2)
+    {
+        for (i = (nrElements << 1) - 1; i > 0; i--)
+        {
+            aIndex[i] = aIndex[(i>>1)];
+        }
+    }
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+        map34IndexTo20
+----------------------------------------------------------------------------*/
+
+void map34IndexTo20(Int32 *aIndex)
+{
+
+    aIndex[ 0] = ((aIndex[0] << 1) +  aIndex[1]) / 3;
+    aIndex[ 1] = (aIndex[1] + (aIndex[2] << 1)) / 3;
+    aIndex[ 2] = ((aIndex[3] << 1) +  aIndex[4]) / 3;
+    aIndex[ 3] = (aIndex[4] + (aIndex[5] << 1)) / 3;
+    aIndex[ 4] = (aIndex[ 6] +  aIndex[7]) >> 1;
+    aIndex[ 5] = (aIndex[ 8] +  aIndex[9]) >> 1;
+    aIndex[ 6] =   aIndex[10];
+    aIndex[ 7] =   aIndex[11];
+    aIndex[ 8] = (aIndex[12] +  aIndex[13]) >> 1;
+    aIndex[ 9] = (aIndex[14] +  aIndex[15]) >> 1;
+    aIndex[10] =   aIndex[16];
+    aIndex[11] =   aIndex[17];
+    aIndex[12] =   aIndex[18];
+    aIndex[13] =   aIndex[19];
+    aIndex[14] = (aIndex[20] +  aIndex[21]) >> 1;
+    aIndex[15] = (aIndex[22] +  aIndex[23]) >> 1;
+    aIndex[16] = (aIndex[24] +  aIndex[25]) >> 1;
+    aIndex[17] = (aIndex[26] +  aIndex[27]) >> 1;
+    aIndex[18] = (aIndex[28] +  aIndex[29] + aIndex[30] + aIndex[31]) >> 2;
+    aIndex[19] = (aIndex[32] +  aIndex[33]) >> 1;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+        limitMinMax
+----------------------------------------------------------------------------*/
+
+
+Int32 limitMinMax(Int32 i,
+                  Int32 min,
+                  Int32 max)
+{
+    if (i < max)
+    {
+        if (i > min)
+        {
+            return i;
+        }
+        else
+        {
+            return min;
+        }
+    }
+    else
+    {
+        return max;
+    }
+}
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.h b/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.h
new file mode 100644
index 0000000..a672d94
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_decode_bs_utils.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_decode_bs_utils.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions differential_Decoding(), limitMinMax(),
+                           GetNrBitsAvailable(), map34IndexTo20()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_DECODE_BS_UTILS_H
+#define PS_DECODE_BS_UTILS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.h"
+#include "s_bit_buffer.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void differential_Decoding(Int32 enable,
+    Int32 *aIndex,
+    Int32 *aPrevFrameIndex,
+    Int32 DtDf,
+    Int32 nrElements,
+    Int32 stride,
+    Int32 minIdx,
+    Int32 maxIdx);
+
+    Int32 limitMinMax(Int32 i,
+                      Int32 min,
+                      Int32 max);
+
+    Int32 GetNrBitsAvailable(HANDLE_BIT_BUFFER hBitBuf);
+
+    void map34IndexTo20(Int32 *aIndex);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_DECODE_BS_UTILS_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_decorrelate.cpp b/media/libstagefright/codecs/aacdec/ps_decorrelate.cpp
new file mode 100644
index 0000000..6776d6e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_decorrelate.cpp
@@ -0,0 +1,499 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_decorrelate.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Decorrelation
+  Decorrelation is achieved by means of all-pass filtering and delaying
+  Sub-band samples s_k(n) are converted into de-correlated sub-bands samples
+  d_k(n). k index for frequency, n time index
+
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+  Delay is introduced to compensate QMF bands not passed through Hybrid
+  Analysis
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+#include    "pv_audio_type_defs.h"
+#include    "ps_decorrelate.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_pwr_transient_detection.h"
+#include    "ps_all_pass_fract_delay_filter.h"
+#include    "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+
+/*----------------------------------------------------------------------------
+; 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 ps_decorrelate(STRUCT_PS_DEC *h_ps_dec,
+                    Int32 *rIntBufferLeft,
+                    Int32 *iIntBufferLeft,
+                    Int32 *rIntBufferRight,
+                    Int32 *iIntBufferRight,
+                    Int32 scratch_mem[])
+{
+    Int32 sb;
+    Int32 maxsb;
+    Int32 gr;
+    Int32 sb_delay;
+    Int32 bin;
+
+
+
+
+    Int32 *aLeftReal;
+    Int32 *aLeftImag;
+    Int32 *aRightReal;
+    Int32 *aRightImag;
+
+    Int32 *aTransRatio = scratch_mem;   /* use  NO_BINS == 20 */
+
+
+    Int32 ***pppRealDelayRBufferSer;
+    Int32 ***pppImagDelayRBufferSer;
+
+    Int32 **ppRealDelayBuffer;
+    Int32 **ppImagDelayBuffer;
+
+    const Int32(*ppFractDelayPhaseFactorSer)[3];
+    /*
+     *  Power transient estimation and detection
+     */
+
+
+    ps_pwr_transient_detection(h_ps_dec,
+                               rIntBufferLeft,
+                               iIntBufferLeft,
+                               aTransRatio);
+
+
+    aLeftReal = h_ps_dec->mHybridRealLeft;
+    aLeftImag = h_ps_dec->mHybridImagLeft;
+    aRightReal = h_ps_dec->mHybridRealRight;
+    aRightImag = h_ps_dec->mHybridImagRight;
+
+    pppRealDelayRBufferSer = h_ps_dec->aaaRealDelayRBufferSerSubQmf;
+    pppImagDelayRBufferSer = h_ps_dec->aaaImagDelayRBufferSerSubQmf;
+
+    ppRealDelayBuffer = h_ps_dec->aaRealDelayBufferSubQmf;
+    ppImagDelayBuffer = h_ps_dec->aaImagDelayBufferSubQmf;
+
+
+
+    ppFractDelayPhaseFactorSer = aaFractDelayPhaseFactorSerSubQmf;
+
+
+    /*
+     *   NO_IID_GROUPS (SUBQMF_GROUPS (12) + QMF_GROUPS (10)) == 22
+     */
+
+    for (gr = 0; gr < SUBQMF_GROUPS; gr++)      /*  0 to 9 */
+    {
+        Int32 rIn;
+        Int32 iIn;
+        Int32 *pt_rTmp;
+        Int32 *pt_iTmp;
+        Int32 rTmp;
+        Int32 cmplx;
+        Int32 tmp1, tmp2;
+
+        /* sb = subQMF/QMF subband */
+
+        sb = groupBorders[gr];
+
+        /*
+         *  For lower subbands
+         *  Apply all-pass filtering
+         *
+         */
+        pt_rTmp = &ppRealDelayBuffer[sb][h_ps_dec->delayBufIndex];
+        pt_iTmp = &ppImagDelayBuffer[sb][h_ps_dec->delayBufIndex];
+
+        tmp1 = aLeftReal[sb];
+        tmp2 = aLeftImag[sb];
+        rIn = *pt_rTmp >> 1;
+        iIn = *pt_iTmp >> 1;
+
+
+        *pt_rTmp = tmp1;
+        *pt_iTmp = tmp2;
+
+        /*
+         *  Fractional delay vector
+         *
+         *  phi_fract(k) = exp(-j*pi*q_phi*f_center(k))       0<= k <= SUBQMF_GROUPS
+         *
+         *  q_phi = 0.39
+         *  f_center(k) frequency vector
+         */
+
+        cmplx =  aFractDelayPhaseFactorSubQmf[sb];
+
+        aRightReal[sb]  = cmplx_mul32_by_16(rIn, -iIn, cmplx);
+        aRightImag[sb]  = cmplx_mul32_by_16(iIn,  rIn, cmplx);
+
+        ps_all_pass_fract_delay_filter_type_I(h_ps_dec->aDelayRBufIndexSer,
+                                              sb,
+                                              ppFractDelayPhaseFactorSer[sb],
+                                              pppRealDelayRBufferSer,
+                                              pppImagDelayRBufferSer,
+                                              &aRightReal[sb],
+                                              &aRightImag[sb]);
+
+        bin = bins2groupMap[gr];
+        rTmp = aTransRatio[bin];
+
+        if (rTmp != 0x7FFFFFFF)
+        {
+            aRightReal[sb] = fxp_mul32_Q31(rTmp, aRightReal[sb]) << 1;
+            aRightImag[sb] = fxp_mul32_Q31(rTmp, aRightImag[sb]) << 1;
+        }
+
+
+    } /* gr */
+
+    aLeftReal = rIntBufferLeft;
+    aLeftImag = iIntBufferLeft;
+    aRightReal = rIntBufferRight;
+    aRightImag = iIntBufferRight;
+
+    pppRealDelayRBufferSer = h_ps_dec->aaaRealDelayRBufferSerQmf;
+    pppImagDelayRBufferSer = h_ps_dec->aaaImagDelayRBufferSerQmf;
+
+    ppRealDelayBuffer = h_ps_dec->aaRealDelayBufferQmf;
+    ppImagDelayBuffer = h_ps_dec->aaImagDelayBufferQmf;
+
+
+
+    ppFractDelayPhaseFactorSer = aaFractDelayPhaseFactorSerQmf;
+
+
+    for (gr = SUBQMF_GROUPS; gr < NO_BINS; gr++)     /* 10 to 20 */
+    {
+
+        maxsb = min(h_ps_dec->usb, groupBorders[gr+1]);
+
+        /* sb = subQMF/QMF subband */
+
+        for (sb = groupBorders[gr]; sb < maxsb; sb++)
+        {
+
+            Int32 rIn, iIn;
+            Int32 *pt_rTmp, *pt_iTmp;
+            Int32 cmplx;
+            Int32 tmp1, tmp2;
+            Int32 rTmp;
+
+
+            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /* NO_QMF_CHANNELS_IN_HYBRID == 3 */
+
+            /*
+             *  For lower subbands
+             *  Apply all-pass filtering
+             *
+             */
+            pt_rTmp = &ppRealDelayBuffer[sb_delay][h_ps_dec->delayBufIndex];
+            pt_iTmp = &ppImagDelayBuffer[sb_delay][h_ps_dec->delayBufIndex];
+
+            rIn = *pt_rTmp >> 1;
+            iIn = *pt_iTmp >> 1;
+
+            tmp1 = aLeftReal[sb];
+            tmp2 = aLeftImag[sb];
+            *pt_rTmp = tmp1;
+            *pt_iTmp = tmp2;
+
+            /*
+             *  Fractional delay vector
+             *
+             *  phi_fract(k) = exp(-j*pi*q_phi*f_center(k))       0<= k <= SUBQMF_GROUPS
+             *
+             *  q_phi = 0.39
+             *  f_center(k) frequency vector
+             */
+
+            cmplx =  aFractDelayPhaseFactor[sb_delay];
+            aRightReal[sb] = cmplx_mul32_by_16(rIn, -iIn, cmplx);
+            aRightImag[sb] = cmplx_mul32_by_16(iIn,  rIn, cmplx);
+
+            ps_all_pass_fract_delay_filter_type_II(h_ps_dec->aDelayRBufIndexSer,
+                                                   sb_delay,
+                                                   ppFractDelayPhaseFactorSer[sb_delay],
+                                                   pppRealDelayRBufferSer,
+                                                   pppImagDelayRBufferSer,
+                                                   &aRightReal[sb],
+                                                   &aRightImag[sb],
+                                                   sb);
+
+            rTmp = aTransRatio[gr-2];
+            if (rTmp != 0x7FFFFFFF)
+            {
+                aRightReal[sb] = fxp_mul32_Q31(rTmp, aRightReal[sb]) << 1;
+                aRightImag[sb] = fxp_mul32_Q31(rTmp, aRightImag[sb]) << 1;
+            }
+
+
+        } /* sb */
+
+    }
+
+
+    maxsb = min(h_ps_dec->usb, 35);  /*  35 == groupBorders[NO_BINS + 1] */
+
+    /* sb = subQMF/QMF subband */
+    {
+        Int32 factor = aTransRatio[NO_BINS-2];
+
+        for (sb = 23; sb < maxsb; sb++)    /*  23 == groupBorders[NO_BINS] */
+        {
+
+            Int32  tmp, tmp2;
+            Int32 *pt_rTmp, *pt_iTmp;
+
+            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /*  == 3 */
+
+            /*
+             *  For the Upper Bands apply delay only
+             *                          -D(k)
+             *  Apply Delay   H_k(z) = z         , D(k) == 1 or 14
+             *
+             */
+            Int32 k = sb - NO_ALLPASS_CHANNELS;  /* == 23 */
+
+
+            pt_rTmp = &ppRealDelayBuffer[sb_delay][h_ps_dec->aDelayBufIndex[ k]];
+            pt_iTmp = &ppImagDelayBuffer[sb_delay][h_ps_dec->aDelayBufIndex[ k]];
+
+            if (++h_ps_dec->aDelayBufIndex[ k] >= LONG_DELAY)     /* == 14 */
+            {
+                h_ps_dec->aDelayBufIndex[ k] = 0;
+            }
+
+
+            tmp  = *pt_rTmp;
+            tmp2 = *pt_iTmp;
+
+            if (aTransRatio[NO_BINS-2] < 0x7FFFFFFF)
+            {
+                aRightReal[sb] = fxp_mul32_Q31(factor, tmp) << 1;
+                aRightImag[sb] = fxp_mul32_Q31(factor, tmp2) << 1;
+            }
+            else
+            {
+                aRightReal[sb] = tmp;
+                aRightImag[sb] = tmp2;
+            }
+
+
+            tmp  = aLeftReal[sb];
+            tmp2 = aLeftImag[sb];
+            *pt_rTmp = tmp;
+            *pt_iTmp = tmp2;
+
+
+        } /* sb */
+    }
+
+
+    maxsb = min(h_ps_dec->usb, 64);     /*  64 == groupBorders[NO_BINS+2] */
+
+    /* sb = subQMF/QMF subband */
+
+    {
+
+        for (sb = 35; sb < maxsb; sb++)    /*  35 == groupBorders[NO_BINS+1] */
+        {
+
+            Int32 *pt_rTmp, *pt_iTmp;
+
+            sb_delay = sb - NO_QMF_CHANNELS_IN_HYBRID;  /*  == 3 */
+
+            /*
+             *  For the Upper Bands apply delay only
+             *                          -D(k)
+             *  Apply Delay   H_k(z) = z         , D(k) == 1 or 14
+             *
+             */
+
+            pt_rTmp = &ppRealDelayBuffer[sb_delay][0];
+            pt_iTmp = &ppImagDelayBuffer[sb_delay][0];
+
+            aRightReal[sb] = *pt_rTmp;
+            aRightImag[sb] = *pt_iTmp;
+
+
+            if (aTransRatio[NO_BINS-1] < 0x7FFFFFFF)
+            {
+                aRightReal[sb] = fxp_mul32_Q31(aTransRatio[NO_BINS-1], aRightReal[sb]) << 1;
+                aRightImag[sb] = fxp_mul32_Q31(aTransRatio[NO_BINS-1], aRightImag[sb]) << 1;
+            }
+
+            *pt_rTmp = aLeftReal[sb];
+            *pt_iTmp = aLeftImag[sb];
+
+
+        } /* sb */
+    }
+
+
+    if (++h_ps_dec->delayBufIndex >= DELAY_ALLPASS)
+    {
+        h_ps_dec->delayBufIndex = 0;
+    }
+
+    if (++h_ps_dec->aDelayRBufIndexSer[0] >= 3)
+    {
+        h_ps_dec->aDelayRBufIndexSer[0] = 0;
+    }
+    if (++h_ps_dec->aDelayRBufIndexSer[1] >= 4)
+    {
+        h_ps_dec->aDelayRBufIndexSer[1] = 0;
+    }
+    if (++h_ps_dec->aDelayRBufIndexSer[2] >= 5)
+    {
+        h_ps_dec->aDelayRBufIndexSer[2] = 0;
+    }
+
+
+} /* END deCorrelate */
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_decorrelate.h b/media/libstagefright/codecs/aacdec/ps_decorrelate.h
new file mode 100644
index 0000000..c2a025a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_decorrelate.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_decorrelate.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_decorrelate()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_DECORRELATE_H
+#define PS_DECORRELATE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_decorrelate(STRUCT_PS_DEC *h_ps_dec,
+    Int32 *rIntBufferLeft,
+    Int32 *iIntBufferLeft,
+    Int32 *rIntBufferRight,
+    Int32 *iIntBufferRight,
+    Int32 scratch_mem[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_DECORRELATE_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_fft_rx8.cpp b/media/libstagefright/codecs/aacdec/ps_fft_rx8.cpp
new file mode 100644
index 0000000..7669be3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_fft_rx8.cpp
@@ -0,0 +1,318 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: fft_rx8.c
+ Funtions: ps_fft_rx8
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Real     Vector of Real components size 8
+
+    Imag     Vector of Imag components size 8
+             type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+     scratch_mem size 32
+
+ Outputs:
+    In-place calculation of a 8-point FFT (radix-8)
+
+ Pointers and Buffers Modified:
+    calculation are done in-place and returned in Data
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    8-point DFT, radix 8 with Decimation in Frequency
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should provide a fixed point FFT for any input array
+    of size power of 8.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] Advance Digital Signal Processing, J. Proakis, C. Rader, F. Ling,
+        C. Nikias, Macmillan Pub. Co.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+   MODIFY( x[] )
+   RETURN( exponent )
+
+------------------------------------------------------------------------------
+ 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
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#ifdef PARAMETRICSTEREO
+
+
+#include "pv_audio_type_defs.h"
+#include "ps_fft_rx8.h"
+
+#include    "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define R_SHIFT     29
+#define Q29_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void ps_fft_rx8(Int32 Re[], Int32 Im[], Int32 scratch_mem[])
+
+/* scratch_mem size 32 */
+{
+
+    Int     i;
+    Int32   *Q = &scratch_mem[0];
+    Int32   *Z = &scratch_mem[16];
+    Int32   temp1;
+    Int32   temp2;
+    Int32   temp3;
+    Int32   temp4;
+    Int32   aux_r[2];
+    Int32   aux_i[2];
+    Int32   *pt_r1 = &Re[0];
+    Int32   *pt_r2 = &Re[4];
+    Int32   *pt_i1 = &Im[0];
+    Int32   *pt_i2 = &Im[4];
+
+    Int32   *pt_Q = Q;
+    Int32   *pt_Z = Z;
+
+
+    temp1 = *(pt_r1++); /*  Real */
+    temp2 = *(pt_r2++); /*  Real */
+    temp3 = *(pt_i1++); /*  Imag */
+    temp4 = *(pt_i2++); /*  Imag */
+    /*
+     *  Vector Q stores data as Real, Imag, Real, Imag,....
+     */
+
+    *(pt_Q++) = temp1 + temp2;  /* Q(0) =  v(0) + v(4) */
+    *(pt_Q++) = temp3 + temp4;
+    *(pt_Q++) = temp1 - temp2;  /* Q(1) =  v(0) - v(4) */
+    *(pt_Q++) = temp3 - temp4;
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_i1++);
+    temp4 = *(pt_i2++);
+
+    *(pt_Q++) = temp1 + temp2;  /*    Q(2) =  v(1) + v(5) */
+    *(pt_Q++) = temp3 + temp4;
+    aux_r[0]  = temp1 - temp2;  /* aux[0]  =  v(1) - v(5) */
+    aux_i[0]  = temp3 - temp4;
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_i1++);
+    temp4 = *(pt_i2++);
+
+    *(pt_Q++) = temp1 + temp2;  /*  Q(3) =  v(2) + v(6) */
+    *(pt_Q++) = temp3 + temp4;
+    *(pt_Q++) = temp4 - temp3;  /*  Q(4) = (v(2) - v(6))*j */
+    *(pt_Q++) = temp1 - temp2;
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_i1++);
+    temp4 = *(pt_i2++);
+
+
+    *(pt_Q++) = temp1 + temp2;  /*  Q(5)   = v(3) + v(7) */
+    *(pt_Q++) = temp3 + temp4;
+    aux_r[1]  = temp1 - temp2;  /*  aux[1] = v(3) - v(7) */
+    aux_i[1]  = temp3 - temp4;
+    /*  Q(6) =  (aux[0] - aux[1])/sqrt(2); */
+    *(pt_Q++) = fxp_mul32_Q29((aux_r[0] - aux_r[1]), Q29_fmt(0.70710678118655f));
+    *(pt_Q++) = fxp_mul32_Q29((aux_i[0] - aux_i[1]), Q29_fmt(0.70710678118655f));
+
+    /*  Q(7) =  (aux[0] + aux[1])*j/sqrt(2); */
+    *(pt_Q++) =  fxp_mul32_Q29((aux_i[0] + aux_i[1]), Q29_fmt(-0.70710678118655f));
+    *(pt_Q) =  fxp_mul32_Q29((aux_r[0] + aux_r[1]), Q29_fmt(0.70710678118655f));
+
+    pt_r1 = &Q[0];        /* reset pointer */
+    pt_r2 = &Q[6];        /* reset pointer */
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_r1++);
+    temp4 = *(pt_r2++);
+
+    /*
+     *  Vector Z stores data as Real, Imag, Real, Imag,....
+     */
+
+    *(pt_Z++) = temp1 + temp2;  /* Q(0) + Q(3) */
+    *(pt_Z++) = temp3 + temp4;
+    aux_r[0]  = temp1 - temp2;
+    aux_i[0]  = temp3 - temp4;
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_r1++);
+    temp4 = *(pt_r2++);
+
+    *(pt_Z++) = temp1 + temp2;  /* Q(1) + Q(4) */
+    *(pt_Z++) = temp3 + temp4;
+    *(pt_Z++) = aux_r[0];       /* Q(0) - Q(3) */
+    *(pt_Z++) = aux_i[0];
+    *(pt_Z++) = temp1 - temp2;  /* Q(1) - Q(4) */
+    *(pt_Z++) = temp3 - temp4;
+
+    temp1 = *(pt_r1++);
+    temp2 = *(pt_r2++);
+    temp3 = *(pt_r1);
+    temp4 = *(pt_r2++);
+
+    *(pt_Z++) = temp1 + temp2;  /* Q(2) + Q(5) */
+    *(pt_Z++) = temp3 + temp4;
+    aux_r[0]  = temp1 - temp2;
+    aux_i[0]  = temp3 - temp4;
+
+    temp1 = *(pt_r2++);
+    temp3 = *(pt_r2++);
+    temp2 = *(pt_r2++);
+    temp4 = *(pt_r2);
+
+    *(pt_Z++) = temp1 + temp2;  /* Q(6) + Q(7) */
+    *(pt_Z++) = temp3 + temp4;
+
+    *(pt_Z++) = -aux_i[0];      /* (Q(2) - Q(5))*j */
+    *(pt_Z++) =  aux_r[0];
+
+    *(pt_Z++) =  temp2 - temp1;  /* -Q(6) + Q(7) */
+    *(pt_Z) =  temp4 - temp3;
+
+    pt_Z = &Z[0];        /* reset pointer */
+    pt_Q = &Z[8];        /* reset pointer */
+
+    pt_r1 = &Re[0];
+    pt_r2 = &Re[4];
+    pt_i1 = &Im[0];
+    pt_i2 = &Im[4];
+
+
+    for (i = 4; i != 0; i--)
+    {
+        temp1 = *(pt_Z++);
+        temp2 = *(pt_Q++);
+        temp3 = *(pt_Z++);
+        temp4 = *(pt_Q++);
+
+        *(pt_r1++) = temp1 + temp2;  /* Z(n) + Z(n+4) */
+        *(pt_i1++) = temp3 + temp4;
+        *(pt_r2++) = temp1 - temp2;  /* Z(n) - Z(n+4) */
+        *(pt_i2++) = temp3 - temp4;
+    }
+
+}
+
+#endif  /* PARAMETRICSTEREO */
+
+
+#endif  /* AAC_PLUS */
diff --git a/media/libstagefright/codecs/aacdec/ps_fft_rx8.h b/media/libstagefright/codecs/aacdec/ps_fft_rx8.h
new file mode 100644
index 0000000..6c3482e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_fft_rx8.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_fft_rx8.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions ps_fft_rx8()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_FFT_RX8_H
+#define PS_FFT_RX8_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_fft_rx8(Int32 Re[], Int32 Im[], Int32 scratch_mem[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_FFT_RX4_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.cpp b/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.cpp
new file mode 100644
index 0000000..933b07e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.cpp
@@ -0,0 +1,285 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_hybrid_analysis.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Does Hybrid analysis:
+
+        Get higher frequency resolution in the lower QMF subbands
+        creating sub-subbands. This is done by low frequency filtering.
+        Lower QMF subbands are further split in order to obtain a higher
+        frequency resolution, enabling a proper stereo analysis and synthesis
+        for the lower frequencies.
+        Two hybrid are defined. Both filters have length 13 and a delay of 6.
+        In this implementation, the symmetry of the filters helps to simplify
+        the design.
+
+
+   Increase Freq. Resolution
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+
+          subband k             QMF channel
+             0   .................  0      -----------
+             1   .................  0
+             2   .................  0
+             3   .................  0
+             4   .................  0
+             5   .................  0        Sub-QMF  ( Increase Freq. Resolution)
+             6   .................  1
+             7   .................  1
+             8   .................  2
+             9   .................  2
+            10   .................  3      -----------
+            11   .................  4
+            12   .................  5
+            13   .................  6
+            14   .................  7
+            15   .................  8         QMF
+           16-17 .................  9-10
+           18-20 ................. 11-13
+           21-24 ................. 14-17
+           25-29 ................. 18-22
+           30-41 ................. 23-34
+           42-70 ................. 35-63   -----------
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "s_hybrid.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_channel_filtering.h"
+#include    "ps_hybrid_analysis.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 ps_hybrid_analysis(const Int32 mQmfReal[][64],
+                        const Int32 mQmfImag[][64],
+                        Int32 *mHybridReal,
+                        Int32 *mHybridImag,
+                        HYBRID *pHybrid,
+                        Int32 scratch_mem[],
+                        Int32 i)
+
+{
+
+    Int32 band;
+    HYBRID_RES hybridRes;
+    Int32  chOffset = 0;
+
+    Int32 *ptr_mHybrid_Re;
+    Int32 *ptr_mHybrid_Im;
+
+    Int32 *pt_mQmfBufferReal;
+    Int32 *pt_mQmfBufferImag;
+
+    pt_mQmfBufferReal = &scratch_mem[32 + i];
+
+    for (band = 0; band < pHybrid->nQmfBands; band++)
+    {
+        pt_mQmfBufferImag = pt_mQmfBufferReal + 44;
+
+
+        pt_mQmfBufferReal[HYBRID_FILTER_LENGTH_m_1] = mQmfReal[HYBRID_FILTER_DELAY][band];
+        pt_mQmfBufferImag[HYBRID_FILTER_LENGTH_m_1] = mQmfImag[HYBRID_FILTER_DELAY][band];
+
+
+        ptr_mHybrid_Re = &mHybridReal[ chOffset];
+        ptr_mHybrid_Im = &mHybridImag[ chOffset];
+
+        hybridRes = (HYBRID_RES)pHybrid->pResolution[band];
+        switch (hybridRes)
+        {
+                /*
+                 *  For QMF band = 1  and  2
+                 */
+
+            case HYBRID_2_REAL:
+
+                two_ch_filtering(pt_mQmfBufferReal,
+                                 pt_mQmfBufferImag,
+                                 ptr_mHybrid_Re,
+                                 ptr_mHybrid_Im);
+                chOffset += 2;
+
+                break;
+
+                /*
+                 *  For QMF band = 0
+                 */
+
+            case HYBRID_8_CPLX:
+
+                eight_ch_filtering(pt_mQmfBufferReal,
+                                   pt_mQmfBufferImag,
+                                   pHybrid->mTempReal,
+                                   pHybrid->mTempImag,
+                                   scratch_mem);
+
+                pv_memmove(ptr_mHybrid_Re, pHybrid->mTempReal, 4*sizeof(*pHybrid->mTempReal));
+
+                ptr_mHybrid_Re += 2;
+
+                *(ptr_mHybrid_Re++) +=  pHybrid->mTempReal[5];
+                *(ptr_mHybrid_Re++) +=  pHybrid->mTempReal[4];
+                *(ptr_mHybrid_Re++)  =  pHybrid->mTempReal[6];
+                *(ptr_mHybrid_Re)  =  pHybrid->mTempReal[7];
+
+                pv_memmove(ptr_mHybrid_Im, pHybrid->mTempImag, 4*sizeof(*pHybrid->mTempImag));
+                ptr_mHybrid_Im += 2;
+
+                *(ptr_mHybrid_Im++) +=  pHybrid->mTempImag[5];
+                *(ptr_mHybrid_Im++) +=  pHybrid->mTempImag[4];
+                *(ptr_mHybrid_Im++)  =  pHybrid->mTempImag[6];
+                *(ptr_mHybrid_Im)  =  pHybrid->mTempImag[7];
+
+                chOffset += 6;
+
+                break;
+
+            default:
+                ;
+        }
+
+        pt_mQmfBufferReal = pt_mQmfBufferImag + 44;
+
+    }
+
+
+}
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.h b/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.h
new file mode 100644
index 0000000..0140a1f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_analysis.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_hybrid_analysis.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_hybrid_analysis()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_HYBRID_ANALYSIS_H
+#define PS_HYBRID_ANALYSIS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_hybrid.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_hybrid_analysis(const Int32 mQmfReal[][64],
+    const Int32 mQmfImag[][64],
+    Int32 *mHybridReal,
+    Int32 *mHybridImag,
+    HYBRID *pHybrid,
+    Int32 scratch_mem[],
+    Int32 band);
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_HYBRID_ANALYSIS_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.cpp b/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.cpp
new file mode 100644
index 0000000..4ff2385
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.cpp
@@ -0,0 +1,213 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_hybrid_filter_bank_allocation.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Does Hybrid filter bank memory allocation
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+#include    "aac_mem_funcs.h"
+#include    "ps_hybrid_filter_bank_allocation.h"
+#include    "ps_all_pass_filter_coeff.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
+----------------------------------------------------------------------------*/
+
+Int32 ps_hybrid_filter_bank_allocation(HYBRID **phHybrid,
+                                       Int32 noBands,
+                                       const Int32 *pResolution,
+                                       Int32 **pPtr)
+{
+    Int32 i;
+    Int32 tmp;
+    Int32 maxNoChannels = 0;
+    HYBRID *hs;
+    Int32 *ptr = *pPtr;
+
+
+    *phHybrid = (HYBRID *)NULL;
+
+    hs = (HYBRID *)ptr;
+
+    ptr += sizeof(HYBRID) / sizeof(*ptr);
+
+    hs->pResolution = (Int32*)ptr;
+
+    ptr += noBands * sizeof(Int32) / sizeof(*ptr);
+
+    for (i = 0; i < noBands; i++)
+    {
+
+        hs->pResolution[i] = pResolution[i];
+
+        if (pResolution[i] != HYBRID_8_CPLX &&
+                pResolution[i] != HYBRID_2_REAL &&
+                pResolution[i] != HYBRID_4_CPLX)
+        {
+            return 1;
+        }
+
+        if (pResolution[i] > maxNoChannels)
+        {
+            maxNoChannels = pResolution[i];
+        }
+    }
+
+    hs->nQmfBands     = noBands;
+    hs->qmfBufferMove = HYBRID_FILTER_LENGTH - 1;
+
+    hs->mQmfBufferReal = (Int32 **)ptr;
+    ptr += noBands * sizeof(ptr) / sizeof(*ptr);
+
+    hs->mQmfBufferImag = (Int32 **)ptr;
+    ptr += noBands * sizeof(ptr) / sizeof(*ptr);
+
+    tmp = hs->qmfBufferMove;        /*  HYBRID_FILTER_LENGTH == 13 */
+
+    for (i = 0; i < noBands; i++)
+    {
+        hs->mQmfBufferReal[i] = ptr;
+        ptr += tmp;
+
+        hs->mQmfBufferImag[i] = ptr;
+        ptr += tmp;
+
+    }
+
+    hs->mTempReal = ptr;
+    ptr += maxNoChannels;
+
+
+    hs->mTempImag = ptr;
+    ptr += maxNoChannels;
+
+
+    *phHybrid = hs;
+    *pPtr = ptr;
+
+    return 0;
+}
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.h b/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.h
new file mode 100644
index 0000000..fbc0d80c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_filter_bank_allocation.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_hybrid_filter_bank_allocation.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for ps_hybrid_filter_bank_allocation
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_HYBRID_FILTER_BANK_ALLOCATION_H
+#define PS_HYBRID_FILTER_BANK_ALLOCATION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_hybrid.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int32 ps_hybrid_filter_bank_allocation(HYBRID **phHybrid,
+    Int32 noBands,
+    const Int32 *pResolution,
+    Int32 **pPtr);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_HYBRID_FILTER_BANK_ALLOCATION_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.cpp b/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.cpp
new file mode 100644
index 0000000..4fbd016
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_hybrid_synthesis.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Hybrid synthesis
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include "s_hybrid.h"
+#include "ps_hybrid_synthesis.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/*----------------------------------------------------------------------------
+; 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 ps_hybrid_synthesis(const Int32 *mHybridReal,
+                         const Int32 *mHybridImag,
+                         Int32 *mQmfReal,
+                         Int32 *mQmfImag,
+                         HYBRID *hHybrid)
+{
+    Int32  k;
+    Int32  band;
+    HYBRID_RES hybridRes;
+
+    Int32 real;
+    Int32 imag;
+    Int32 *ptr_mQmfReal = mQmfReal;
+    Int32 *ptr_mQmfImag = mQmfImag;
+    const Int32 *ptr_mHybrid_Re = mHybridReal;
+    const Int32 *ptr_mHybrid_Im = mHybridImag;
+
+    for (band = 0; band < hHybrid->nQmfBands; band++)
+    {
+        hybridRes = (HYBRID_RES)(min(hHybrid->pResolution[band], 6) - 2);
+
+        real  = *(ptr_mHybrid_Re++);
+        real += *(ptr_mHybrid_Re++);
+        imag  = *(ptr_mHybrid_Im++);
+        imag += *(ptr_mHybrid_Im++);
+
+        for (k = (hybridRes >> 1); k != 0; k--)    /*  hybridRes = { 2,4,6 }  */
+        {
+            real += *(ptr_mHybrid_Re++);
+            real += *(ptr_mHybrid_Re++);
+            imag += *(ptr_mHybrid_Im++);
+            imag += *(ptr_mHybrid_Im++);
+        }
+
+        *(ptr_mQmfReal++) = real;
+        *(ptr_mQmfImag++) = imag;
+    }
+}
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.h b/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.h
new file mode 100644
index 0000000..d7242dd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_hybrid_synthesis.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_hybrid_synthesis.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_hybrid_synthesis()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_HYBRID_SYNTHESIS_H
+#define PS_HYBRID_SYNTHESIS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_hybrid.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_hybrid_synthesis(const Int32 *mHybridReal,
+    const Int32 *mHybridImag,
+    Int32 *mQmfReal,
+    Int32 *mQmfImag,
+    HYBRID *hHybrid);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_HYBRID_SYNTHESIS_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.cpp b/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.cpp
new file mode 100644
index 0000000..7027b5c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_init_stereo_mixing.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+      initialize mixing procedure  type Ra, type Rb is not supported
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "pv_audio_type_defs.h"
+#include    "fxp_mul32.h"
+
+#include    "aac_mem_funcs.h"
+#include    "pv_sine.h"
+#include    "s_ps_dec.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_init_stereo_mixing.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
+----------------------------------------------------------------------------*/
+
+/*
+;
+;  c(b) = 10^(iid(b)/20)
+;
+;  Intensity differences
+;
+;                  sqrt(2)
+;   c_1(b) = ----------------
+;            sqrt( 1 + c^2(b))
+;
+;               sqrt(2)*c(b)
+;   c_2(b) = ----------------
+;            sqrt( 1 + c^2(b))
+;
+*/
+
+
+
+#define R_SHIFT     30
+#define Q30_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+const Int32 scaleFactors[NO_IID_LEVELS] =
+{
+    Q30_fmt(1.411983f),  Q30_fmt(1.403138f),  Q30_fmt(1.386877f),
+    Q30_fmt(1.348400f),  Q30_fmt(1.291249f),  Q30_fmt(1.196037f),
+    Q30_fmt(1.107372f),  Q30_fmt(1.000000f),  Q30_fmt(0.879617f),
+    Q30_fmt(0.754649f),  Q30_fmt(0.576780f),  Q30_fmt(0.426401f),
+    Q30_fmt(0.276718f),  Q30_fmt(0.176645f),  Q30_fmt(0.079402f)
+};
+
+const Int32 scaleFactorsFine[NO_IID_LEVELS_FINE] =
+{
+    Q30_fmt(1.414207f),  Q30_fmt(1.414191f),  Q30_fmt(1.414143f),
+    Q30_fmt(1.413990f),  Q30_fmt(1.413507f),  Q30_fmt(1.411983f),
+    Q30_fmt(1.409773f),  Q30_fmt(1.405395f),  Q30_fmt(1.396780f),
+    Q30_fmt(1.380053f),  Q30_fmt(1.348400f),  Q30_fmt(1.313920f),
+    Q30_fmt(1.264310f),  Q30_fmt(1.196037f),  Q30_fmt(1.107372f),
+    Q30_fmt(1.000000f),  Q30_fmt(0.879617f),  Q30_fmt(0.754649f),
+    Q30_fmt(0.633656f),  Q30_fmt(0.523081f),  Q30_fmt(0.426401f),
+    Q30_fmt(0.308955f),  Q30_fmt(0.221375f),  Q30_fmt(0.157688f),
+    Q30_fmt(0.111982f),  Q30_fmt(0.079402f),  Q30_fmt(0.044699f),
+    Q30_fmt(0.025145f),  Q30_fmt(0.014141f),  Q30_fmt(0.007953f),
+    Q30_fmt(0.004472f)
+};
+
+
+/*
+ *  alphas ranged between 0 and pi/2
+ *  alpha(b) = (1/2)*arccos( gamma(b))
+ *
+ *    b   0    1      2        3        4      5        6     7
+ *  gamma 1 0.937  0.84118  0.60092  0.36764   0    -0.589   -1
+ *
+ */
+
+
+
+const Int32 scaled_alphas[NO_ICC_LEVELS] =
+{
+    Q30_fmt(0.00000000000000f),  Q30_fmt(0.12616764875355f),
+    Q30_fmt(0.20199707286122f),  Q30_fmt(0.32744135137762f),
+    Q30_fmt(0.42225800677370f),  Q30_fmt(0.55536025173035f),
+    Q30_fmt(0.77803595530059f),  Q30_fmt(1.11072050346071f)
+};
+
+const Int32 cos_alphas[NO_ICC_LEVELS] =
+{
+    Q30_fmt(1.00000000000000f),  Q30_fmt(0.98412391153249f),
+    Q30_fmt(0.95947390717984f),  Q30_fmt(0.89468446298319f),
+    Q30_fmt(0.82693418207478f),  Q30_fmt(0.70710689672598f),
+    Q30_fmt(0.45332071670080f),  Q30_fmt(0.00000032679490f)
+};
+
+const Int32 sin_alphas[NO_ICC_LEVELS] =
+{
+    Q30_fmt(0.00000000000000f),  Q30_fmt(0.17748275057029f),
+    Q30_fmt(0.28179748302823f),  Q30_fmt(0.44669868110000f),
+    Q30_fmt(0.56229872711603f),  Q30_fmt(0.70710666564709f),
+    Q30_fmt(0.89134747871404f),  Q30_fmt(1.00000000000000f)
+};
+
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int32 ps_init_stereo_mixing(STRUCT_PS_DEC *pms,
+                            Int32 env,
+                            Int32 usb)
+{
+    Int32   group;
+    Int32   bin;
+    Int32   noIidSteps;
+    Int32   tmp;
+
+    Int32   invEnvLength;
+    const Int32  *pScaleFactors;
+    Int32   scaleR;
+    Int32   scaleL;
+    Int32   cos_alpha;
+    Int32   sin_alpha;
+    Int32   beta;
+    Int32   cos_beta;
+    Int32   sin_beta;
+    Int32   temp1;
+    Int32   temp2;
+    Int32   *ptr_tmp;
+    Int32   h11;
+    Int32   h12;
+    Int32   h21;
+    Int32   h22;
+
+    if (pms->bFineIidQ)
+    {
+        noIidSteps = NO_IID_STEPS_FINE;     /*  NO_IID_STEPS_FINE == 15  */
+        pScaleFactors = scaleFactorsFine;
+    }
+    else
+    {
+        noIidSteps = NO_IID_STEPS;          /*  NO_IID_STEPS == 7   */
+        pScaleFactors = scaleFactors;
+    }
+
+    if (env == 0)
+    {
+        pms->lastUsb = pms->usb;
+        pms->usb = usb;
+        if (usb != pms->lastUsb && pms->lastUsb != 0)
+        {
+            return(-1);
+
+        }
+    }
+
+    invEnvLength =  pms->aEnvStartStop[env + 1] - pms->aEnvStartStop[env];
+
+    if (invEnvLength == (Int32) pms->noSubSamples)
+    {
+        invEnvLength = pms->invNoSubSamples;
+    }
+    else
+    {
+        invEnvLength = Q30_fmt(1.0f) / invEnvLength;
+    }
+
+    if (invEnvLength == 32)     /*  more likely value  */
+    {
+        for (group = 0; group < NO_IID_GROUPS; group++)      /* == 22 */
+        {
+            bin = bins2groupMap[group];
+
+            /*
+             *  c(b) = 10^(iid(b)/20)
+             */
+
+            tmp = pms->aaIidIndex[env][bin];
+
+            /*
+             *  Intensity differences
+             *
+             *                  sqrt(2)
+             *   c_1(b) = ----------------
+             *            sqrt( 1 + c^2(b))
+             *
+             */
+            scaleR = pScaleFactors[noIidSteps + tmp];
+
+            /*
+             *               sqrt(2)*c(b)
+             *   c_2(b) = ----------------
+             *            sqrt( 1 + c^2(b))
+             *
+             */
+
+            scaleL = pScaleFactors[noIidSteps - tmp];
+
+
+            /*
+             *  alpha(b) = (1/2)*arccos( gamma(b))
+             */
+            tmp = pms->aaIccIndex[env][bin];
+
+            cos_alpha = cos_alphas[ tmp];
+            sin_alpha = sin_alphas[ tmp];
+
+            /*
+             *   beta(b) = alpha(b)/sqrt(2)*( c_1(b) - c_2(b))
+             */
+
+            beta   = fxp_mul32_Q30(scaled_alphas[ tmp], (scaleR - scaleL));
+
+            cos_beta = pv_cosine(beta);
+            sin_beta = pv_sine(beta);
+
+            temp1 = fxp_mul32_Q30(cos_beta, cos_alpha);
+            temp2 = fxp_mul32_Q30(sin_beta, sin_alpha);
+
+
+            /*
+             *  h11(b) = cos( alpha(b) +  beta(b))* c_2(b)
+             *  h12(b) = cos(  beta(b) - alpha(b))* c_1(b)
+             */
+
+            h11 = fxp_mul32_Q30(scaleL, (temp1 - temp2));
+            h12 = fxp_mul32_Q30(scaleR, (temp1 + temp2));
+
+            temp1 = fxp_mul32_Q30(sin_beta, cos_alpha);
+            temp2 = fxp_mul32_Q30(cos_beta, sin_alpha);
+
+            /*
+             *  h21(b) = sin( alpha(b) +  beta(b))* c_2(b)
+             *  h22(b) = sin(  beta(b) - alpha(b))* c_1(b)
+             */
+
+            h21 = fxp_mul32_Q30(scaleL, (temp1 + temp2));
+            h22 = fxp_mul32_Q30(scaleR, (temp1 - temp2));
+
+
+            /*
+             *   Linear interpolation
+             *
+             *                                       Hij(k, n_e+1) - Hij(k, n_e)
+             *    Hij(k,n) = Hij(k, n_e) + (n - n_e)*---------------------------
+             *                                              n_e+1 - n_e
+             */
+
+            ptr_tmp = &pms->h11Prev[group];
+            pms->H11[group]       = *ptr_tmp;
+            pms->deltaH11[group]  = (h11 - *ptr_tmp) >> 5;
+            *ptr_tmp              = h11;
+
+            ptr_tmp = &pms->h12Prev[group];
+            pms->H12[group]       = *ptr_tmp;
+            pms->deltaH12[group]  = (h12 - *ptr_tmp) >> 5;
+            *ptr_tmp              = h12;
+
+            ptr_tmp = &pms->h21Prev[group];
+            pms->H21[group]       = *ptr_tmp;
+            pms->deltaH21[group]  = (h21 - *ptr_tmp) >> 5;
+            *ptr_tmp              = h21;
+
+            ptr_tmp = &pms->h22Prev[group];
+            pms->H22[group]       = *ptr_tmp;
+            pms->deltaH22[group]  = (h22 - *ptr_tmp) >> 5;
+            *ptr_tmp              = h22;
+
+
+        } /* groups loop */
+    }
+    else
+    {
+
+        for (group = 0; group < NO_IID_GROUPS; group++)      /* == 22 */
+        {
+            bin = bins2groupMap[group];
+
+            /*
+             *  c(b) = 10^(iid(b)/20)
+             */
+
+            tmp = pms->aaIidIndex[env][bin];
+
+            /*
+             *  Intensity differences
+             *
+             *                  sqrt(2)
+             *   c_1(b) = ----------------
+             *            sqrt( 1 + c^2(b))
+             *
+             */
+            scaleR = pScaleFactors[noIidSteps + tmp];
+
+            /*
+             *               sqrt(2)*c(b)
+             *   c_2(b) = ----------------
+             *            sqrt( 1 + c^2(b))
+             *
+             */
+
+            scaleL = pScaleFactors[noIidSteps - tmp];
+
+
+            /*
+             *  alpha(b) = (1/2)*arccos( gamma(b))
+             */
+            tmp = pms->aaIccIndex[env][bin];
+
+            cos_alpha = cos_alphas[ tmp];
+            sin_alpha = sin_alphas[ tmp];
+
+            /*
+             *   beta(b) = alpha(b)/sqrt(2)*( c_1(b) - c_2(b))
+             */
+
+            beta   = fxp_mul32_Q30(scaled_alphas[ tmp], (scaleR - scaleL));
+
+            cos_beta = pv_cosine(beta);
+            sin_beta = pv_sine(beta);
+
+            temp1 = fxp_mul32_Q30(cos_beta, cos_alpha);
+            temp2 = fxp_mul32_Q30(sin_beta, sin_alpha);
+
+
+            /*
+             *  h11(b) = cos( alpha(b) +  beta(b))* c_2(b)
+             *  h12(b) = cos(  beta(b) - alpha(b))* c_1(b)
+             */
+
+            h11 = fxp_mul32_Q30(scaleL, (temp1 - temp2));
+            h12 = fxp_mul32_Q30(scaleR, (temp1 + temp2));
+
+            temp1 = fxp_mul32_Q30(sin_beta, cos_alpha);
+            temp2 = fxp_mul32_Q30(cos_beta, sin_alpha);
+
+            /*
+             *  h21(b) = sin( alpha(b) +  beta(b))* c_2(b)
+             *  h22(b) = sin(  beta(b) - alpha(b))* c_1(b)
+             */
+
+            h21 = fxp_mul32_Q30(scaleL, (temp1 + temp2));
+            h22 = fxp_mul32_Q30(scaleR, (temp1 - temp2));
+
+
+            /*
+             *   Linear interpolation
+             *
+             *                                       Hij(k, n_e+1) - Hij(k, n_e)
+             *    Hij(k,n) = Hij(k, n_e) + (n - n_e)*---------------------------
+             *                                              n_e+1 - n_e
+             */
+
+            ptr_tmp = &pms->h11Prev[group];
+            pms->deltaH11[group]  = fxp_mul32_Q30((h11 - *ptr_tmp), invEnvLength);
+            pms->H11[group]       = *ptr_tmp;
+            *ptr_tmp              = h11;
+
+            ptr_tmp = &pms->h12Prev[group];
+            pms->deltaH12[group]  = fxp_mul32_Q30((h12 - *ptr_tmp), invEnvLength);
+            pms->H12[group]       = *ptr_tmp;
+            *ptr_tmp              = h12;
+
+            ptr_tmp = &pms->h21Prev[group];
+            pms->deltaH21[group]  = fxp_mul32_Q30((h21 - *ptr_tmp), invEnvLength);
+            pms->H21[group]       = *ptr_tmp;
+            *ptr_tmp              = h21;
+
+            ptr_tmp = &pms->h22Prev[group];
+            pms->deltaH22[group]  = fxp_mul32_Q30((h22 - *ptr_tmp), invEnvLength);
+            pms->H22[group]       = *ptr_tmp;
+            *ptr_tmp              = h22;
+
+
+        } /* groups loop */
+    }
+
+
+    return (0);
+
+} /* END ps_init_stereo_mixing */
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.h b/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.h
new file mode 100644
index 0000000..6c30781
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_init_stereo_mixing.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_init_stereo_mixing.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions ps_init_stereo_mixing()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_INIT_STEREO_MIXING_H
+#define PS_INIT_STEREO_MIXING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int32 ps_init_stereo_mixing(STRUCT_PS_DEC *pms,
+    Int32 env,
+    Int32 usb);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_INIT_STEREO_MIXING_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.cpp b/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.cpp
new file mode 100644
index 0000000..a0e8c38
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.cpp
@@ -0,0 +1,340 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_pwr_transient_detection.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Decorrelation
+  Decorrelation is achieved by means of all-pass filtering and delaying
+  Sub-band samples s_k(n) are converted into de-correlated sub-bands samples
+  d_k(n). k index for frequency, n time index
+
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+  To handle transients and other fast time-envelopes, the output of the all
+  pass filters has to be attenuated at those signals.
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "pv_audio_type_defs.h"
+#include    "s_ps_dec.h"
+#include    "aac_mem_funcs.h"
+#include    "ps_all_pass_filter_coeff.h"
+#include    "ps_pwr_transient_detection.h"
+
+#include    "fxp_mul32.h"
+#include    "pv_div.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     29
+#define Q29_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Qfmt31(a)   (Int32)(-a*((Int32)1<<31) - 1 + (a>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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 ps_pwr_transient_detection(STRUCT_PS_DEC *h_ps_dec,
+                                Int32 *rIntBufferLeft,
+                                Int32 *iIntBufferLeft,
+                                Int32 aTransRatio[])
+{
+
+    Int32 sb;
+    Int32 maxsb;
+    Int32 gr;
+    Int32 bin;
+
+
+
+    Int32 *aLeftReal;
+    Int32 *aLeftImag;
+    Int32   temp_r;
+    Int32   temp_i;
+    Int32   accu;
+    Int32 *aPower = aTransRatio;
+    Quotient result;
+
+    Int32 nrg;
+    Int32 *ptr_aPrevNrg;
+    Int32 peakDiff;
+    Int32 *ptr_PrevPeakDiff;
+
+
+    aLeftReal = rIntBufferLeft;
+    aLeftImag = iIntBufferLeft;
+
+    /*
+     *  Input Power Matrix
+     *                            2
+     *  Power(i,n) = SUM | s_k(n)|
+     *                i
+     */
+
+    for (gr = SUBQMF_GROUPS; gr < NO_IID_GROUPS; gr++) /* 10 to 22  */
+    {
+        maxsb = min(h_ps_dec->usb, groupBorders[ gr+1]);
+
+        accu = 0;
+
+        for (sb = groupBorders[gr]; sb < maxsb; sb++)
+        {
+
+            temp_r = aLeftReal[sb];
+            temp_i = aLeftImag[sb];
+            accu =  fxp_mac32_Q31(accu, temp_r, temp_r);
+            accu =  fxp_mac32_Q31(accu, temp_i, temp_i);
+
+        } /* sb */
+        aPower[gr - 2] = accu >> 1;
+    } /* gr */
+
+    aLeftReal = h_ps_dec->mHybridRealLeft;
+    aLeftImag = h_ps_dec->mHybridImagLeft;
+
+
+    temp_r = aLeftReal[0];
+    temp_i = aLeftImag[0];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    accu  = fxp_mac32_Q31(accu, temp_i, temp_i);
+    temp_r = aLeftReal[5];
+    temp_i = aLeftImag[5];
+    accu   = fxp_mac32_Q31(accu, temp_r, temp_r);
+    aPower[0]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[1];
+    temp_i = aLeftImag[1];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    accu  = fxp_mac32_Q31(accu, temp_i, temp_i);
+    temp_r = aLeftReal[4];
+    temp_i = aLeftImag[4];
+    accu   = fxp_mac32_Q31(accu, temp_r, temp_r);
+    aPower[1]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[2];
+    temp_i = aLeftImag[2];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[2]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[3];
+    temp_i = aLeftImag[3];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[3]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+
+
+    temp_r = aLeftReal[6];
+    temp_i = aLeftImag[6];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[5]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[7];
+    temp_i = aLeftImag[7];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[4]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[8];
+    temp_i = aLeftImag[8];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[6]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+    temp_r = aLeftReal[9];
+    temp_i = aLeftImag[9];
+    accu   = fxp_mul32_Q31(temp_r, temp_r);
+    aPower[7]  = fxp_mac32_Q31(accu, temp_i, temp_i) >> 1;
+
+
+    /*
+     *  Power transient detection
+     */
+
+    ptr_aPrevNrg = h_ps_dec->aPrevNrg;
+
+    ptr_PrevPeakDiff = h_ps_dec->aPrevPeakDiff;
+
+    for (bin = 0; bin < NO_BINS; bin++) /* NO_BINS = 20  */
+    {
+
+        peakDiff  = *ptr_PrevPeakDiff;
+
+
+        /* PEAK_DECAY_FACTOR  0.765928338364649f @ 48 KHz  for Fs > 32 Khz */
+        accu = h_ps_dec->aPeakDecayFast[bin];
+        peakDiff -= peakDiff >> 2;
+
+        accu  = fxp_mul32_Q31(accu, Qfmt31(0.765928338364649f)) << 1;
+
+        if (accu < *aPower)
+        {
+            accu = *aPower;
+        }
+        else
+        {
+            peakDiff += ((accu - *aPower) >> 2);
+        }
+
+        h_ps_dec->aPeakDecayFast[bin] = accu;
+
+        *(ptr_PrevPeakDiff++) = peakDiff;
+
+        nrg =   *ptr_aPrevNrg + ((*aPower - *ptr_aPrevNrg) >> 2);
+
+        *(ptr_aPrevNrg++) = nrg;
+
+        peakDiff += peakDiff >> 1;         /* transient impact factor == 1.5 */
+
+        if (peakDiff <= nrg)
+        {
+            *(aPower++) = 0x7FFFFFFF;    /* in Q31  */
+        }
+        else
+        {
+            pv_div(nrg, peakDiff, &result);
+            *(aPower++) = (result.quotient >> (result.shift_factor)) << 1;    /* in Q31  */
+        }
+
+    } /* bin */
+
+}
+
+
+#endif
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.h b/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.h
new file mode 100644
index 0000000..80a73a8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_pwr_transient_detection.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_pwr_transient_detection.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_pwr_transient_detection()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_PWR_TRANSIENT_DETECTION_H
+#define PS_PWR_TRANSIENT_DETECTION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_pwr_transient_detection(STRUCT_PS_DEC *h_ps_dec,
+    Int32 *rIntBufferLeft,
+    Int32 *iIntBufferLeft,
+    Int32 aTransRatio[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_PWR_TRANSIENT_DETECTION_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_read_data.cpp b/media/libstagefright/codecs/aacdec/ps_read_data.cpp
new file mode 100644
index 0000000..c49eb3d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_read_data.cpp
@@ -0,0 +1,388 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_read_data.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Decodes parametric stereo
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include    "pv_audio_type_defs.h"
+#include    "buf_getbits.h"
+#include    "s_bit_buffer.h"
+#include    "s_huffman.h"
+#include    "aac_mem_funcs.h"
+#include    "s_ps_dec.h"
+#include    "sbr_decode_huff_cw.h"
+#include    "ps_decode_bs_utils.h"
+#include    "ps_bstr_decoding.h"
+#include    "ps_read_data.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
+----------------------------------------------------------------------------*/
+
+/* IID & ICC Huffman codebooks */
+const Char aBookPsIidTimeDecode[28][2] =
+{
+    { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
+    { -62,   5 },    { -67,   6 },    { -61,   7 },    { -68,   8 },
+    { -60,   9 },    { -69,  10 },    { -59,  11 },    { -70,  12 },
+    { -58,  13 },    { -57,  14 },    { -71,  15 },    {  16,  17 },
+    { -56, -72 },    {  18,  21 },    {  19,  20 },    { -55, -78 },
+    { -77, -76 },    {  22,  25 },    {  23,  24 },    { -75, -74 },
+    { -73, -54 },    {  26,  27 },    { -53, -52 },    { -51, -50 }
+};
+
+const Char aBookPsIidFreqDecode[28][2] =
+{
+    { -64,   1 },    {   2,   3 },    { -63, -65 },    {   4,   5 },
+    { -62, -66 },    {   6,   7 },    { -61, -67 },    {   8,   9 },
+    { -68, -60 },    { -59,  10 },    { -69,  11 },    { -58,  12 },
+    { -70,  13 },    { -71,  14 },    { -57,  15 },    {  16,  17 },
+    { -56, -72 },    {  18,  19 },    { -55, -54 },    {  20,  21 },
+    { -73, -53 },    {  22,  24 },    { -74,  23 },    { -75, -78 },
+    {  25,  26 },    { -77, -76 },    { -52,  27 },    { -51, -50 }
+};
+
+const Char aBookPsIccTimeDecode[14][2] =
+{
+    { -64,   1 },    { -63,   2 },    { -65,   3 },    { -62,   4 },
+    { -66,   5 },    { -61,   6 },    { -67,   7 },    { -60,   8 },
+    { -68,   9 },    { -59,  10 },    { -69,  11 },    { -58,  12 },
+    { -70,  13 },    { -71, -57 }
+};
+
+const Char aBookPsIccFreqDecode[14][2] =
+{
+    { -64,   1 },    { -63,   2 },    { -65,   3 },    { -62,   4 },
+    { -66,   5 },    { -61,   6 },    { -67,   7 },    { -60,   8 },
+    { -59,   9 },    { -68,  10 },    { -58,  11 },    { -69,  12 },
+    { -57,  13 },    { -70, -71 }
+};
+
+const Char aBookPsIidFineTimeDecode[60][2] =
+{
+    {   1, -64 },    { -63,   2 },    {   3, -65 },    {   4,  59 },
+    {   5,   7 },    {   6, -67 },    { -68, -60 },    { -61,   8 },
+    {   9,  11 },    { -59,  10 },    { -70, -58 },    {  12,  41 },
+    {  13,  20 },    {  14, -71 },    { -55,  15 },    { -53,  16 },
+    {  17, -77 },    {  18,  19 },    { -85, -84 },    { -46, -45 },
+    { -57,  21 },    {  22,  40 },    {  23,  29 },    { -51,  24 },
+    {  25,  26 },    { -83, -82 },    {  27,  28 },    { -90, -38 },
+    { -92, -91 },    {  30,  37 },    {  31,  34 },    {  32,  33 },
+    { -35, -34 },    { -37, -36 },    {  35,  36 },    { -94, -93 },
+    { -89, -39 },    {  38, -79 },    {  39, -81 },    { -88, -40 },
+    { -74, -54 },    {  42, -69 },    {  43,  44 },    { -72, -56 },
+    {  45,  52 },    {  46,  50 },    {  47, -76 },    { -49,  48 },
+    { -47,  49 },    { -87, -41 },    { -52,  51 },    { -78, -50 },
+    {  53, -73 },    {  54, -75 },    {  55,  57 },    {  56, -80 },
+    { -86, -42 },    { -48,  58 },    { -44, -43 },    { -66, -62 }
+};
+
+const Char aBookPsIidFineFreqDecode[60][2] =
+{
+    {   1, -64 },    {   2,   4 },    {   3, -65 },    { -66, -62 },
+    { -63,   5 },    {   6,   7 },    { -67, -61 },    {   8,   9 },
+    { -68, -60 },    {  10,  11 },    { -69, -59 },    {  12,  13 },
+    { -70, -58 },    {  14,  18 },    { -57,  15 },    {  16, -72 },
+    { -54,  17 },    { -75, -53 },    {  19,  37 },    { -56,  20 },
+    {  21, -73 },    {  22,  29 },    {  23, -76 },    {  24, -78 },
+    {  25,  28 },    {  26,  27 },    { -85, -43 },    { -83, -45 },
+    { -81, -47 },    { -52,  30 },    { -50,  31 },    {  32, -79 },
+    {  33,  34 },    { -82, -46 },    {  35,  36 },    { -90, -89 },
+    { -92, -91 },    {  38, -71 },    { -55,  39 },    {  40, -74 },
+    {  41,  50 },    {  42, -77 },    { -49,  43 },    {  44,  47 },
+    {  45,  46 },    { -86, -42 },    { -88, -87 },    {  48,  49 },
+    { -39, -38 },    { -41, -40 },    { -51,  51 },    {  52,  59 },
+    {  53,  56 },    {  54,  55 },    { -35, -34 },    { -37, -36 },
+    {  57,  58 },    { -94, -93 },    { -84, -44 },    { -80, -48 }
+};
+
+
+
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+Int32 ps_read_data(STRUCT_PS_DEC *ps_dec,
+                   BIT_BUFFER * hBitBuf,
+                   Int32 nBitsLeft)
+
+{
+    Int     gr;
+    UInt32     env;
+    UInt32     dtFlag;
+    Int32     startbits;
+    SbrHuffman CurrentTable;
+
+    if (!ps_dec)
+    {
+        return 0;
+    }
+
+    startbits = GetNrBitsAvailable(hBitBuf);
+
+    if (buf_get_1bit(hBitBuf))  /*  Enable Header */
+    {
+        ps_dec->bEnableIid = buf_get_1bit(hBitBuf);
+
+        if (ps_dec->bEnableIid)
+        {
+            ps_dec->freqResIid = buf_getbits(hBitBuf, 3);
+
+            if (ps_dec->freqResIid > 2)
+            {
+                ps_dec->bFineIidQ = 1;
+                ps_dec->freqResIid -= 3;
+            }
+            else
+            {
+                ps_dec->bFineIidQ = 0;
+            }
+        }
+
+        ps_dec->bEnableIcc = buf_get_1bit(hBitBuf);
+        if (ps_dec->bEnableIcc)
+        {
+            ps_dec->freqResIcc = buf_getbits(hBitBuf, 3);
+
+            if (ps_dec->freqResIcc > 2)
+            {
+                ps_dec->freqResIcc -= 3;
+            }
+        }
+        ps_dec->bEnableExt = buf_get_1bit(hBitBuf);
+    }
+
+    ps_dec->bFrameClass = buf_get_1bit(hBitBuf);
+    if (ps_dec->bFrameClass == 0)
+    {
+        ps_dec->noEnv = aFixNoEnvDecode[ buf_getbits(hBitBuf, 2)];
+    }
+    else
+    {
+        ps_dec->noEnv = 1 + buf_getbits(hBitBuf, 2);
+        for (env = 1; env < ps_dec->noEnv + 1; env++)
+        {
+            ps_dec->aEnvStartStop[env] = (buf_getbits(hBitBuf, 5)) + 1;
+        }
+    }
+
+    if ((ps_dec->freqResIid > 2) || (ps_dec->freqResIcc > 2))
+    {
+
+        ps_dec->bPsDataAvail = 0;
+
+        nBitsLeft -= startbits - GetNrBitsAvailable(hBitBuf);
+        while (nBitsLeft)
+        {
+            int i = nBitsLeft;
+            if (i > 8)
+            {
+                i = 8;
+            }
+            buf_getbits(hBitBuf, i);
+            nBitsLeft -= i;
+        }
+        return (startbits - GetNrBitsAvailable(hBitBuf));
+    }
+
+    if (ps_dec->bEnableIid)
+    {
+        for (env = 0; env < ps_dec->noEnv; env++)
+        {
+            dtFlag = buf_get_1bit(hBitBuf);
+
+            if (!dtFlag)
+            {
+                if (ps_dec->bFineIidQ)
+                {
+                    CurrentTable = aBookPsIidFineFreqDecode;
+                }
+                else
+                {
+                    CurrentTable = aBookPsIidFreqDecode;
+                }
+            }
+            else
+            {
+                if (ps_dec->bFineIidQ)
+                {
+                    CurrentTable = aBookPsIidFineTimeDecode;
+                }
+                else
+                {
+                    CurrentTable = aBookPsIidTimeDecode;
+                }
+            }
+
+            for (gr = 0; gr < aNoIidBins[ps_dec->freqResIid]; gr++)
+            {
+                ps_dec->aaIidIndex[env][gr] = sbr_decode_huff_cw(CurrentTable, hBitBuf);
+            }
+
+            ps_dec->abIidDtFlag[env] = dtFlag;
+        }
+    }
+
+    if (ps_dec->bEnableIcc)
+    {
+        for (env = 0; env < ps_dec->noEnv; env++)
+        {
+            dtFlag = buf_get_1bit(hBitBuf);
+            if (!dtFlag)
+            {
+                CurrentTable = aBookPsIccFreqDecode;
+            }
+            else
+            {
+                CurrentTable = aBookPsIccTimeDecode;
+            }
+            for (gr = 0; gr < aNoIccBins[ps_dec->freqResIcc]; gr++)
+            {
+                ps_dec->aaIccIndex[env][gr] = sbr_decode_huff_cw(CurrentTable, hBitBuf);
+            }
+
+            ps_dec->abIccDtFlag[env] = dtFlag;
+        }
+    }
+
+    if (ps_dec->bEnableExt)
+    {
+
+        int cnt;
+
+        cnt = (int)buf_getbits(hBitBuf, 4);
+
+        if (cnt == 15)
+        {
+            cnt += (int)buf_getbits(hBitBuf, 8);
+        }
+
+        hBitBuf->nrBitsRead += (cnt << 3);
+    }
+
+    ps_dec->bPsDataAvail = 1;
+
+    return (startbits - GetNrBitsAvailable(hBitBuf));
+}
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_read_data.h b/media/libstagefright/codecs/aacdec/ps_read_data.h
new file mode 100644
index 0000000..e2fec53
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_read_data.h
@@ -0,0 +1,100 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_read_data.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for functions ps_read_data()
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_READ_DATA_H
+#define PS_READ_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+#define EXTENSION_ID_PS_CODING   2
+
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+    Int32 ps_read_data(STRUCT_PS_DEC *ps_dec,
+    BIT_BUFFER * hBitBuf,
+    Int32 nBitsLeft);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_READ_DATA_H */
diff --git a/media/libstagefright/codecs/aacdec/ps_stereo_processing.cpp b/media/libstagefright/codecs/aacdec/ps_stereo_processing.cpp
new file mode 100644
index 0000000..813b55d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_stereo_processing.cpp
@@ -0,0 +1,372 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: ps_stereo_processing.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Stereo Process or reconstruction
+
+           l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
+
+           r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
+
+     _______                                              ________
+    |       |                                  _______   |        |
+  ->|Hybrid | LF ----                         |       |->| Hybrid |-->
+    | Anal. |        |                        |       |  | Synth  |   QMF -> L
+     -------         o----------------------->|       |   --------    Synth
+QMF                  |                s_k(n)  |Stereo |-------------->
+Anal.              -------------------------->|       |
+     _______       | |                        |       |   ________
+    |       | HF --o |   -----------          |Process|  |        |
+  ->| Delay |      |  ->|           |-------->|       |->| Hybrid |-->
+     -------       |    |decorrelate| d_k(n)  |       |  | Synth  |   QMF -> R
+                   ---->|           |-------->|       |   --------    Synth
+                         -----------          |_______|-------------->
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+#include    "pv_audio_type_defs.h"
+#include    "ps_stereo_processing.h"
+#include    "fxp_mul32.h"
+#include    "ps_all_pass_filter_coeff.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/*----------------------------------------------------------------------------
+; 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 ps_stereo_processing(STRUCT_PS_DEC  *pms,
+                          Int32          *qmfLeftReal,
+                          Int32          *qmfLeftImag,
+                          Int32          *qmfRightReal,
+                          Int32          *qmfRightImag)
+{
+    Int32     group;
+    Int32     subband;
+    Int32     maxSubband;
+    Int32     usb;
+    Char     index;
+
+
+    Int32  *hybrLeftReal;
+    Int32  *hybrLeftImag;
+    Int32  *hybrRightReal;
+    Int32  *hybrRightImag;
+    Int32  *ptr_hybrLeftReal;
+    Int32  *ptr_hybrLeftImag;
+    Int32  *ptr_hybrRightReal;
+    Int32  *ptr_hybrRightImag;
+
+
+    Int16   h11;
+    Int16   h12;
+    Int16   h21;
+    Int16   h22;
+
+    Int32   temp1;
+    Int32   temp2;
+    Int32   temp3;
+
+    usb = pms->usb;
+
+    /*
+     *   Complete Linear interpolation
+     */
+
+    hybrLeftReal  = pms->mHybridRealLeft;
+    hybrLeftImag  = pms->mHybridImagLeft;
+    hybrRightReal = pms->mHybridRealRight;
+    hybrRightImag = pms->mHybridImagRight;
+
+    for (group = 0; group < SUBQMF_GROUPS; group++)     /* SUBQMF_GROUPS == 10 */
+    {
+
+        temp1 = pms->deltaH11[group];
+        temp2 = pms->deltaH12[group];
+
+        pms->H11[group]  += temp1;
+        h11  = (Int16)(pms->H11[group] >> 16);
+        pms->H12[group]  += temp2;
+        h12  = (Int16)(pms->H12[group] >> 16);
+
+        temp1 = pms->deltaH21[group];
+        temp2 = pms->deltaH22[group];
+
+        pms->H21[group]  += temp1;
+        h21  = (Int16)(pms->H21[group] >> 16);
+        pms->H22[group]  += temp2;
+        h22  = (Int16)(pms->H22[group] >> 16);
+
+        index = groupBorders[group];
+
+        /*
+         *  Reconstruction of Stereo sub-band signal
+         *
+         *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
+         *
+         *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
+         */
+        ptr_hybrLeftReal  = &hybrLeftReal[  index];
+        ptr_hybrRightReal = &hybrRightReal[ index];
+
+        temp1 = *(ptr_hybrLeftReal) << 1;
+        temp2 = *(ptr_hybrRightReal) << 1;
+
+        temp3 = fxp_mul32_by_16(temp1, h11);
+        *(ptr_hybrLeftReal)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+        temp3 = fxp_mul32_by_16(temp1, h12);
+        *(ptr_hybrRightReal) = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+
+
+        ptr_hybrLeftImag  = &hybrLeftImag[  index];
+        ptr_hybrRightImag = &hybrRightImag[ index];
+
+        temp1 = *(ptr_hybrLeftImag) << 1;
+        temp2 = *(ptr_hybrRightImag) << 1;
+
+        temp3 = fxp_mul32_by_16(temp1, h11);
+        *(ptr_hybrLeftImag)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+        temp3 = fxp_mul32_by_16(temp1, h12);
+        *(ptr_hybrRightImag) = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+
+
+    } /* groups loop */
+
+    temp1 = pms->deltaH11[SUBQMF_GROUPS];
+    temp2 = pms->deltaH12[SUBQMF_GROUPS];
+
+    pms->H11[SUBQMF_GROUPS]  += temp1;
+    h11  = (Int16)(pms->H11[SUBQMF_GROUPS] >> 16);
+    pms->H12[SUBQMF_GROUPS]  += temp2;
+    h12  = (Int16)(pms->H12[SUBQMF_GROUPS] >> 16);
+
+    temp1 = pms->deltaH21[SUBQMF_GROUPS];
+    temp2 = pms->deltaH22[SUBQMF_GROUPS];
+
+    pms->H21[SUBQMF_GROUPS]  += temp1;
+    h21  = (Int16)(pms->H21[SUBQMF_GROUPS] >> 16);
+    pms->H22[SUBQMF_GROUPS]  += temp2;
+    h22  = (Int16)(pms->H22[SUBQMF_GROUPS] >> 16);
+
+
+    ptr_hybrLeftReal  = &qmfLeftReal[  3];
+    ptr_hybrRightReal = &qmfRightReal[ 3];
+
+    /*
+     *  Reconstruction of Stereo sub-band signal
+     *
+     *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
+     *
+     *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
+     */
+    temp1 = *(ptr_hybrLeftReal) << 1;
+    temp2 = *(ptr_hybrRightReal) << 1;
+
+
+    temp3 = fxp_mul32_by_16(temp1, h11);
+    *(ptr_hybrLeftReal)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+    temp3 = fxp_mul32_by_16(temp1, h12);
+    *(ptr_hybrRightReal)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+
+    ptr_hybrLeftImag  = &qmfLeftImag[  3];
+    ptr_hybrRightImag = &qmfRightImag[ 3];
+
+
+    temp1 = *(ptr_hybrLeftImag) << 1;
+    temp2 = *(ptr_hybrRightImag) << 1;
+
+    temp3 = fxp_mul32_by_16(temp1, h11);
+    *(ptr_hybrLeftImag)  = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+    temp3 = fxp_mul32_by_16(temp1, h12);
+    *(ptr_hybrRightImag)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+
+
+    for (group = SUBQMF_GROUPS + 1; group < NO_IID_GROUPS; group++)   /* 11 to NO_IID_GROUPS == 22 */
+    {
+        temp1 = pms->deltaH11[group];
+        temp2 = pms->deltaH12[group];
+
+        pms->H11[group]  += temp1;
+        h11  = (Int16)(pms->H11[group] >> 16);
+        pms->H12[group]  += temp2;
+        h12  = (Int16)(pms->H12[group] >> 16);
+
+        temp1 = pms->deltaH21[group];
+        temp2 = pms->deltaH22[group];
+
+        pms->H21[group]  += temp1;
+        h21  = (Int16)(pms->H21[group] >> 16);
+        pms->H22[group]  += temp2;
+        h22  = (Int16)(pms->H22[group] >> 16);
+
+        index = groupBorders[group];
+        maxSubband = groupBorders[group + 1];
+        maxSubband = min(usb, maxSubband);
+
+        /*
+         *  Reconstruction of Stereo sub-band signal
+         *
+         *  l_k(n) = H11(k,n)*s_k(n) + H21(k,n)*d_k(n)
+         *
+         *  r_k(n) = H12(k,n)*s_k(n) + H22(k,n)*d_k(n)
+         */
+
+        ptr_hybrLeftReal  = &qmfLeftReal[  index];
+        ptr_hybrRightReal = &qmfRightReal[ index];
+
+        for (subband = index; subband < maxSubband; subband++)
+        {
+            temp1 = *(ptr_hybrLeftReal) << 1;
+            temp2 = *(ptr_hybrRightReal) << 1;
+            temp3 = fxp_mul32_by_16(temp1, h11);
+            *(ptr_hybrLeftReal++)   = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+            temp3 = fxp_mul32_by_16(temp1, h12);
+            *(ptr_hybrRightReal++)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+        }
+
+        ptr_hybrLeftImag  = &qmfLeftImag[  index];
+        ptr_hybrRightImag = &qmfRightImag[ index];
+
+        for (subband = index; subband < maxSubband; subband++)
+        {
+            temp1 = *(ptr_hybrLeftImag) << 1;
+            temp2 = *(ptr_hybrRightImag) << 1;
+            temp3 = fxp_mul32_by_16(temp1, h11);
+            *(ptr_hybrLeftImag++)   = fxp_mac32_by_16(temp2, h21, temp3) << 1;
+
+            temp3 = fxp_mul32_by_16(temp1, h12);
+            *(ptr_hybrRightImag++)  = fxp_mac32_by_16(temp2, h22, temp3) << 1;
+
+        } /* subband loop */
+
+    } /* groups loop */
+
+} /* END ps_stereo_processing */
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/ps_stereo_processing.h b/media/libstagefright/codecs/aacdec/ps_stereo_processing.h
new file mode 100644
index 0000000..58b025a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/ps_stereo_processing.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ps_stereo_processing.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for function ps_stereo_processing()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PS_STEREO_PROCESSING_H
+#define PS_STEREO_PROCESSING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_ps_dec.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void ps_stereo_processing(STRUCT_PS_DEC  *pms,
+    Int32          *qmfLeftReal,
+    Int32          *qmfLeftImag,
+    Int32          *qmfRightReal,
+    Int32          *qmfRightImag);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* PS_STEREO_PROCESSING_H */
diff --git a/media/libstagefright/codecs/aacdec/pulse_nc.cpp b/media/libstagefright/codecs/aacdec/pulse_nc.cpp
new file mode 100644
index 0000000..87b264d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pulse_nc.cpp
@@ -0,0 +1,298 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pulse_nc.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Modified to pass variables by reference to eliminate use
+               of global variables.
+
+ Description:  Modified to bring code in-line with PV standards.
+
+ Description: Pass in max as input argument.
+
+ Description: Went back to the if-statement to check for max.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    coef[]         =  Array of quantized spectral coefficents.
+                      (Int [])
+
+    pPulseInfo     =  Pointer to structure which contains noiseless
+                      encoding info, includes information about the pulse data,
+                      pulse amplitude, etc.
+                      (const PulseInfo *)
+
+    pLongFrameInfo =  Pointer to structure that holds information about
+                      each group. (long block flag, number of windows,
+                      scalefactor bands per group, etc.)
+
+                      Variable is named (pLongFrameInfo) because this function
+                      is only used for LONG windows.
+                      (FrameInfo *)
+    max             = Pointer to the maximum value of coef[]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coef[]  =  coefficient contents are modified by the encoded pulse
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function adds pulses to defined ranges of coefficients in the window,
+ for the case of LONG windows.  The pulses are unsigned, so
+ negative coefficients subtract the pulse, and positive coefficients add it.
+ (The ampltiude of the coefficient is always increased by the pulse)
+
+ A maximum of 4 coefficients may be modified by a pulse, and these
+ coefficients must all occur in the same scalefactor band.
+
+ The number of pulse-encoded coefficients to be processed by this function
+ is communicated to this function via pPulseInfo->number_pulse
+
+ This value is equal to the actual number of pulses - 1.
+ (e.g if pPulseInfo->number_pulse == 0, one pulse is assumed)
+ This function must not be called if no pulse encoded data exists.
+ The function assumes that at least one pulse exists.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This module shall correctly add transmitted pulse(s) to the correct
+ coefficients in a LONG window.
+
+------------------------------------------------------------------------------
+ REFERENCES
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.3.3 Decoding Process
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb];
+
+    pPulseOffset = &(pPulseInfo->pulse_offset[0]);
+
+    pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
+
+    pCoef        = &(Coef[index]);
+
+    FOR (index = pPulseInfo->number_pulse; index >= 0; index--)
+
+        pCoef   = pCoef + *(pPulseOffset);
+        pPulseOffset = pPulseOffset + 1;
+
+        IF (*pCoef > 0)
+            *(pCoef) = *(pCoef) + *(pPulseAmp);
+            pPulseAmp     = pPulseAmp + 1;
+        ELSE
+            *(pCoef) = *(pCoef) - *(pPulseAmp);
+            pPulseAmp     = pPulseAmp + 1;
+        ENDIF
+
+    ENDFOR
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_frameinfo.h"
+#include "s_pulseinfo.h"
+#include "pulse_nc.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 pulse_nc(
+    Int16      coef[],
+    const PulseInfo  *pPulseInfo,
+    const FrameInfo  *pLongFrameInfo,
+    Int      *max)
+{
+    Int index;
+
+    Int16 *pCoef;
+    Int temp;
+
+    const Int *pPulseOffset;
+    const Int *pPulseAmp;
+
+    /*--- Find the scalefactor band where pulse-encoded data starts ---*/
+
+    if (pPulseInfo->pulse_start_sfb > 0)
+    {
+        index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb - 1];
+    }
+    else
+    {
+        index = 0;
+    }
+
+    /*-------------------------------------------------------------------------
+      Each pulse index is stored as an offset from the previous pulse
+
+      Example - here we have a sfb that is 20 coefficients in length:
+
+      [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19]
+      [ ][ ][ ][ ][ ][P][P][ ][ ][ ][  ][  ][  ][  ][  ][ P][  ][  ][  ][ P]
+
+      The array pointed to by pPulseOffset == [5][1][9][4]
+
+      pPulseAmp is of the same length as pPulseOffset, and contains
+      an individual pulse amplitude for each coefficient.
+    --------------------------------------------------------------------------*/
+
+    pCoef        = &(coef[index]);
+
+    pPulseOffset = &(pPulseInfo->pulse_offset[0]);
+
+    pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
+
+    for (index = pPulseInfo->number_pulse; index > 0; index--)
+    {
+        pCoef  += *pPulseOffset++;
+
+        temp = *pCoef;
+
+        if (temp > 0)
+        {
+            temp += *(pPulseAmp++);
+            *pCoef = (Int16)temp;
+            if (temp > *max)
+            {
+                *max = temp;
+            }
+        }
+        else
+        {
+            temp -= *(pPulseAmp++);
+            *pCoef = (Int16)temp;
+            if (-temp > *max)
+            {
+                *max = -temp;
+            }
+        }
+
+    } /* for() */
+
+    return;
+
+} /* pulse_nc */
diff --git a/media/libstagefright/codecs/aacdec/pulse_nc.h b/media/libstagefright/codecs/aacdec/pulse_nc.h
new file mode 100644
index 0000000..8181dd0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pulse_nc.h
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pulse_nc.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Pass in max as input argument.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the global function declaration for pulse_nc
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PULSE_NC_H
+#define PULSE_NC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_frameinfo.h"
+#include "s_pulseinfo.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pulse_nc(
+        Int16        coef[],
+        const PulseInfo  *pPulseInfo,
+        const FrameInfo  *pLongFrameInfo,
+        Int      *max);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pv_audio_type_defs.h b/media/libstagefright/codecs/aacdec/pv_audio_type_defs.h
new file mode 100644
index 0000000..dee66bc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_audio_type_defs.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+ Pathname: ./c/include/pv_audio_type_defs.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Removed errant semicolons from #define statements
+
+ Description:
+        1. Modified ifndef STD_TYPE_DEFS_H with
+           #ifndef PV_AUDIO_TYPE_DEFS_H to avoid double definition
+               if file was already included
+        2. Merged cai if-def structures and C++ definition
+            3. Updated copyright notice
+
+ Description:  Added dependency on OSCL libraries
+
+ 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_AUDIO_TYPE_DEFS_H
+#define PV_AUDIO_TYPE_DEFS_H
+
+#include <stdint.h>
+
+typedef int8_t        Char;
+
+typedef uint8_t       UChar;
+
+
+
+/*----------------------------------------------------------------------------
+; Define generic signed and unsigned int
+----------------------------------------------------------------------------*/
+#ifndef Int
+typedef signed int  Int;
+#endif
+
+#ifndef UInt
+typedef unsigned int    UInt;
+#endif
+
+
+/*----------------------------------------------------------------------------
+; Define 16 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+
+#ifndef Int16
+typedef int16_t       Int16;
+#endif
+
+#ifndef INT16_MIN
+#define INT16_MIN   (-32768)
+#endif
+
+#ifndef INT16_MAX
+#define INT16_MAX   32767
+#endif
+
+#ifndef UInt16
+typedef uint16_t      UInt16;
+
+#endif
+
+
+/*----------------------------------------------------------------------------
+; Define 32 bit signed and unsigned words
+----------------------------------------------------------------------------*/
+
+
+#ifndef Int32
+typedef int32_t       Int32;
+#endif
+
+#ifndef INT32_MIN
+#define INT32_MIN   (-2147483647 - 1)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX   2147483647
+#endif
+
+#ifndef UInt32
+typedef uint32_t      UInt32;
+#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 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
+
+
+#endif  /* PV_AUDIO_TYPE_DEFS_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_div.cpp b/media/libstagefright/codecs/aacdec/pv_div.cpp
new file mode 100644
index 0000000..86d2487
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_div.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_div.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer numerator
+    Int32 y             32-bit integer denominator
+    Quotient *result    structure that hold result and shift factor
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement division of two Int32 numbers, provides back quotient and a
+    shift factor
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+#include "pv_audio_type_defs.h"
+#include "fxp_mul32.h"
+#include "pv_div.h"
+#include "pv_normalize.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 pv_div(Int32 x, Int32 y, Quotient *result)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Int32 quotient;
+    Int32 i;
+    Int32 j;
+    Int32 y_ov_y_hi;
+    Int32 flag = 0;     /* carries negative sign, if any  */
+
+
+    result->shift_factor = 0;   /* default  */
+
+    if (y == 0)
+    {
+        x = 0;   /* this will return 0 for any div/0 */
+    }
+    /*
+     *  make sure x and y are both positive
+     */
+
+    if (y < 0)
+    {
+        y = -y;
+        flag ^= 1;
+    }
+
+
+    if (x < 0)
+    {
+        x = -x;
+        flag ^= 1;
+    }
+
+    if (x != 0)
+    {
+        /*----------------------------------------------------------------------------
+        ; Scale the input to get maximum precision for x
+        ----------------------------------------------------------------------------*/
+
+        i = pv_normalize(x);
+
+        x <<= i;
+
+
+        /*----------------------------------------------------------------------------
+        ; Scale the input to get maximum precision for y
+        ----------------------------------------------------------------------------*/
+
+        j = pv_normalize(y);
+
+        y <<= j;
+
+        result->shift_factor = i - j;
+
+        /*----------------------------------------------------------------------------
+        ; Function body here
+        ----------------------------------------------------------------------------*/
+        /*---------------------------------------------------------------
+         ; take the inverse of the 16 MSB of y
+         ---------------------------------------------------------------*/
+
+        quotient = (0x40000000 / (y >> 15));
+
+        y_ov_y_hi = fxp_mul32_Q15(y, quotient);            /*  y*(1/y_hi)     */
+
+        y_ov_y_hi = 0x7FFFFFFF - y_ov_y_hi;                 /*  2 - y*(1/y_hi) */
+        y_ov_y_hi = fxp_mul32_Q14(quotient,  y_ov_y_hi);
+        i  = fxp_mul32_Q31(y_ov_y_hi,  x) << 1;
+
+        result->quotient = flag ? -i : i;
+    }
+    else
+    {
+        result->quotient = 0;
+    }
+
+
+
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pv_div.h b/media/libstagefright/codecs/aacdec/pv_div.h
new file mode 100644
index 0000000..2dfa8a0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_div.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pv_div.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_DIV_H
+#define PV_DIV_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    struct intg_div
+    {
+        Int32 quotient;
+        Int32 shift_factor;
+    };
+    typedef struct intg_div Quotient;
+
+
+    void pv_div(Int32 x, Int32 y, Quotient *quotient);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* PV_DIV_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_log2.cpp b/media/libstagefright/codecs/aacdec/pv_log2.cpp
new file mode 100644
index 0000000..69cbe91
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_log2.cpp
@@ -0,0 +1,168 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_log2.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer input
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement the logarithm base 2 of a number
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "pv_log2.h"
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     20
+#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+const Int32 log_table[9] =
+{
+    Q_fmt(-0.00879832091331F),  Q_fmt(0.12022974263833F),
+    Q_fmt(-0.72883958314294F),  Q_fmt(2.57909824242332F),
+    Q_fmt(-5.90041216630330F),  Q_fmt(9.15023342527264F),
+    Q_fmt(-9.90616619500413F),  Q_fmt(8.11228968755409F),
+    Q_fmt(-3.41763474309898F)
+};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+
+Int32 pv_log2(Int32 z)
+{
+    const Int32 *pt_table = log_table;
+    Int32 y;
+    Int32 i;
+
+    Int32 int_log2 = 0;
+
+    if (z > Q_fmt(2.0f))
+    {
+        while (z > Q_fmt(2.0f))
+        {
+            z >>= 1;
+            int_log2++;
+        }
+    }
+    else if (z < Q_fmt(1.0f))
+    {
+        {
+            while (z < Q_fmt(1.0f))
+            {
+                z <<= 1;
+                int_log2--;
+            }
+        }
+    }
+
+    /*
+     *  at this point, input limited to 1<x<2
+     */
+
+    if (z != Q_fmt(1.0f))
+    {
+        y  = fxp_mul32_Q20(*(pt_table++), z);
+
+        for (i = 7; i != 0; i--)
+        {
+            y += *(pt_table++);
+            y  = fxp_mul32_Q20(y, z);
+        }
+
+        y += *(pt_table++);
+    }
+    else
+    {
+        y = 0;
+    }
+
+
+    return (y + (int_log2 << 20));         /* Q20 */
+}
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/pv_log2.h b/media/libstagefright/codecs/aacdec/pv_log2.h
new file mode 100644
index 0000000..4834e82
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_log2.h
@@ -0,0 +1,69 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pv_log2.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_LOG2_H
+#define PV_LOG2_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    Int32 pv_log2(Int32 z);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* PV_LOG2_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_normalize.cpp b/media/libstagefright/codecs/aacdec/pv_normalize.cpp
new file mode 100644
index 0000000..365b5ad
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_normalize.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_normalize.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    Int32 x             32-bit integer non-zero input
+Returns
+    Int32 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_audio_type_defs.h"
+#include "pv_normalize.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(_ARM)
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+/* function is inlined in header file */
+
+
+#else
+
+Int pv_normalize(Int32 x)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    Int 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/aacdec/pv_normalize.h b/media/libstagefright/codecs/aacdec/pv_normalize.h
new file mode 100644
index 0000000..dce080e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_normalize.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Pathname: pv_normalize.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_NORMALIZE_H
+#define PV_NORMALIZE_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+#if defined(_ARM)
+
+__inline Int pv_normalize(Int32 x)
+{
+    Int32 y;
+    __asm
+    {
+        clz y, x;
+        sub y, y, #1
+    }
+    return (y);
+}
+
+
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+__inline Int pv_normalize(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
+
+    Int pv_normalize(Int32 x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
+
+#endif  /* PV_NORMALIZE_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_pow2.cpp b/media/libstagefright/codecs/aacdec/pv_pow2.cpp
new file mode 100644
index 0000000..8dfca23
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_pow2.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_pow2.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    Int32 x             32-bit integer input  Q27
+
+Output
+    Int32               32-bit integer in Q25
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement the power base 2 for positive numbers lesser than 5.999999
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+#ifdef AAC_PLUS
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_pow2.h"
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+#define POW_2_TABLE_LENGTH          6
+#define POW_2_TABLE_LENGTH_m_2      (POW_2_TABLE_LENGTH - 2)
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     29
+#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+#define Q27fmt(x)   (Int32)(x*((Int32)1<<27) + (x>=0?0.5F:-0.5F))
+
+const Int32 pow2_table[6] =
+{
+    Q_fmt(0.00224510927441F),   Q_fmt(0.00777943379416F),
+    Q_fmt(0.05737929218747F),   Q_fmt(0.23918017179889F),
+    Q_fmt(0.69345251849351F),   Q_fmt(0.99996347120248F)
+};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+/*
+ *      z in Q27 format
+ */
+
+Int32 pv_pow2(Int32 z)
+{
+    const Int32 *pt_table = pow2_table;
+    Int32 multiplier = 0;
+    Int32 shift_factor;
+    Int32 i;
+    Int32 v_q;
+    Int32 y;
+
+
+    if (z > Q27fmt(1.0f))
+    {
+        v_q = z - (z & 0xF8000000);
+        shift_factor =   z >> 27;
+    }
+    else
+    {
+        v_q = z;
+        shift_factor = 0;
+    }
+
+    if (v_q < Q27fmt(0.5f))
+    {
+        v_q += Q27fmt(0.5f);
+        multiplier = Q_fmt(0.70710678118655F);
+    }
+
+    v_q = v_q << 2;
+
+    y  = fxp_mul32_Q29(*(pt_table++), v_q);
+
+    for (i = POW_2_TABLE_LENGTH_m_2; i != 0; i--)
+    {
+        y += *(pt_table++);
+        y  = fxp_mul32_Q29(y, v_q);
+    }
+    y += *(pt_table++);
+
+    if (multiplier)
+    {
+        y = fxp_mul32_Q29(y, multiplier);
+    }
+
+    /*
+     *  returns number on Q25
+     */
+    return (y >> (4 - shift_factor));
+
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/pv_pow2.h b/media/libstagefright/codecs/aacdec/pv_pow2.h
new file mode 100644
index 0000000..04bfe93
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_pow2.h
@@ -0,0 +1,68 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pv_pow2.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_POW2_H
+#define PV_POW2_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    Int32 pv_pow2(Int32 z);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* PV_POW2_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_sine.cpp b/media/libstagefright/codecs/aacdec/pv_sine.cpp
new file mode 100644
index 0000000..54319b1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_sine.cpp
@@ -0,0 +1,182 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_sine.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer angle (in Q30) between 0 and pi/2
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Find the sine of a number between 0 and pi/2
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+#ifdef PARAMETRICSTEREO
+
+#include "pv_audio_type_defs.h"
+#include "fxp_mul32.h"
+#include "pv_sine.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
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     30
+
+#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+const Int32 sin_table[9] =
+{
+    Q_fmt(0.00001724684028), Q_fmt(-0.00024606242846),
+    Q_fmt(0.00007297328923), Q_fmt(0.00826706596417),
+    Q_fmt(0.00003585160465), Q_fmt(-0.16667772526248),
+    Q_fmt(0.00000174197440), Q_fmt(0.99999989138797),
+    Q_fmt(0.00000000110513)
+};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+Int32 pv_sine(Int32 z)
+{
+    Int32 sine;
+    Int32 i;
+    const Int32 *pt_table = sin_table;
+    Int32 sign = 0;
+
+    if (z < 0)
+    {
+        z = -z;
+        sign = 1;
+    }
+
+    if (z > Q_fmt(0.0015))
+    {
+        sine  = fxp_mul32_Q30(*(pt_table++), z);
+
+        for (i = 7; i != 0; i--)
+        {
+            sine += *(pt_table++);
+            sine  = fxp_mul32_Q30(sine, z);
+        }
+
+    }
+    else
+    {
+        sine = z;  /*  better approximation in this range */
+    }
+
+    if (sign)
+    {
+        sine = -sine;
+    }
+
+    return sine;
+}
+
+
+
+Int32 pv_cosine(Int32 z)
+{
+    Int32 cosine;
+
+    if (z < 0)
+    {
+        z = -z;     /* sign does not play a role in cosine */
+    }
+
+    if (z > Q_fmt(0.0015))
+    {
+        z = Q_fmt(1.57079632679490) - z;   /* pi/2 - z */
+
+        cosine  = pv_sine(z);
+    }
+    else
+    {   /*  better approximation in this range  */
+        cosine = Q_fmt(0.99999999906868) - (fxp_mul32_Q30(z, z) >> 1);
+    }
+
+    return cosine;
+}
+
+#endif
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pv_sine.h b/media/libstagefright/codecs/aacdec/pv_sine.h
new file mode 100644
index 0000000..145013a6
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_sine.h
@@ -0,0 +1,68 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pv_sine.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_SINE_H
+#define PV_SINE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    Int32 pv_sine(Int32 x);
+    Int32 pv_cosine(Int32 x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* PV_SINE_H */
diff --git a/media/libstagefright/codecs/aacdec/pv_sqrt.cpp b/media/libstagefright/codecs/aacdec/pv_sqrt.cpp
new file mode 100644
index 0000000..065fa38
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_sqrt.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: pv_sqrt.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 x             32-bit integer
+
+    Int32 y             32-bit integer
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement root squared of a number
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "pv_audio_type_defs.h"
+
+#include "fxp_mul32.h"
+#include "pv_sqrt.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
+----------------------------------------------------------------------------*/
+#define R_SHIFT     28
+#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+
+const Int32 sqrt_table[9] =
+{
+    Q_fmt(-0.13829740941110F),  Q_fmt(0.95383399963991F),
+    Q_fmt(-2.92784603873353F),  Q_fmt(5.27429191920042F),
+    Q_fmt(-6.20272445821478F),  Q_fmt(5.04717433019620F),
+    Q_fmt(-3.03362807640415F),  Q_fmt(1.86178814410910F),
+    Q_fmt(0.16540758699193F)
+};
+
+/*----------------------------------------------------------------------------
+; 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 pv_sqrt(Int32 man, Int32 exp, Root_sq *result, Int32 *sqrt_cache)
+{
+
+    Int32   y;
+    Int32   xx;
+    Int32   nn;
+    Int32   i;
+    const Int32 *pt_table = sqrt_table;
+
+
+    if (sqrt_cache[0] == man && sqrt_cache[1] == exp)
+    {
+        result->root         =        sqrt_cache[2];
+        result->shift_factor = (Int16)sqrt_cache[3];
+    }
+    else
+    {
+
+        sqrt_cache[0] = man;
+        sqrt_cache[1] = exp;
+
+
+        if (man > 0)
+        {
+            xx =  man;
+            if (man >= Q_fmt(1.0f))
+            {
+                nn = exp + 1;
+                while ((xx >>= 1) > Q_fmt(1.0f))
+                {
+                    nn++;
+                }
+            }
+            else if (man < Q_fmt(0.5f))
+            {
+                nn = exp - 1;
+                while ((xx <<= 1) < Q_fmt(0.5f))
+                {
+                    nn--;
+                }
+            }
+            else
+            {
+                nn = exp;
+            }
+
+
+            y  = fxp_mul32_Q28(*(pt_table++), xx);
+
+            for (i = 3; i != 0; i--)
+            {
+                y += *(pt_table++);
+                y  = fxp_mul32_Q28(y, xx);
+                y += *(pt_table++);
+                y  = fxp_mul32_Q28(y, xx);
+            }
+            y += *(pt_table++);
+            y  = fxp_mul32_Q28(y, xx) + *(pt_table++);
+
+            if (nn >= 0)
+            {
+                if (nn&1)
+                {
+                    y = fxp_mul32_Q29(y, Q_fmt(1.41421356237310F));
+                    result->shift_factor = (nn >> 1) - 28;
+                }
+                else
+                {
+                    result->shift_factor = (nn >> 1) - 29;
+                }
+            }
+            else
+            {
+                if (nn&1)
+                {
+                    y = fxp_mul32_Q28(y, Q_fmt(0.70710678118655F));
+                }
+
+                result->shift_factor = -((-nn) >> 1) - 29;
+            }
+
+            result->root = y;
+
+        }
+        else
+        {
+            result->root = 0;
+            result->shift_factor = 0;
+        }
+
+    }
+
+    sqrt_cache[2] = result->root;
+    sqrt_cache[3] = result->shift_factor;
+
+}
+
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/pv_sqrt.h b/media/libstagefright/codecs/aacdec/pv_sqrt.h
new file mode 100644
index 0000000..45d6f52
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pv_sqrt.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pv_sqrt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_SQRT_H
+#define PV_SQRT_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    struct intg_sqrt
+    {
+        Int32 root;
+        Int32 shift_factor;
+    };
+    typedef struct intg_sqrt Root_sq;
+
+    void pv_sqrt(Int32 man, Int32 exp, Root_sq *result, Int32 *sqrt_cache);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* PV_SQRT_H */
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecoder_api.h b/media/libstagefright/codecs/aacdec/pvmp4audiodecoder_api.h
new file mode 100644
index 0000000..7806f88
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecoder_api.h
@@ -0,0 +1,376 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Name: PVMP4AudioDecoder_API.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change buffer type to UChar
+
+ Description: Update comments
+
+ Description: Updated a comment that MT did not get around to
+ before the end of his contract.
+
+ Description: add a new API to decode audioSpecificConfig separately, the same
+              change has been made on 32-bits version (element \main\2)
+
+ Description: add a new API to reset history buffer, the same change has been
+              made on a 32-bits version(element \nd.e0352.wjin\1)
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Main header file for the Packet Video MP4/AAC audio 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)
+
+  ISO/EIC 14496-3:(1999) Document titled
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP4AUDIODECODER_API_H
+#define PVMP4AUDIODECODER_API_H
+
+#include "pv_audio_type_defs.h"  /* Basic data types used within the lib */
+
+#include "e_tmp4audioobjecttype.h"
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*
+     * This constant is the guaranteed-to-work buffer size, specified in bytes,
+     * for the input buffer for 2 audio channels to decode one frame of data,
+     * as specified by the MPEG-2 or MPEG-4 standard.
+     * The standard, and this constant, do not take into account that lower
+     * bitrates will use less data per frame. Note that the number of bits
+     * used per frame is variable, and only that the average value will be the
+     * bit rate specified during encoding. The standard does not specify
+     * over how many frames the average must be maintained.
+     *
+     * The constant value is 6144 * 2 channels / 8 bits per byte
+     */
+
+
+#define PVMP4AUDIODECODER_INBUFSIZE  1536
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /*
+     * This enumeration is used for the structure element outputFormat. It
+     * specifies how the output data is to be formatted. Presently only 16-bit
+     * PCM data is supported, and this enum informs how the single output
+     * buffer should be for two-channel stereo data.
+     * Grouped format stores all the left channel values, then right:
+     * "LLLL...LLRRRR...RR"
+     * Interleave format store left, then right audio samples:
+     * "LRLRLRLR...."
+     */
+    typedef enum ePVMP4AudioDecoderOutputFormat
+    {
+        OUTPUTFORMAT_16PCM_GROUPED = 0,
+        OUTPUTFORMAT_16PCM_INTERLEAVED = 1
+
+    } tPVMP4AudioDecoderOutputFormat;
+
+    /*
+     * This enumeration holds the possible return values for the main decoder
+     * function, PVMP4AudioDecodeFrame. The plan was to easily distinguish
+     * whether an error was recoverable (streaming mode) or not. Presently no
+     * errors are recoverable, which is a result of not supporting ADTS in
+     * this release.
+     */
+    typedef enum ePVMP4AudioDecoderErrorCode
+    {
+        MP4AUDEC_SUCCESS           =  0,
+        MP4AUDEC_INVALID_FRAME     = 10,
+        MP4AUDEC_INCOMPLETE_FRAME  = 20,
+        MP4AUDEC_LOST_FRAME_SYNC   = 30     /* Cannot happen since no ADTS */
+    } tPVMP4AudioDecoderErrorCode;
+
+
+    /*
+     * This enumeration holds the possible return values for stream type
+     * being decoded
+     */
+    typedef enum
+    {
+        AAC = 0,
+        AACPLUS,
+        ENH_AACPLUS
+    } STREAMTYPE;
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /*
+     * This structure is used to communicate information in to and out of the
+     * AAC decoder.
+     */
+
+    typedef struct
+#ifdef __cplusplus
+                tPVMP4AudioDecoderExternal  // To allow forward declaration of this struct in C++
+#endif
+    {
+        /*
+         * 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.
+         * The calling environment can change what is pointed to between calls to
+         * the decode function, library, as long as the inputBufferCurrentLength,
+         * and inputBufferUsedLength are updated too. Also, any remaining bits in
+         * the old buffer must be put at the beginning of the new buffer.
+         */
+        UChar  *pInputBuffer;
+
+        /*
+         * INPUT:
+         * Number of valid bytes in the input buffer, set by the calling
+         * function. After decoding the bitstream the library checks to
+         * see if it when past this value; it would be to prohibitive to
+         * check after every read operation. This value is not modified by
+         * the AAC library.
+         */
+        Int     inputBufferCurrentLength;
+
+        /*
+         * INPUT:
+         * The actual size of the buffer.
+         * This variable is not used by the library, but is used by the
+         * console test application. This parameter could be deleted
+         * if this value was passed into these function. The helper functions are
+         * not part of the library and are not used by the Common Audio Decoder
+         * Interface.
+         */
+        Int     inputBufferMaxLength;
+
+        /*
+         * INPUT:
+         * Enumerated value the output is to be interleaved left-right-left-right.
+         * For further information look at the comments for the enumeration.
+         */
+        tPVMP4AudioDecoderOutputFormat  outputFormat;
+
+        /*
+         * INPUT: (but what is pointed to is an output)
+         * Pointer to the output buffer to hold the 16-bit PCM audio samples.
+         * If the output is stereo, both left and right channels will be stored
+         * in this one buffer. Presently it must be of length of 2048 points.
+         * The format of the buffer is set by the parameter outputFormat.
+         */
+        Int16  *pOutputBuffer;
+
+        /*
+         * INPUT: (but what is pointed to is an output)
+         * Pointer to the output buffer to hold the 16-bit PCM AAC-plus audio samples.
+         * If the output is stereo, both left and right channels will be stored
+         * in this one buffer. Presently it must be of length of 2048 points.
+         * The format of the buffer is set by the parameter outputFormat.
+         */
+        Int16  *pOutputBuffer_plus;     /* Used in AAC+ and enhanced AAC+  */
+
+        /*
+         * INPUT:
+         * AAC Plus Upsampling Factor. Normally set to 2 when Spectrum Band
+         * Replication (SBR) is used
+         */
+        Int32  aacPlusUpsamplingFactor; /* Used in AAC+ and enhanced AAC+  */
+
+        /*
+         * INPUT:
+         * AAC Plus enabler. Deafaults to be ON, unless run time conditions
+         * require the SBR and PS tools disabled
+         */
+        bool    aacPlusEnabled;
+        /*
+         * INPUT:
+         * (Currently not being used inside the AAC library.)
+         * This flag is set to TRUE when the playback position has been changed,
+         * for example, rewind or fast forward. This informs the AAC library to
+         * take an appropriate action, which has yet to be determined.
+         */
+        Bool    repositionFlag;
+
+        /*
+         * INPUT:
+         * Number of requested output audio channels. This relieves the calling
+         * environment from having to perform stereo-to-mono or mono-to-stereo
+         * conversions.
+         */
+        Int     desiredChannels;
+
+        /*
+         * INPUT/OUTPUT:
+         * Number of elements used by the library, initially set to zero by
+         * the function PVMP4AudioDecoderInitLibrary, and modified by each
+         * call to PVMP4AudioDecodeFrame.
+         */
+        Int     inputBufferUsedLength;
+
+        /*
+         * INPUT/OUTPUT:
+         * Number of bits left over in the next buffer element,
+         * This value will always be zero, unless support for ADTS is added.
+         */
+        Int32    remainderBits;
+
+        /*
+         * 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   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   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.
+         */
+        Int     encodedChannels;
+
+        /*
+         * OUTPUT:
+         * This value is the number of output PCM samples per channel.
+         * It is presently hard-coded to 1024, but may change in the future.
+         * It will not change frame to frame, and would take on
+         * one of these four values: 1024, 960, 512, or 480. If an error occurs
+         * do not rely on this value.
+         */
+        Int     frameLength;
+
+        /*
+        * This value is audio object type as defined in struct tMP4AudioObjectType
+        * in file e_tMP4AudioObjectType.h
+        */
+        Int     audioObjectType;
+
+        /*
+        * This value is extended audio object type as defined in struct tMP4AudioObjectType
+        * in file e_tMP4AudioObjectType.h. It carries the output Audio Object Type
+        */
+        Int     extendedAudioObjectType;
+
+
+    } tPVMP4AudioDecoderExternal;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    OSCL_IMPORT_REF UInt32 PVMP4AudioDecoderGetMemRequirements(void);
+
+    OSCL_IMPORT_REF Int PVMP4AudioDecoderInitLibrary(
+        tPVMP4AudioDecoderExternal  *pExt,
+        void                        *pMem);
+
+    OSCL_IMPORT_REF Int PVMP4AudioDecodeFrame(
+        tPVMP4AudioDecoderExternal  *pExt,
+        void                        *pMem);
+
+    OSCL_IMPORT_REF Int PVMP4AudioDecoderConfig(
+        tPVMP4AudioDecoderExternal  *pExt,
+        void                        *pMem);
+
+    OSCL_IMPORT_REF void PVMP4AudioDecoderResetBuffer(
+        void                        *pMem);
+
+    OSCL_IMPORT_REF void PVMP4AudioDecoderDisableAacPlus(
+        tPVMP4AudioDecoderExternal  *pExt,
+        void                        *pMem);
+
+    Int PVMP4SetAudioConfig(
+        tPVMP4AudioDecoderExternal  *pExt,
+        void                        *pMem,
+        Int                         upsamplingFactor,
+        Int                         samp_rate,
+        int                         num_ch,
+        tMP4AudioObjectType         audioObjectType);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif  /* PVMP4AUDIODECODER_API_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecoderconfig.cpp b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderconfig.cpp
new file mode 100644
index 0000000..9208fa8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderconfig.cpp
@@ -0,0 +1,285 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: PVMP4AudioDecoderConfig
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) Modified to decode AudioSpecificConfig for any frame number
+                  pVars->bno
+              (2) Update the input and output descriptions
+
+ Description: Eliminated search for ADIF header
+
+ Description: Added support for AAC+
+
+ Who:                                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pExt = pointer to the external interface structure. See the file
+           PVMP4AudioDecoder_API.h for a description of each field.
+           Data type of pointer to a tPVMP4AudioDecoderExternal
+           structure.
+
+           pExt->pInputBuffer: pointer to input buffer containing input
+                               bitstream
+
+           pExt->inputBufferCurrentLength: number of bytes in the input buffer
+
+           pExt->inputBufferUsedLength: number of bytes already consumed in
+                                        input buffer
+
+           pExt->remainderBits: number of bits consumed in addition to
+                                pExt->inputBufferUsedLength
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tDec_Int_File structure. This structure
+           contains information that needs to persist between calls to
+           this function, or is too big to be placed on the stack, even
+           though the data is only needed during execution of this function
+           Data type void pointer, internally pointer to a tDec_Int_File
+           structure.
+
+ Local Stores/Buffers/Pointers Needed: None
+           (The memory set aside in pMem performs this task)
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+     status = 0                       if no error occurred
+              MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred
+              MP4AUDEC_RECOVERABLE    if a recoverable error occurred.
+              Presently a recoverable error does not exist, but this
+              was a requirement.
+
+
+ Pointers and Buffers Modified:
+    pMem contents are modified.
+    pExt: (more detail in the file PVMP4AudioDecoder_API.h)
+    inputBufferUsedLength - number of array elements used up by the stream.
+    remainderBits - remaining bits in the next UInt32 buffer
+    samplingRate - sampling rate in samples per sec
+    encodedChannels - channels found on the file (informative)
+    frameLength - length of the frame
+
+ Local Stores Modified: None.
+
+ Global Stores Modified: None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ PacketVideo Document # CCC-AUD-AAC-ERS-0003
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3: 1999(E)
+      subclause 1.6
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+#include "ibstream.h"           /* where #define INBUF_ARRAY_INDEX_SHIFT */
+#include "sfb.h"                   /* Where samp_rate_info[] is declared */
+
+#include "get_audio_specific_config.h"
+#include "pvmp4audiodecoder_api.h"   /* Where this function is declared */
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+OSCL_EXPORT_REF Int PVMP4AudioDecoderConfig(
+    tPVMP4AudioDecoderExternal  *pExt,
+    void                        *pMem)
+{
+
+    UInt           initialUsedBits;  /* Unsigned for C55x */
+    tDec_Int_File *pVars;           /* Helper pointer */
+
+    Int            status = MP4AUDEC_INCOMPLETE_FRAME;
+
+    /*
+     * Initialize "helper" pointers to existing memory.
+     */
+    pVars = (tDec_Int_File *)pMem;
+    /*
+     * Translate input buffer variables.
+     */
+    pVars->inputStream.pBuffer = pExt->pInputBuffer;
+
+    pVars->inputStream.inputBufferCurrentLength =
+        (UInt)pExt->inputBufferCurrentLength;
+
+    pVars->inputStream.availableBits =
+        (UInt)(pExt->inputBufferCurrentLength << INBUF_ARRAY_INDEX_SHIFT);
+
+    initialUsedBits =
+        (UInt)((pExt->inputBufferUsedLength << INBUF_ARRAY_INDEX_SHIFT) +
+               pExt->remainderBits);
+
+    pVars->inputStream.usedBits = initialUsedBits;
+
+    if (initialUsedBits <= pVars->inputStream.availableBits)
+    {
+
+        /*
+         * Buffer is not overrun, then
+         * decode the AudioSpecificConfig() structure
+         */
+
+        pVars->aacConfigUtilityEnabled = false;  /* set aac dec mode */
+
+        status = get_audio_specific_config(pVars);
+
+    }
+
+    byte_align(&pVars->inputStream);
+
+
+    if (status == SUCCESS)
+    {
+
+        pVars->bno++;
+
+        /*
+         * A possible improvement would be to set these values only
+         * when they change.
+         */
+        pExt->samplingRate =
+            samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate;
+
+        /*
+         *  we default to 2 channel, even for mono files, (where channels have same content)
+         *  this is done to ensure support for enhanced aac+ with implicit signalling
+         */
+        pExt->aacPlusEnabled = pVars->aacPlusEnabled;
+
+//        pExt->encodedChannels = pVars->mc_info.nch;
+
+        pExt->encodedChannels = 2;
+
+        pExt->frameLength = pVars->frameLength;
+#ifdef AAC_PLUS
+        pExt->aacPlusUpsamplingFactor = pVars->mc_info.upsamplingFactor;
+#endif
+
+    }
+    else
+    {
+        /*
+         *  Default to nonrecoverable error status unless there is a Buffer overrun
+         */
+        status = MP4AUDEC_INVALID_FRAME;
+
+        if (pVars->inputStream.usedBits > pVars->inputStream.availableBits)
+        {
+            /* all bits were used but were not enough to complete parsing */
+            pVars->inputStream.usedBits = pVars->inputStream.availableBits;
+
+            status = MP4AUDEC_INCOMPLETE_FRAME; /* audio config too small */
+        }
+
+    }
+
+    /*
+     * Translate from units of bits back into units of words.
+     */
+
+    pExt->inputBufferUsedLength =
+        pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
+
+    pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK;
+
+    pVars->status = status;
+
+    return (status);
+
+} /* PVMP4AudioDecoderDecodeFrame */
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecoderframe.cpp b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderframe.cpp
new file mode 100644
index 0000000..7a279dc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderframe.cpp
@@ -0,0 +1,1458 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pvmp4audiodecodeframe
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Pulled in loop structure from console.c, so that this function
+               now decodes all frames in the file.
+
+               Original program used several global variables.  These have been
+               eliminated, except for situations in which the global variables
+               could be converted into const types.  Otherwise, they are passed
+               by reference through the functions.
+
+ Description:  Begin mods for file I/O removal
+
+ Description:  Merged trans4m_freq_2_time, trans4m_time_2_freq, etc.
+
+ Description:  Removing commented out sections of code.  This includes the
+               removal of unneeded functions init_lt_pred, reset_mc_info,
+
+ Description: Copied from aac_decode_frame.c and renamed file,
+              Made many changes.
+
+ Description: Prepare for code review
+
+ Description: Update per review comments:
+              1) Add comment about leaveGetLoop
+              2) Remove inverseTNSCoef array
+              3) fix wnd_shape_this_bk to wnd_shape_prev_bk in F to T
+              4) Clean up comments
+              5) Change call to long_term_synthesis
+
+ Description: Remove division for calculation of bitrate.
+
+ Description: Remove update of LTP buffers if not LTP audio object type.
+
+ Description: Add hasmask to call to right_ch_sfb_tools_ms
+
+ Description:
+ Modified to call ltp related routines on the left channel
+ before intensity is called on the right channel.  The previous version
+ was causing a problem when IS was used on the right channel and LTP
+ on the left channel for the same scalefactor band.
+
+ This fix required creating a new function, apply_ms_synt, deleting another
+ function (right_ch_sfb_tools_noms.c), and modifying the calling order of
+ the other functions.
+
+ Description: Made changes per review comments.
+
+ Description: Changed name of right_ch_sfb_tools_ms to pns_intensity_right
+
+ Description: Added cast, since pVars->inputStream.usedBits is UInt, and
+ pExt->remainderBits is Int.
+
+ pExt->remainderBits =
+    (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK);
+
+ Description: Modified to pass a pointer to scratch memory into
+ tns_setup_filter.c
+
+ Description: Removed include of "s_TNSInfo.h"
+
+ Description: Removed call to "tns_setup_filter" which has been eliminated
+ by merging its functionality into "get_tns"
+
+ Description:  Passing in a pointer to a q-format array, rather than
+ the address of a single q-format, for the inverse filter case for
+ apply_tns.
+
+ Description:
+ (1) Added #include of "e_ElementId.h"
+     Previously, this function was relying on another include file
+     to include "e_ElementId.h"
+
+ (2) Updated the copyright header.
+
+ Description:
+ Per review comments, declared two temporary variables
+
+    pChLeftShare  = pChVars[LEFT]->pShareWfxpCoef;
+    pChRightShare = pChVars[RIGHT]->pShareWfxpCoef;
+
+ Description:
+    long_term_synthesis should have been invoked with max_sfb
+    as the 2nd parameter, rather than pFrameInfo->sfb_per_win[0].
+
+    Old
+                long_term_synthesis(
+                    pChVars[ch]->wnd,
+                    pFrameInfo->sfb_per_win[0] ...
+
+    Correction
+                long_term_synthesis(
+                    pChVars[ch]->wnd,
+                    pChVars[ch]->pShareWfxpCoef->max_sfb ...
+
+    This problem caused long_term_synthesis to read memory which
+    was not initialized in get_ics_info.c
+
+ Description:
+ (1) Utilize scratch memory for the scratch Prog_Config.
+
+ Description: (1) Modified to decode ID_END syntactic element after header
+
+ Description:
+ (1) Reconfigured LTP buffer as a circular buffer.  This saves
+     2048 Int16->Int16 copies per frame.
+
+ Description: Updated so ltp buffers are not used as a wasteful
+ intermediate buffer for LC streams.  Data is transferred directly
+ from the filterbank to the output stream.
+
+ Description: Decode ADIF header if frame count is zero.
+              The AudioSpecificConfig is decoded by a separate API.
+
+ Description: Added comments explaining how the ltp_buffer_state
+ variable is updated.
+
+
+ Description: Modified code to take advantage of new trans4m_freq_2_time_fxp,
+ which writes the output directly into a 16-bit output buffer.  This
+ improvement allows faster operation by reducing the amount of memory
+ transfers.  Speed can be further improved on most platforms via use of a
+ DMA transfer in the function write_output.c
+
+ Description: perChan[] is an array of structures in tDec_Int_File. Made
+              corresponding changes.
+
+ Description: Included changes in interface for q_normalize() and
+              trans4m_freq_2_time_fxp.
+
+ Description: Included changes in interface for long_term_prediction.
+
+ Description: Added support for DSE (Data Streaming Channel). Added
+              function get_dse() and included file get_dse.h
+
+ Description: Added support for the ill-case when a raw data block contains
+              only a terminator <ID_END>. This is illegal but is added
+              for convinience
+
+ Description: Added support for empty audio frames, such the one containing
+              only DSE or FILL elements. A trap was added to stop processing
+              when no audio information was sent.
+
+ Description: Added support for adts format files. Added saturation to
+              floating point version of aac+ decoding
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pExt = pointer to the external interface structure. See the file
+           PVMP4AudioDecoder_API.h for a description of each field.
+           Data type of pointer to a tPVMP4AudioDecoderExternal
+           structure.
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tDec_Int_File structure. This structure
+           contains information that needs to persist between calls to
+           this function, or is too big to be placed on the stack, even
+           though the data is only needed during execution of this function
+           Data type void pointer, internally pointer to a tDec_Int_File
+           structure.
+
+ Local Stores/Buffers/Pointers Needed: None
+           (The memory set aside in pMem performs this task)
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+     status = 0                       if no error occurred
+              MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred
+              MP4AUDEC_RECOVERABLE    if a recoverable error occurred.
+              Presently a recoverable error does not exist, but this
+              was a requirement.
+
+
+ Pointers and Buffers Modified:
+    pMem contents are modified.
+    pExt: (more detail in the file PVMP4AudioDecoder_API.h)
+    inputBufferUsedLength - number of array elements used up by the stream.
+    remainderBits - remaining bits in the next UInt32 buffer
+    samplingRate - sampling rate in samples per sec
+    bitRate - bit rate in bits per second, varies frame to frame.
+    encodedChannels - channels found on the file (informative)
+    frameLength - length of the frame
+
+ Local Stores Modified: None.
+
+ Global Stores Modified: None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Decodes one frame of an MPEG-2/MPEG-4 encoded audio bitstream.
+
+ This function calls the various components of the decoder in the proper order.
+
+
+         Left Channel                                    Right Channel
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+ #1 ____________________                           #2 ____________________
+    |                  |                              |                  |
+    | Huffman Decoding |                              | Huffman Decoding |
+    |__________________|                              |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                                |
+ #3 ____________________                                       |
+    |                  |                                       |
+    |     PNS LEFT     |                                       |
+    |__________________|                                       |
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+ #4 ______________________________________________________________________
+    |                                                                    |
+    |                          Apply MS_Synt                             |
+    |____________________________________________________________________|
+             |                                                 |
+             |                                                 |
+            \|/                                                |
+ #5 ____________________                                       |
+    |                  |                                       W
+    |       LTP        |                                       A
+    |__________________|                                       I
+             |                                                 T
+             |                                                 |
+             |                                                 F
+            \|/                                                O
+ #6 ____________________                                       R
+    |                  |                                       |
+    |   Time -> Freq   |                                       L
+    |__________________|                                       E
+             |                                                 F
+             |                                                 T
+             |                                                 |
+            \|/                                                C
+ #7 ____________________                                       H
+    |                  |                                       A
+    |    TNS Inverse   |                                       N
+    |__________________|                                       N
+             |                                                 E
+             |                                                 L
+             |                                                 |
+            \|/                                                |
+ #8 ____________________                                       |
+    |                  |                                       |
+    | Long Term Synth  |                                       |
+    |__________________|                                       |
+             |                                                 |
+             |                                                \|/
+             |                                     #9 ____________________
+             |                                        |                  |
+             |--DATA ON LEFT CHANNEL MAY BE USED----->| PNS/Intensity Rt |
+             |                                        |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                \|/
+             |                                    #10 ____________________
+             W                                        |                  |
+             A                                        |       LTP        |
+             I                                        |__________________|
+             T                                                 |
+             |                                                 |
+             F                                                 |
+             O                                                \|/
+             R                                    #11 ____________________
+             |                                        |                  |
+             R                                        |   Time -> Freq   |
+             I                                        |__________________|
+             G                                                 |
+             H                                                 |
+             T                                                 |
+             |                                                \|/
+             C                                    #12 ____________________
+             H                                        |                  |
+             A                                        |    TNS Inverse   |
+             N                                        |__________________|
+             N                                                 |
+             E                                                 |
+             L                                                 |
+             |                                                \|/
+             |                                    #13 ____________________
+             |                                        |                  |
+             |                                        | Long Term Synth  |
+             |                                        |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+#14 ____________________                          #18 ____________________
+    |                  |                              |                  |
+    |       TNS        |                              |       TNS        |
+    |__________________|                              |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+#15 ____________________                          #19 ____________________
+    |                  |                              |                  |
+    |   qFormatNorm    |                              |   qFormatNorm    |
+    |__________________|                              |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+#16 ____________________                          #20 ____________________
+    |                  |                              |                  |
+    |   Freq / Time    |                              |   Freq / Time    |
+    |__________________|                              |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+#17 ____________________                          #21 ____________________
+    |                  |                              |                  |
+    |   Limit Buffer   |                              |   Limit Buffer   |
+    |__________________|                              |__________________|
+             |                                                 |
+             |                                                 |
+             |                                                 |
+            \|/                                               \|/
+#22 ______________________________________________________________________
+    |                                                                    |
+    |                           Write Output                             |
+    |____________________________________________________________________|
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ PacketVideo Document # CCC-AUD-AAC-ERS-0003
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+
+#include "s_tdec_int_chan.h"
+#include "s_tdec_int_file.h"
+#include "aac_mem_funcs.h"
+#include "sfb.h"                   /* Where samp_rate_info[] is declared */
+#include "e_tmp4audioobjecttype.h"
+#include "e_elementid.h"
+
+
+#include "get_adif_header.h"
+#include "get_adts_header.h"
+#include "get_audio_specific_config.h"
+#include "ibstream.h"           /* where getbits is declared */
+
+#include "huffman.h"            /* where huffdecode is declared */
+#include "get_prog_config.h"
+#include "getfill.h"
+#include "pns_left.h"
+
+#include "apply_ms_synt.h"
+#include "pns_intensity_right.h"
+#include "q_normalize.h"
+#include "long_term_prediction.h"
+#include "long_term_synthesis.h"
+#include "ltp_common_internal.h"
+#include "apply_tns.h"
+
+#include "window_block_fxp.h"
+
+#include "write_output.h"
+
+#include "pvmp4audiodecoder_api.h"   /* Where this function is declared */
+#include "get_dse.h"
+
+#include "sbr_applied.h"
+#include "sbr_open.h"
+#include "get_sbr_bitstream.h"
+#include "e_sbr_element_id.h"
+
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define LEFT (0)
+#define RIGHT (1)
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+void InitSbrSynFilterbank(bool bDownSampleSBR);
+
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+OSCL_EXPORT_REF Int PVMP4AudioDecodeFrame(
+    tPVMP4AudioDecoderExternal  *pExt,
+    void                        *pMem)
+{
+    Int            frameLength;      /* Helper variable */
+    Int            ch;
+    Int            id_syn_ele;
+    UInt           initialUsedBits;  /* Unsigned for C55x */
+    Int            qFormatNorm;
+    Int            qPredictedSamples;
+    Bool           leaveGetLoop;
+    MC_Info       *pMC_Info;        /* Helper pointer */
+    FrameInfo     *pFrameInfo;      /* Helper pointer */
+    tDec_Int_File *pVars;           /* Helper pointer */
+    tDec_Int_Chan *pChVars[Chans];  /* Helper pointer */
+
+    per_chan_share_w_fxpCoef *pChLeftShare;  /* Helper pointer */
+    per_chan_share_w_fxpCoef *pChRightShare; /* Helper pointer */
+
+    Int            status = MP4AUDEC_SUCCESS;
+
+
+    Bool empty_frame;
+
+#ifdef AAC_PLUS
+
+    SBRDECODER_DATA *sbrDecoderData;
+    SBR_DEC         *sbrDec;
+    SBRBITSTREAM    *sbrBitStream;
+
+#endif
+    /*
+     * Initialize "helper" pointers to existing memory.
+     */
+    pVars = (tDec_Int_File *)pMem;
+
+    pMC_Info = &pVars->mc_info;
+
+    pChVars[LEFT]  = &pVars->perChan[LEFT];
+    pChVars[RIGHT] = &pVars->perChan[RIGHT];
+
+    pChLeftShare = pChVars[LEFT]->pShareWfxpCoef;
+    pChRightShare = pChVars[RIGHT]->pShareWfxpCoef;
+
+
+#ifdef AAC_PLUS
+
+    sbrDecoderData = (SBRDECODER_DATA *) & pVars->sbrDecoderData;
+    sbrDec         = (SBR_DEC *) & pVars->sbrDec;
+    sbrBitStream   = (SBRBITSTREAM *) & pVars->sbrBitStr;
+
+#ifdef PARAMETRICSTEREO
+    sbrDecoderData->hParametricStereoDec = (HANDLE_PS_DEC) & pVars->sbrDecoderData.ParametricStereoDec;
+#endif
+
+#endif
+    /*
+     * Translate input buffer variables.
+     */
+    pVars->inputStream.pBuffer = pExt->pInputBuffer;
+
+    pVars->inputStream.inputBufferCurrentLength = (UInt)pExt->inputBufferCurrentLength;
+
+    pVars->inputStream.availableBits =
+        (UInt)(pExt->inputBufferCurrentLength << INBUF_ARRAY_INDEX_SHIFT);
+
+    initialUsedBits =
+        (UInt)((pExt->inputBufferUsedLength << INBUF_ARRAY_INDEX_SHIFT) +
+               pExt->remainderBits);
+
+    pVars->inputStream.usedBits = initialUsedBits;
+
+    if (initialUsedBits > pVars->inputStream.availableBits)
+    {
+        status = MP4AUDEC_INVALID_FRAME;
+    }
+    else if (pVars->bno == 0)
+    {
+        /*
+         * Attempt to read in ADIF format first because it is easily identified.
+         * If its not an ADIF bitstream, get_adif_header rewinds the "pointer"
+         * (actually usedBits).
+         */
+        status =
+            get_adif_header(
+                pVars,
+                &(pVars->scratch.scratch_prog_config));
+
+        byte_align(&pVars->inputStream);
+
+        if (status == SUCCESS)
+        {
+            pVars->prog_config.file_is_adts = FALSE;
+        }
+        else  /* we've tried simple audio config, adif, then it should be adts */
+        {
+            pVars->prog_config.file_is_adts = TRUE;
+        }
+    }
+    else if ((pVars->bno == 1) && (pVars->prog_config.file_is_adts == FALSE))
+    {
+
+        /*
+         * There might be an ID_END element following immediately after the
+         * AudioSpecificConfig header. This syntactic element should be read
+         * and byte_aligned before proceeds to decode "real" AAC raw data.
+         */
+        id_syn_ele = (Int)getbits(LEN_SE_ID, &pVars->inputStream) ;
+
+        if (id_syn_ele == ID_END)
+        {
+
+            byte_align(&pVars->inputStream);
+
+            pExt->inputBufferUsedLength =
+                pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
+
+            pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK;
+
+            pVars->bno++;
+
+            return(status);
+        }
+        else
+        {
+            /*
+             * Rewind bitstream pointer so that the syntactic element can be
+             * read when decoding raw bitstream
+             */
+            pVars->inputStream.usedBits -= LEN_SE_ID;
+        }
+
+    }
+
+    if (pVars->prog_config.file_is_adts == TRUE)
+    {
+        /*
+         *  If file is adts format, let the decoder handle only on data raw
+         *  block at the time, once the last (or only) data block has been
+         *  processed, then synch on the next header
+         */
+        if (pVars->prog_config.headerless_frames)
+        {
+            pVars->prog_config.headerless_frames--;  /* raw data block counter  */
+        }
+        else
+        {
+            status =  get_adts_header(pVars,
+                                      &(pVars->syncword),
+                                      &(pVars->invoke),
+                                      3);     /*   CorrectlyReadFramesCount  */
+
+            if (status != SUCCESS)
+            {
+                status = MP4AUDEC_LOST_FRAME_SYNC;    /*  we lost track of header */
+            }
+        }
+    }
+    else
+    {
+        byte_align(&pVars->inputStream);
+    }
+
+#ifdef AAC_PLUS
+    sbrBitStream->NrElements = 0;
+    sbrBitStream->NrElementsCore = 0;
+
+#endif
+
+    /*
+     * The variable leaveGetLoop is used to signal that the following
+     * loop can be left, which retrieves audio syntatic elements until
+     * an ID_END is found, or an error occurs.
+     */
+    leaveGetLoop = FALSE;
+    empty_frame  = TRUE;
+
+    while ((leaveGetLoop == FALSE) && (status == SUCCESS))
+    {
+        /* get audio syntactic element */
+        id_syn_ele = (Int)get9_n_lessbits(LEN_SE_ID, &pVars->inputStream);
+
+        /*
+         *  As fractional frames are a possible input, check that parsing does not
+         *  go beyond the available bits before parsing the syntax.
+         */
+        if (pVars->inputStream.usedBits > pVars->inputStream.availableBits)
+        {
+            status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */
+            id_syn_ele = ID_END;           /* quit while-loop */
+        }
+
+        switch (id_syn_ele)
+        {
+            case ID_END:        /* terminator field */
+                leaveGetLoop = TRUE;
+                break;
+
+            case ID_SCE:        /* single channel */
+            case ID_CPE:        /* channel pair */
+                empty_frame = FALSE;
+                status =
+                    huffdecode(
+                        id_syn_ele,
+                        &(pVars->inputStream),
+                        pVars,
+                        pChVars);
+
+#ifdef AAC_PLUS
+                if (id_syn_ele == ID_SCE)
+                {
+                    sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_SCE;
+                }
+                else if (id_syn_ele == ID_CPE)
+                {
+                    sbrBitStream->sbrElement[sbrBitStream->NrElements].ElementID = SBR_ID_CPE;
+                }
+                sbrBitStream->NrElementsCore++;
+
+
+#endif
+
+                break;
+
+            case ID_PCE:        /* program config element */
+                /*
+                 * PCE are not accepted in the middle of a
+                 * raw_data_block. If found, a possible error may happen
+                 * If a PCE is encountered during the first 2 frames,
+                 * it will be read and accepted
+                 * if its tag matches the first, with no error checking
+                 * (inside of get_prog_config)
+                 */
+
+                if (pVars->bno <= 1)
+                {
+                    status = get_prog_config(pVars,
+                                             &(pVars->scratch.scratch_prog_config));
+                }
+                else
+                {
+                    status = MP4AUDEC_INVALID_FRAME;
+                }
+                break;
+
+            case ID_FIL:        /* fill element */
+#ifdef AAC_PLUS
+                get_sbr_bitstream(sbrBitStream, &pVars->inputStream);
+
+#else
+                getfill(&pVars->inputStream);
+#endif
+
+                break;
+
+            case ID_DSE:       /* Data Streaming element */
+                get_dse(pVars->share.data_stream_bytes,
+                        &pVars->inputStream);
+                break;
+
+            default: /* Unsupported element, including ID_LFE */
+                status = -1;  /* ERROR CODE needs to be updated */
+                break;
+
+        } /* end switch() */
+
+    } /* end while() */
+
+    byte_align(&pVars->inputStream);
+
+    /*
+     *   After parsing the first frame ( bno=0 (adif), bno=1 (raw))
+     *   verify if implicit signalling is forcing to upsample AAC with
+     *   no AAC+/eAAC+ content. If so, disable upsampling
+     */
+
+#ifdef AAC_PLUS
+    if (pVars->bno <= 1)
+    {
+        if ((pVars->mc_info.ExtendedAudioObjectType == MP4AUDIO_AAC_LC) &&
+                (!sbrBitStream->NrElements))
+        {
+            PVMP4AudioDecoderDisableAacPlus(pExt, pMem);
+        }
+    }
+#endif
+
+    /*
+     *   There might be an empty raw data block with only a
+     *   ID_END element or non audio ID_DSE, ID_FIL
+     *   This is an "illegal" condition but this trap
+     *   avoids any further processing
+     */
+
+    if (empty_frame == TRUE)
+    {
+        pExt->inputBufferUsedLength =
+            pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
+
+        pExt->remainderBits = pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK;
+
+        pVars->bno++;
+
+        return(status);
+
+    }
+
+#ifdef AAC_PLUS
+
+    if (sbrBitStream->NrElements)
+    {
+        /* for every core SCE or CPE there must be an SBR element, otherwise sths. wrong */
+        if (sbrBitStream->NrElements != sbrBitStream->NrElementsCore)
+        {
+            status = MP4AUDEC_INVALID_FRAME;
+        }
+
+        if (pExt->aacPlusEnabled == false)
+        {
+            sbrBitStream->NrElements = 0;   /* disable aac processing  */
+        }
+    }
+    else
+    {
+        /*
+         *  This is AAC, but if aac+/eaac+ was declared in the stream, and there is not sbr content
+         *  something is wrong
+         */
+        if (pMC_Info->sbrPresentFlag || pMC_Info->psPresentFlag)
+        {
+            status = MP4AUDEC_INVALID_FRAME;
+        }
+    }
+#endif
+
+
+
+
+    /*
+     * Signal processing section.
+     */
+    frameLength = pVars->frameLength;
+
+    if (status == SUCCESS)
+    {
+        /*
+         *   PNS and INTENSITY STEREO and MS
+         */
+
+        pFrameInfo = pVars->winmap[pChVars[LEFT]->wnd];
+
+        pns_left(
+            pFrameInfo,
+            pChLeftShare->group,
+            pChLeftShare->cb_map,
+            pChLeftShare->factors,
+            pChLeftShare->lt_status.sfb_prediction_used,
+            pChLeftShare->lt_status.ltp_data_present,
+            pChVars[LEFT]->fxpCoef,
+            pChLeftShare->qFormat,
+            &(pVars->pns_cur_noise_state));
+
+        /*
+         * apply_ms_synt can only be ran for common windows.
+         * (where both the left and right channel share the
+         * same grouping, window length, etc.
+         *
+         * pVars->hasmask will be > 0 only if
+         * common windows are enabled for this frame.
+         */
+
+        if (pVars->hasmask > 0)
+        {
+            apply_ms_synt(
+                pFrameInfo,
+                pChLeftShare->group,
+                pVars->mask,
+                pChLeftShare->cb_map,
+                pChVars[LEFT]->fxpCoef,
+                pChVars[RIGHT]->fxpCoef,
+                pChLeftShare->qFormat,
+                pChRightShare->qFormat);
+        }
+
+        for (ch = 0; (ch < pMC_Info->nch); ch++)
+        {
+            pFrameInfo = pVars->winmap[pChVars[ch]->wnd];
+
+            /*
+             * Note: This MP4 library assumes that if there are two channels,
+             * then the second channel is right AND it was a coupled channel,
+             * therefore there is no need to check the "is_cpe" flag.
+             */
+
+            if (ch > 0)
+            {
+                pns_intensity_right(
+                    pVars->hasmask,
+                    pFrameInfo,
+                    pChRightShare->group,
+                    pVars->mask,
+                    pChRightShare->cb_map,
+                    pChLeftShare->factors,
+                    pChRightShare->factors,
+                    pChRightShare->lt_status.sfb_prediction_used,
+                    pChRightShare->lt_status.ltp_data_present,
+                    pChVars[LEFT]->fxpCoef,
+                    pChVars[RIGHT]->fxpCoef,
+                    pChLeftShare->qFormat,
+                    pChRightShare->qFormat,
+                    &(pVars->pns_cur_noise_state));
+            }
+
+            if (pChVars[ch]->pShareWfxpCoef->lt_status.ltp_data_present != FALSE)
+            {
+                /*
+                 * LTP - Long Term Prediction
+                 */
+
+                qPredictedSamples = long_term_prediction(
+                                        pChVars[ch]->wnd,
+                                        pChVars[ch]->pShareWfxpCoef->lt_status.
+                                        weight_index,
+                                        pChVars[ch]->pShareWfxpCoef->lt_status.
+                                        delay,
+                                        pChVars[ch]->ltp_buffer,
+                                        pVars->ltp_buffer_state,
+                                        pChVars[ch]->time_quant,
+                                        pVars->share.predictedSamples,      /* Scratch */
+                                        frameLength);
+
+                trans4m_time_2_freq_fxp(
+                    pVars->share.predictedSamples,
+                    pChVars[ch]->wnd,
+                    pChVars[ch]->wnd_shape_prev_bk,
+                    pChVars[ch]->wnd_shape_this_bk,
+                    &qPredictedSamples,
+                    pVars->scratch.fft);   /* scratch memory for FFT */
+
+
+                /*
+                 * To solve a potential problem where a pointer tied to
+                 * the qFormat was being incremented, a pointer to
+                 * pChVars[ch]->qFormat is passed in here rather than
+                 * the address of qPredictedSamples.
+                 *
+                 * Neither values are actually needed in the case of
+                 * inverse filtering, but the pointer was being
+                 * passed (and incremented) regardless.
+                 *
+                 * So, the solution is to pass a space of memory
+                 * that a pointer can happily point to.
+                 */
+
+                /* This is the inverse filter */
+                apply_tns(
+                    pVars->share.predictedSamples,  /* scratch re-used for each ch */
+                    pChVars[ch]->pShareWfxpCoef->qFormat,     /* Not used by the inv_filter */
+                    pFrameInfo,
+                    &(pChVars[ch]->pShareWfxpCoef->tns),
+                    TRUE,                       /* TRUE is FIR */
+                    pVars->scratch.tns_inv_filter);
+
+                /*
+                 * For the next function long_term_synthesis,
+                 * the third param win_sfb_top[], and
+                 * the tenth param coef_per_win,
+                 * are used differently that in the rest of the project. This
+                 * is because originally the ISO code was going to have
+                 * these parameters change as the "short window" changed.
+                 * These are all now the same value for each of the eight
+                 * windows.  This is why there is a [0] at the
+                 * end of each of theses parameters.
+                 * Note in particular that win_sfb_top was originally an
+                 * array of pointers to arrays, but inside long_term_synthesis
+                 * it is now a simple array.
+                 * When the rest of the project functions are changed, the
+                 * structure FrameInfo changes, and the [0]'s are removed,
+                 * this comment could go away.
+                 */
+                long_term_synthesis(
+                    pChVars[ch]->wnd,
+                    pChVars[ch]->pShareWfxpCoef->max_sfb,
+                    pFrameInfo->win_sfb_top[0], /* Look above */
+                    pChVars[ch]->pShareWfxpCoef->lt_status.win_prediction_used,
+                    pChVars[ch]->pShareWfxpCoef->lt_status.sfb_prediction_used,
+                    pChVars[ch]->fxpCoef,   /* input and output */
+                    pChVars[ch]->pShareWfxpCoef->qFormat,   /* input and output */
+                    pVars->share.predictedSamples,
+                    qPredictedSamples,       /* q format for previous aray */
+                    pFrameInfo->coef_per_win[0], /* Look above */
+                    NUM_SHORT_WINDOWS,
+                    NUM_RECONSTRUCTED_SFB);
+
+            } /* end if (pChVars[ch]->lt_status.ltp_data_present != FALSE) */
+
+        } /* for(ch) */
+
+        for (ch = 0; (ch < pMC_Info->nch); ch++)
+        {
+
+            pFrameInfo = pVars->winmap[pChVars[ch]->wnd];
+
+            /*
+             * TNS - Temporal Noise Shaping
+             */
+
+            /* This is the forward filter
+             *
+             * A special note:  Scratch memory is not used by
+             * the forward filter, but is passed in to maintain
+             * common interface for inverse and forward filter
+             */
+            apply_tns(
+                pChVars[ch]->fxpCoef,
+                pChVars[ch]->pShareWfxpCoef->qFormat,
+                pFrameInfo,
+                &(pChVars[ch]->pShareWfxpCoef->tns),
+                FALSE,                   /* FALSE is IIR */
+                pVars->scratch.tns_inv_filter);
+
+            /*
+             * Normalize the q format across all scale factor bands
+             * to one value.
+             */
+            qFormatNorm =
+                q_normalize(
+                    pChVars[ch]->pShareWfxpCoef->qFormat,
+                    pFrameInfo,
+                    pChVars[ch]->abs_max_per_window,
+                    pChVars[ch]->fxpCoef);
+
+            /*
+             *  filterbank - converts frequency coeficients to time domain.
+             */
+
+#ifdef AAC_PLUS
+            if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1)
+            {
+                trans4m_freq_2_time_fxp_2(
+                    pChVars[ch]->fxpCoef,
+                    pChVars[ch]->time_quant,
+                    pChVars[ch]->wnd,   /* window sequence */
+                    pChVars[ch]->wnd_shape_prev_bk,
+                    pChVars[ch]->wnd_shape_this_bk,
+                    qFormatNorm,
+                    pChVars[ch]->abs_max_per_window,
+                    pVars->scratch.fft,
+                    &pExt->pOutputBuffer[ch]);
+                /*
+                 *  Update LTP buffers if needed
+                 */
+
+                if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP)
+                {
+                    Int16 * pt = &pExt->pOutputBuffer[ch];
+                    Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]);
+                    Int16  x, y;
+                    for (Int32 i = HALF_LONG_WINDOW; i != 0; i--)
+                    {
+                        x = *pt;
+                        pt += 2;
+                        y = *pt;
+                        pt += 2;
+                        *(ptr++) =  x;
+                        *(ptr++) =  y;
+                    }
+                }
+            }
+            else
+            {
+                trans4m_freq_2_time_fxp_1(
+                    pChVars[ch]->fxpCoef,
+                    pChVars[ch]->time_quant,
+                    &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state + 288]),
+                    pChVars[ch]->wnd,   /* window sequence */
+                    pChVars[ch]->wnd_shape_prev_bk,
+                    pChVars[ch]->wnd_shape_this_bk,
+                    qFormatNorm,
+                    pChVars[ch]->abs_max_per_window,
+                    pVars->scratch.fft);
+
+            }
+#else
+
+            trans4m_freq_2_time_fxp_2(
+                pChVars[ch]->fxpCoef,
+                pChVars[ch]->time_quant,
+                pChVars[ch]->wnd,   /* window sequence */
+                pChVars[ch]->wnd_shape_prev_bk,
+                pChVars[ch]->wnd_shape_this_bk,
+                qFormatNorm,
+                pChVars[ch]->abs_max_per_window,
+                pVars->scratch.fft,
+                &pExt->pOutputBuffer[ch]);
+            /*
+             *  Update LTP buffers only if needed
+             */
+
+            if (pVars->mc_info.audioObjectType == MP4AUDIO_LTP)
+            {
+                Int16 * pt = &pExt->pOutputBuffer[ch];
+                Int16 * ptr = &(pChVars[ch]->ltp_buffer[pVars->ltp_buffer_state]);
+                Int16  x, y;
+                for (Int32 i = HALF_LONG_WINDOW; i != 0; i--)
+                {
+                    x = *pt;
+                    pt += 2;
+                    y = *pt;
+                    pt += 2;
+                    *(ptr++) =  x;
+                    *(ptr++) =  y;
+                }
+
+            }
+
+
+#endif
+
+
+            /* Update the window shape */
+            pChVars[ch]->wnd_shape_prev_bk = pChVars[ch]->wnd_shape_this_bk;
+
+        } /* end for() */
+
+
+        /*
+         * Copy to the final output buffer, taking into account the desired
+         * channels from the calling environment, the actual channels, and
+         * whether the data should be interleaved or not.
+         *
+         * If the stream had only one channel, write_output will not use
+         * the right channel data.
+         *
+         */
+
+
+        /* CONSIDER USE OF DMA OPTIMIZATIONS WITHIN THE write_output FUNCTION.
+         *
+         * It is presumed that the ltp_buffer will reside in internal (fast)
+         * memory, while the pExt->pOutputBuffer will reside in external
+         * (slow) memory.
+         *
+         */
+
+
+#ifdef AAC_PLUS
+
+        if (sbrBitStream->NrElements || pMC_Info->upsamplingFactor == 2)
+        {
+
+            if (pVars->bno <= 1)   /* allows console to operate with ADIF and audio config */
+            {
+                if (sbrDec->outSampleRate == 0) /* do it only once (disregarding of signaling type) */
+                {
+                    sbr_open(samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate,
+                             sbrDec,
+                             sbrDecoderData,
+                             pVars->mc_info.bDownSampledSbr);
+                }
+
+            }
+            pMC_Info->upsamplingFactor =
+                sbrDecoderData->SbrChannel[0].frameData.sbr_header.sampleRateMode;
+
+
+            /* reuse right aac spectrum channel  */
+            {
+                Int16 *pt_left  =  &(pChVars[LEFT ]->ltp_buffer[pVars->ltp_buffer_state]);
+                Int16 *pt_right =  &(pChVars[RIGHT]->ltp_buffer[pVars->ltp_buffer_state]);
+
+                if (sbr_applied(sbrDecoderData,
+                                sbrBitStream,
+                                pt_left,
+                                pt_right,
+                                pExt->pOutputBuffer,
+                                sbrDec,
+                                pVars,
+                                pMC_Info->nch) != SBRDEC_OK)
+                {
+                    status = MP4AUDEC_INVALID_FRAME;
+                }
+            }
+
+
+        }  /*  if( pExt->aacPlusEnabled == FALSE) */
+#endif
+
+        /*
+         * Copied mono data in both channels or just leave it as mono,
+         * according with desiredChannels (default is 2)
+         */
+
+        if (pExt->desiredChannels == 2)
+        {
+
+#if defined(AAC_PLUS)
+#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
+            if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1)
+#else
+            if (pMC_Info->nch != 2)
+#endif
+#else
+            if (pMC_Info->nch != 2)
+#endif
+            {
+                /* mono */
+
+
+                Int16 * pt  = &pExt->pOutputBuffer[0];
+                Int16 * pt2 = &pExt->pOutputBuffer[1];
+                Int i;
+                if (pMC_Info->upsamplingFactor == 2)
+                {
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2 = *pt;
+                        pt += 2;
+                        pt2 += 2;
+                    }
+                    pt  = &pExt->pOutputBuffer_plus[0];
+                    pt2 = &pExt->pOutputBuffer_plus[1];
+
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2 = *pt;
+                        pt += 2;
+                        pt2 += 2;
+                    }
+                }
+                else
+                {
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2 = *pt;
+                        pt += 2;
+                        pt2 += 2;
+                    }
+                }
+
+            }
+
+#if defined(AAC_PLUS)
+#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
+
+            else if (pMC_Info->psPresentFlag == 1)
+            {
+                Int32 frameSize = 0;
+                if (pExt->aacPlusEnabled == false)
+                {
+                    /*
+                     *  Decoding eaac+ when only aac is enabled, copy L into R
+                     */
+                    frameSize = 1024;
+                }
+                else if (sbrDecoderData->SbrChannel[0].syncState != SBR_ACTIVE)
+                {
+                    /*
+                     *  Decoding eaac+ when no PS data was found, copy upsampled L into R
+                     */
+                    frameSize = 2048;
+                }
+
+                Int16 * pt  = &pExt->pOutputBuffer[0];
+                Int16 * pt2 = &pExt->pOutputBuffer[1];
+                Int i;
+                for (i = 0; i < frameSize; i++)
+                {
+                    *pt2 = *pt;
+                    pt += 2;
+                    pt2 += 2;
+                }
+            }
+#endif
+#endif
+
+        }
+        else
+        {
+
+#if defined(AAC_PLUS)
+#if defined(PARAMETRICSTEREO)&&defined(HQ_SBR)
+            if (pMC_Info->nch != 2 && pMC_Info->psPresentFlag != 1)
+#else
+            if (pMC_Info->nch != 2)
+#endif
+#else
+            if (pMC_Info->nch != 2)
+#endif
+            {
+                /* mono */
+                Int16 * pt  = &pExt->pOutputBuffer[0];
+                Int16 * pt2 = &pExt->pOutputBuffer[0];
+                Int i;
+
+                if (pMC_Info->upsamplingFactor == 2)
+                {
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2++ = *pt;
+                        pt += 2;
+                    }
+
+                    pt  = &pExt->pOutputBuffer_plus[0];
+                    pt2 = &pExt->pOutputBuffer_plus[0];
+
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2++ = *pt;
+                        pt += 2;
+                    }
+                }
+                else
+                {
+                    for (i = 0; i < 1024; i++)
+                    {
+                        *pt2++ = *pt;
+                        pt += 2;
+                    }
+                }
+
+            }
+
+        }
+
+
+
+
+        /* pVars->ltp_buffer_state cycles between 0 and 1024.  The value
+         * indicates the location of the data corresponding to t == -2.
+         *
+         * | t == -2 | t == -1 |  pVars->ltp_buffer_state == 0
+         *
+         * | t == -1 | t == -2 |  pVars->ltp_buffer_state == 1024
+         *
+         */
+
+#ifdef AAC_PLUS
+        if (sbrBitStream->NrElements == 0 && pMC_Info->upsamplingFactor == 1)
+        {
+            pVars->ltp_buffer_state ^= frameLength;
+        }
+        else
+        {
+            pVars->ltp_buffer_state ^= (frameLength + 288);
+        }
+#else
+        pVars->ltp_buffer_state ^= frameLength;
+#endif
+
+
+        if (pVars->bno <= 1)
+        {
+            /*
+             * to set these values only during the second call
+             * when they change.
+             */
+            pExt->samplingRate =
+                samp_rate_info[pVars->mc_info.sampling_rate_idx].samp_rate;
+
+            pVars->mc_info.implicit_channeling = 0; /* disable flag, as this is allowed
+                                                      * only the first time
+                                                      */
+
+
+#ifdef AAC_PLUS
+
+            if (pMC_Info->upsamplingFactor == 2)
+            {
+                pExt->samplingRate *= pMC_Info->upsamplingFactor;
+                pExt->aacPlusUpsamplingFactor = pMC_Info->upsamplingFactor;
+            }
+
+#endif
+
+            pExt->extendedAudioObjectType = pMC_Info->ExtendedAudioObjectType;
+            pExt->audioObjectType = pMC_Info->audioObjectType;
+
+            pExt->encodedChannels = pMC_Info->nch;
+            pExt->frameLength = pVars->frameLength;
+        }
+
+        pVars->bno++;
+
+
+        /*
+         * Using unit analysis, the bitrate is a function of the sampling rate, bits,
+         * points in a frame
+         *
+         *     bits        samples                frame
+         *     ----  =    --------- *  bits  *   -------
+         *     sec           sec                  sample
+         *
+         * To save a divide, a shift is used. Presently only the value of
+         * 1024 is used by this library, so make it the most accurate for that
+         * value. This may need to be updated later.
+         */
+
+        pExt->bitRate = (pExt->samplingRate *
+                         (pVars->inputStream.usedBits - initialUsedBits)) >> 10;  /*  LONG_WINDOW  1024 */
+
+        pExt->bitRate >>= (pMC_Info->upsamplingFactor - 1);
+
+
+    } /* end if (status == SUCCESS) */
+
+
+    if (status != MP4AUDEC_SUCCESS)
+    {
+        /*
+         *  A non-SUCCESS decoding could be due to an error on the bitstream or
+         *  an incomplete frame. As access to the bitstream beyond frame boundaries
+         *  are not allowed, in those cases the bitstream reading routine return a 0
+         *  Zero values guarantees that the data structures are filled in with values
+         *  that eventually will signal an error (like invalid parameters) or that allow
+         *  completion of the parsing routine. Either way, the partial frame condition
+         *  is verified at this time.
+         */
+        if (pVars->prog_config.file_is_adts == TRUE)
+        {
+            status = MP4AUDEC_LOST_FRAME_SYNC;
+            pVars->prog_config.headerless_frames = 0; /* synchronization forced */
+        }
+        else
+        {
+            /*
+             *  Check if the decoding error was due to buffer overrun, if it was,
+             *  update status
+             */
+            if (pVars->inputStream.usedBits > pVars->inputStream.availableBits)
+            {
+                /* all bits were used but were not enough to complete decoding */
+                pVars->inputStream.usedBits = pVars->inputStream.availableBits;
+
+                status = MP4AUDEC_INCOMPLETE_FRAME; /* possible EOF or fractional frame */
+            }
+        }
+    }
+
+    /*
+     * Translate from units of bits back into units of words.
+     */
+
+    pExt->inputBufferUsedLength =
+        pVars->inputStream.usedBits >> INBUF_ARRAY_INDEX_SHIFT;
+
+    pExt->remainderBits = (Int)(pVars->inputStream.usedBits & INBUF_BIT_MODULO_MASK);
+
+
+
+    return (status);
+
+} /* PVMP4AudioDecoderDecodeFrame */
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecodergetmemrequirements.cpp b/media/libstagefright/codecs/aacdec/pvmp4audiodecodergetmemrequirements.cpp
new file mode 100644
index 0000000..7cdecd0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecodergetmemrequirements.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: PVMP4AudioDecoderGetMemRequirements.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Copied from aac_decode_frame
+
+ Description: Cleaned up.
+
+ Description: (1) use UInt32 to replace size_t type
+              (2) memory of tDec_Int_File is splitted into 3 pieces,
+                  sizeof(tDec_Int_File) is only part of the total memory
+                  required. The additional memory required to decode per
+                  channel information is allocated by a DPI call outside this
+                  API
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs: None
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+    size = amount of memory needed to be allocated by the calling
+        environment.
+
+ Pointers and Buffers Modified: None
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function returns the amount of internal memory needed by the library.
+ Presently this is a constant value, but could later be more sophisticated
+ by taking into account mono or stereo, and whether LTP is to be used.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    size = sizeof(tDec_Int_File);
+
+ RETURN (size)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+#include "pvmp4audiodecoder_api.h" /* Where this function is declared */
+
+/*----------------------------------------------------------------------------
+; 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 CODE
+----------------------------------------------------------------------------*/
+OSCL_EXPORT_REF UInt32 PVMP4AudioDecoderGetMemRequirements(void)
+{
+    UInt32 size;
+
+    size = (UInt32) sizeof(tDec_Int_File);
+
+    return (size);
+
+} /* PVMP4AudioDecoderGetMemRequirements() */
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecoderinitlibrary.cpp b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderinitlibrary.cpp
new file mode 100644
index 0000000..146ba0f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderinitlibrary.cpp
@@ -0,0 +1,418 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: PVMP4AudioDecoderInitLibrary.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Copied from aac_decode_frame
+
+ Description:  Clean up.
+
+ Description:  Update per review comments
+
+ Description:  Add frame_length, fix mistake in pseudo-code.
+               Change frame_length to frameLength, to matcht the API,
+               look more professional, etc.
+
+ Description:
+ (1) Added #include of "e_ProgConfigConst.h"
+     Previously, this function was relying on another include file
+     to include "e_ProgConfigConst.h"
+
+ (2) Updated the copyright header.
+
+ Description:
+ (1) Modified to initialize pointers for shared memory techniques.
+
+ Description: Since memory will be allocated continuously, it is initialized
+              in one spot
+
+ Description: Added field aacPlusUpsamplingFactor (default == 1) to have a
+              common interface for all AAC variations
+
+ Description: Added PVMP4AudioDecoderDisableAacPlus to disable sbr decoding
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pExt = pointer to the external application-program interface (API)
+           structure that a client program uses to communicate information
+           with this library. Among the items in this structure is a pointer
+           to the input and output buffers, data for handling the input buffer
+           and output information. Look in PVMP4AudioDecoder_API.h for all the
+           fields to this structure. Data type pointer to a
+           tPVMP4AudioDecoderExternal structure.
+
+   pMem =  pointer to allocated memory, of the size returned by the function
+           PVMP4AudioDecoderGetMemRequirements. This is a void pointer for
+           two reasons:
+           1) So the external program does not need all of the header files
+              for all of the fields in the structure tDec_Int_File
+           2) To hide data and the implementation of the program. Even knowing
+              how data is stored can help in reverse engineering software.
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+    status = 0 (SUCCESS). Presently there is no error checking in this
+    function.
+
+ Pointers and Buffers Modified: None
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Initializes the internal memory for the MP4 Audio Decoder library.
+ Also sets relevant values for the external interface structure, clears
+ the bit rate, channel count, sampling rate, and number of used buffer
+ elements.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pVars = pMem;
+
+    CALL pv_memset(
+           to = pVars,
+           c  = 0,
+           n  = sizeof(tDec_Int_File))
+    MODIFYING(*pVars = 0)
+    RETURNING(nothing)
+
+    pVars->current_program = -1
+    pVars->mc_info.sampling_rate_idx = Fs_44
+    pVars->frameLength = LONG_WINDOW
+
+
+    pVars->winmap[ONLY_LONG_SEQUENCE]   = &pVars->longFrameInfo;
+    pVars->winmap[LONG_START_SEQUENCE]  = &pVars->longFrameInfo;
+    pVars->winmap[EIGHT_SHORT_SEQUENCE] = &pVars->shortFrameInfo;
+    pVars->winmap[LONG_STOP_SEQUENCE]   = &pVars->longFrameInfo;
+
+    CALL infoinit(
+        samp_rate_indx = pVars->mc_info.sampling_rate_idx,
+        ppWin_seq_info = pVars->winmap,
+        pSfbwidth128   = pVars->SFBWidth128)
+    MODIFYING(ppWinSeq_info)
+    MODIFYING(pSfbwidth128)
+    RETURNING(nothing)
+
+    pExt->bitRate = 0;
+    pExt->encodedChannels = 0;
+    pExt->samplingRate = 0;
+    pExt->inputBufferUsedLength = 0;
+
+    MODIFY(pExt)
+    MODIFY(pMem)
+    RETURN(SUCCESS)
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+#include "e_progconfigconst.h"
+
+#include "huffman.h"               /* For the definition of infoinit        */
+#include "aac_mem_funcs.h"         /* For pv_memset                         */
+#include "pvmp4audiodecoder_api.h" /* Where this function is declared       */
+#include "s_tdec_int_chan.h"
+#include "sfb.h"                   /* samp_rate_info[] is declared here     */
+
+/*----------------------------------------------------------------------------
+; 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 CODE
+----------------------------------------------------------------------------*/
+OSCL_EXPORT_REF Int PVMP4AudioDecoderInitLibrary(
+    tPVMP4AudioDecoderExternal  *pExt,
+    void                        *pMem)
+{
+    tDec_Int_File *pVars;
+
+    pVars = (tDec_Int_File *)pMem;
+
+    /*
+     * Initialize all memory. The pointers to channel memory will be
+     * set to zero also.
+     */
+    pv_memset(
+        pVars,
+        0,
+        sizeof(tDec_Int_File));
+
+    /*
+     * Pick default values for the library.
+     */
+    pVars->perChan[0].fxpCoef = pVars->fxpCoef[0];
+    pVars->perChan[1].fxpCoef = pVars->fxpCoef[1];
+
+    /* Here, the "shared memory" pointer is set to point
+     * at the 1024th element of fxpCoef, because those spaces
+     * in memory are not used until the filterbank is called.
+     *
+     * Therefore, any variables that are only used before
+     * the filterbank can occupy this same space in memory.
+     */
+
+    pVars->perChan[0].pShareWfxpCoef = (per_chan_share_w_fxpCoef *)
+                                       & (pVars->perChan[0].fxpCoef[1024]);
+
+    pVars->perChan[1].pShareWfxpCoef = (per_chan_share_w_fxpCoef *)
+                                       & (pVars->perChan[1].fxpCoef[1024]);
+
+    /*
+     * This next line informs the function get_prog_config that no
+     * configuration has been found thus far, so it is a default
+     * configuration.
+     */
+
+    pVars->current_program = -1;
+    pVars->mc_info.sampling_rate_idx = Fs_44; /* Fs_44 = 4, 44.1kHz */
+
+    /*
+     * In the future, the frame length will change with MP4 file format.
+     * Presently this variable is used to simply the unit test for
+     * the function PVMP4AudioDecodeFrame() .. otherwise the test would
+     * have to pass around 1024 length arrays.
+     */
+    pVars->frameLength = LONG_WINDOW; /* 1024*/
+
+    /*
+     * The window types ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE, and
+     * LONG_STOP_SEQUENCE share the same information. The only difference
+     * between the windows is accounted for in the "filterbank", in
+     * the function trans4m_freq_2_time_fxp()
+     */
+
+    pVars->winmap[ONLY_LONG_SEQUENCE]   /* 0 */ = &pVars->longFrameInfo;
+    pVars->winmap[LONG_START_SEQUENCE]  /* 1 */ = &pVars->longFrameInfo;
+    pVars->winmap[EIGHT_SHORT_SEQUENCE] /* 2 */ = &pVars->shortFrameInfo;
+    pVars->winmap[LONG_STOP_SEQUENCE]   /* 3 */ = &pVars->longFrameInfo;
+
+    infoinit(
+        pVars->mc_info.sampling_rate_idx,
+        (FrameInfo   **)pVars->winmap,
+        pVars->SFBWidth128);
+
+
+    /*
+     * Clear out external output values. These values are set later at the end
+     * of PVMP4AudioDecodeFrames()
+     */
+    pExt->bitRate = 0;
+    pExt->encodedChannels = 0;
+    pExt->samplingRate = 0;
+    pExt->aacPlusUpsamplingFactor = 1;  /*  Default for regular AAC */
+    pVars->aacPlusEnabled = pExt->aacPlusEnabled;
+
+
+#if defined(AAC_PLUS)
+    pVars->sbrDecoderData.setStreamType = 1;        /* Enable Lock for AAC stream type setting  */
+#endif
+
+    /*
+     * Initialize input buffer variable.
+     */
+
+    pExt->inputBufferUsedLength = 0;
+
+    return (MP4AUDEC_SUCCESS);
+
+}  /* PVMP4AudioDecoderInitLibrary */
+
+
+/*
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pExt = pointer to the external application-program interface (API)
+           structure that a client program uses to communicate information
+           with this library. Among the items in this structure is a pointer
+           to the input and output buffers, data for handling the input buffer
+           and output information. Look in PVMP4AudioDecoder_API.h for all the
+           fields to this structure. Data type pointer to a
+           tPVMP4AudioDecoderExternal structure.
+
+   pMem =  pointer to allocated memory, of the size returned by the function
+           PVMP4AudioDecoderGetMemRequirements. This is a void pointer for
+           two reasons:
+           1) So the external program does not need all of the header files
+              for all of the fields in the structure tDec_Int_File
+           2) To hide data and the implementation of the program. Even knowing
+              how data is stored can help in reverse engineering software.
+
+ Local Stores/Buffers/Pointers Needed: None
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+    status = 0 (SUCCESS). Presently there is no error checking in this
+    function.
+
+ Pointers and Buffers Modified: None
+
+ Local Stores Modified: None
+
+ Global Stores Modified: None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ Disable SBR decoding functionality and set parameters accordingly
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+OSCL_EXPORT_REF void PVMP4AudioDecoderDisableAacPlus(
+    tPVMP4AudioDecoderExternal  *pExt,
+    void                        *pMem)
+{
+    tDec_Int_File *pVars;
+
+    pVars = (tDec_Int_File *)pMem;
+
+    if ((pVars->aacPlusEnabled == true) && (pExt->aacPlusEnabled == true))
+    {
+        // disable only when makes sense
+        pVars->aacPlusEnabled = false;
+        pExt->aacPlusEnabled = false;
+
+#if defined(AAC_PLUS)
+        pVars->mc_info.upsamplingFactor = 1;
+        pVars->mc_info.psPresentFlag  = 0;
+        pVars->mc_info.sbrPresentFlag = 0;
+        pVars->prog_config.sampling_rate_idx += 3;
+        pVars->sbrDecoderData.SbrChannel[0].syncState = SBR_NOT_INITIALIZED;
+        pVars->sbrDecoderData.SbrChannel[1].syncState = SBR_NOT_INITIALIZED;
+
+
+        pExt->samplingRate = samp_rate_info[pVars->prog_config.sampling_rate_idx].samp_rate;
+        pExt->aacPlusUpsamplingFactor = 1;
+#endif
+    }
+}  /* PVMP4AudioDecoderDisableAacPlus */
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4audiodecoderresetbuffer.cpp b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderresetbuffer.cpp
new file mode 100644
index 0000000..c10423b1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4audiodecoderresetbuffer.cpp
@@ -0,0 +1,354 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: PVMP4AudioDecoderResetBuffer.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) add more comments (2) set pVars->bno = 1
+
+ Description: perChan[] is an array of structures in tDec_Int_File. Made
+              corresponding changes.
+
+ Who:                                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tDec_Int_File structure. This structure
+           contains information that needs to persist between calls to
+           PVMP4AudioDecodeFrame
+           Data type void pointer, internally pointer to a tDec_Int_File
+           structure.
+
+ Local Stores/Buffers/Pointers Needed: None
+           (The memory set aside in pMem performs this task)
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs: None
+
+ Pointers and Buffers Modified:
+    pMem contents are modified.
+    pMem->perChan[0].time_quant[0-1023]: contents are set to zero
+    pMem->perChan[1].time_quant[0-1023]: contents are set to zero
+    pMem->bno = 1
+
+ Local Stores Modified: None.
+
+ Global Stores Modified: None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  This function is called when the same audio clip will be played again from
+  the begining. This situation happens when the "stop" button is pressed or
+  the "loop-mode" is selected on PVPlayer. Since it is the same audio clip to
+  be played again, the decoder does not need to reset the audioSpecificInfo.
+  However, the overlap-and-add buffer of the filterbank output needs to be
+  cleared, so that the decoder can re-start properly from the begining of
+  the audio. The frame number counter, pVars->bno, is set to 1 because the
+  audioSpecificInfo is decoded on pVars->bno==0
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ PacketVideo Document # CCC-AUD-AAC-ERS-0003
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3: 1999(E)
+      subclause 1.6
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+#include "pvmp4audiodecoder_api.h"   /* Where this function is declared */
+#include "aac_mem_funcs.h"
+
+#ifdef AAC_PLUS
+#include    "s_sbr_frame_data.h"
+#endif
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LEFT  (0)
+#define RIGHT (1)
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+OSCL_EXPORT_REF void PVMP4AudioDecoderResetBuffer(void  *pMem)
+{
+
+    tDec_Int_File *pVars;           /* Helper pointer */
+
+#ifdef AAC_PLUS
+    SBR_FRAME_DATA * hFrameData_1;
+    SBR_FRAME_DATA * hFrameData_2;
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+    SBRDECODER_DATA *sbrDecoderData;
+#endif
+#endif
+
+#endif
+    /*
+     * Initialize "helper" pointers to existing memory.
+     */
+    pVars = (tDec_Int_File *)pMem;
+
+    /*
+     * Clear the overlap-and-add buffer of filterbank output. The audio
+     * clip will be played again from the beginning.
+     */
+    pv_memset(pVars->perChan[LEFT].time_quant,
+              0,
+              LONG_WINDOW*sizeof(pVars->perChan[LEFT].time_quant[0]));
+
+    pv_memset(pVars->perChan[RIGHT].time_quant,
+              0,
+              LONG_WINDOW*sizeof(pVars->perChan[RIGHT].time_quant[0]));
+
+
+#ifdef AAC_PLUS
+
+    if (!pVars->sbrDecoderData.setStreamType)  /* reset only when stream type is defined */
+    {
+        if (pVars->aacPlusEnabled == true)  /* clear buffer only if they were used */
+        {
+
+            hFrameData_1   = (SBR_FRAME_DATA *) & pVars->sbrDecoderData.SbrChannel[LEFT].frameData;
+            hFrameData_2   = (SBR_FRAME_DATA *) & pVars->sbrDecoderData.SbrChannel[RIGHT].frameData;
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+            sbrDecoderData = (SBRDECODER_DATA *) & pVars->sbrDecoderData;
+            sbrDecoderData->hParametricStereoDec = (HANDLE_PS_DEC) & pVars->sbrDecoderData.ParametricStereoDec;
+#endif
+#endif
+
+
+            pv_memset(&pVars->perChan[LEFT].ltp_buffer[0],
+                      0,
+                      288*sizeof(pVars->perChan[LEFT].ltp_buffer[0]));
+            pv_memset(&pVars->perChan[LEFT].ltp_buffer[1024 + 288],
+                      0,
+                      288*sizeof(pVars->perChan[LEFT].ltp_buffer[0]));
+            pv_memset(hFrameData_1->V,
+                      0,
+                      1152*sizeof(hFrameData_1->V[0]));
+            pv_memset(hFrameData_1->prevNoiseLevel_man,
+                      0,
+                      MAX_NUM_NOISE_VALUES*sizeof(hFrameData_1->prevNoiseLevel_man[0]));
+
+
+            pv_memset(&pVars->perChan[RIGHT].ltp_buffer[0],
+                      0,
+                      288*sizeof(pVars->perChan[RIGHT].ltp_buffer[0]));
+            pv_memset(&pVars->perChan[RIGHT].ltp_buffer[1024 + 288],
+                      0,
+                      288*sizeof(pVars->perChan[RIGHT].ltp_buffer[0]));
+            pv_memset(hFrameData_2->V,
+                      0,
+                      1152*sizeof(hFrameData_2->V[0]));
+
+            pv_memset(hFrameData_2->prevNoiseLevel_man,
+                      0,
+                      MAX_NUM_NOISE_VALUES*sizeof(hFrameData_2->prevNoiseLevel_man[0]));
+
+
+            int i;
+            for (i = 0; i < 8; i++)
+            {
+                pv_memset((void *)&hFrameData_1->codecQmfBufferReal[i],
+                          0,
+                          sizeof(**hFrameData_1->codecQmfBufferReal) << 5);
+            }
+
+
+            /* ---- */
+            pv_memset((void *)hFrameData_1->BwVectorOld,
+                      0,
+                      sizeof(*hFrameData_1->BwVectorOld)*MAX_NUM_PATCHES);
+
+#ifdef HQ_SBR
+
+            for (i = 0; i < 5; i++)
+            {
+                pv_memset((void *)&hFrameData_1->fBuffer_man[i],
+                          0,
+                          sizeof(**hFrameData_1->fBuffer_man)*64);
+                pv_memset((void *)&hFrameData_1->fBufferN_man[i],
+                          0,
+                          sizeof(**hFrameData_1->fBufferN_man)*64);
+            }
+#endif
+
+
+            /* ---- */
+
+
+
+            pv_memset((void *)hFrameData_1->HistsbrQmfBufferReal,
+                      0,
+                      sizeof(*hFrameData_1->HistsbrQmfBufferReal)*6*SBR_NUM_BANDS);
+
+#ifdef HQ_SBR
+            pv_memset((void *)hFrameData_1->HistsbrQmfBufferImag,
+                      0,
+                      sizeof(*hFrameData_1->HistsbrQmfBufferImag)*6*SBR_NUM_BANDS);
+#endif
+
+            if (pVars->sbrDec.LC_aacP_DecoderFlag == 1)  /* clear buffer only for LC decoding */
+            {
+
+                for (i = 0; i < 8; i++)
+                {
+                    pv_memset((void *)&hFrameData_2->codecQmfBufferReal[i],
+                              0,
+                              sizeof(**hFrameData_1->codecQmfBufferReal) << 5);
+                }
+
+                pv_memset((void *)hFrameData_2->HistsbrQmfBufferReal,
+                          0,
+                          sizeof(*hFrameData_2->HistsbrQmfBufferReal)*6*SBR_NUM_BANDS);
+
+
+                pv_memset((void *)hFrameData_2->BwVectorOld,
+                          0,
+                          sizeof(*hFrameData_2->BwVectorOld)*MAX_NUM_PATCHES);
+
+#ifdef HQ_SBR
+
+                for (i = 0; i < 5; i++)
+                {
+                    pv_memset((void *)&hFrameData_2->fBuffer_man[i],
+                              0,
+                              sizeof(**hFrameData_2->fBuffer_man)*64);
+                    pv_memset((void *)&hFrameData_2->fBufferN_man[i],
+                              0,
+                              sizeof(**hFrameData_2->fBufferN_man)*64);
+                }
+#endif
+
+            }
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+            else if (pVars->mc_info.psPresentFlag == 1)
+            {
+                for (i = 0; i < 3; i++)
+                {
+                    pv_memset(sbrDecoderData->hParametricStereoDec->hHybrid->mQmfBufferReal[i],
+                              0,
+                              HYBRID_FILTER_LENGTH_m_1*sizeof(*sbrDecoderData->hParametricStereoDec->hHybrid->mQmfBufferReal));
+                    pv_memset(sbrDecoderData->hParametricStereoDec->hHybrid->mQmfBufferImag[i],
+                              0,
+                              HYBRID_FILTER_LENGTH_m_1*sizeof(*sbrDecoderData->hParametricStereoDec->hHybrid->mQmfBufferImag));
+                }
+            }
+#endif
+#endif
+
+            /*
+             *  default to UPSAMPLING, as if the file is SBR_ACTIVE, this will be fine and will be
+             *  fixed onced the new sbr header is found
+             *  SBR headers contain SBT freq. range as well as control signals that do not require
+             *  frequent changes.
+             *  For streaming, the SBR header is sent twice per second. Also, an SBR header can be
+             *  inserted at any time, if a change of parameters is needed.
+             */
+
+            pVars->sbrDecoderData.SbrChannel[LEFT].syncState = UPSAMPLING;
+            pVars->sbrDecoderData.SbrChannel[RIGHT].syncState = UPSAMPLING;
+
+        }
+    }
+#endif      /*  #ifdef AAC_PLUS */
+
+    /* reset frame count to 1 */
+    pVars->bno = 1;
+
+    return ;
+
+} /* PVMP4AudioDecoderDecodeFrame */
+
diff --git a/media/libstagefright/codecs/aacdec/pvmp4setaudioconfig.cpp b/media/libstagefright/codecs/aacdec/pvmp4setaudioconfig.cpp
new file mode 100644
index 0000000..d183d84
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/pvmp4setaudioconfig.cpp
@@ -0,0 +1,368 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: pvmp4setaudioconfigg
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pExt = pointer to the external interface structure. See the file
+           PVMP4AudioDecoder_API.h for a description of each field.
+           Data type of pointer to a tPVMP4AudioDecoderExternal
+           structure.
+
+           pExt->pInputBuffer: pointer to input buffer containing input
+                               bitstream
+
+           pExt->inputBufferCurrentLength: number of bytes in the input buffer
+
+           pExt->inputBufferUsedLength: number of bytes already consumed in
+                                        input buffer
+
+           pExt->remainderBits: number of bits consumed in addition to
+                                pExt->inputBufferUsedLength
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tDec_Int_File structure. This structure
+           contains information that needs to persist between calls to
+           this function, or is too big to be placed on the stack, even
+           though the data is only needed during execution of this function
+           Data type void pointer, internally pointer to a tDec_Int_File
+           structure.
+
+ Local Stores/Buffers/Pointers Needed: None
+           (The memory set aside in pMem performs this task)
+
+ Global Stores/Buffers/Pointers Needed: None
+
+ Outputs:
+     status = 0                       if no error occurred
+              MP4AUDEC_NONRECOVERABLE if a non-recoverable error occurred
+              MP4AUDEC_RECOVERABLE    if a recoverable error occurred.
+              Presently a recoverable error does not exist, but this
+              was a requirement.
+
+
+ Pointers and Buffers Modified:
+    pMem contents are modified.
+    pExt: (more detail in the file PVMP4AudioDecoder_API.h)
+    inputBufferUsedLength - number of array elements used up by the stream.
+    remainderBits - remaining bits in the next UInt32 buffer
+    samplingRate - sampling rate in samples per sec
+    encodedChannels - channels found on the file (informative)
+    frameLength - length of the frame
+
+ Local Stores Modified: None.
+
+ Global Stores Modified: None.
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ PacketVideo Document # CCC-AUD-AAC-ERS-0003
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+#include "ibstream.h"           /* where #define INBUF_ARRAY_INDEX_SHIFT */
+#include "sfb.h"                   /* Where samp_rate_info[] is declared */
+
+#include "get_audio_specific_config.h"
+#include "pvmp4audiodecoder_api.h"   /* Where this function is declared */
+#include "set_mc_info.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
+----------------------------------------------------------------------------*/
+
+Int PVMP4SetAudioConfig(
+    tPVMP4AudioDecoderExternal  *pExt,
+    void                        *pMem,
+    Int                         upsamplingFactor,
+    Int                         samp_rate,
+    Int                         num_ch,
+    tMP4AudioObjectType         audioObjectType)
+
+{
+
+    tDec_Int_File *pVars;           /* Helper pointer */
+
+    Int            status = MP4AUDEC_INCOMPLETE_FRAME;
+
+    /*
+     * Initialize "helper" pointers to existing memory.
+     */
+    pVars = (tDec_Int_File *)pMem;
+    /*
+     * Translate input buffer variables.
+     */
+    pVars->inputStream.pBuffer = pExt->pInputBuffer;
+
+    pVars->inputStream.availableBits = 0;
+
+    pVars->inputStream.usedBits = 0;
+
+
+
+    /*
+     *  get sampling rate index
+     */
+
+    switch (samp_rate)
+    {
+        case 96000:
+            pVars->prog_config.sampling_rate_idx = 0;
+            break;
+        case 88200:
+            pVars->prog_config.sampling_rate_idx = 1;
+            break;
+        case 64000:
+            pVars->prog_config.sampling_rate_idx = 2;
+            break;
+        case 48000:
+            pVars->prog_config.sampling_rate_idx = 3;
+            break;
+        case 44100:
+            pVars->prog_config.sampling_rate_idx = 4;
+            break;
+        case 32000:
+            pVars->prog_config.sampling_rate_idx = 5;
+            break;
+        case 24000:
+            pVars->prog_config.sampling_rate_idx = 6;
+            break;
+        case 22050:
+            pVars->prog_config.sampling_rate_idx = 7;
+            break;
+        case 16000:
+            pVars->prog_config.sampling_rate_idx = 8;
+            break;
+        case 12000:
+            pVars->prog_config.sampling_rate_idx = 9;
+            break;
+        case 11025:
+            pVars->prog_config.sampling_rate_idx = 10;
+            break;
+        case 8000:
+            pVars->prog_config.sampling_rate_idx = 11;
+            break;
+        case 7350:
+            pVars->prog_config.sampling_rate_idx = 12;
+            break;
+        default:
+            status = -1;
+
+            break;
+    }
+
+    pVars->mc_info.sbrPresentFlag = 0;
+    pVars->mc_info.psPresentFlag = 0;
+#ifdef AAC_PLUS
+    pVars->mc_info.bDownSampledSbr = 0;
+#endif
+    pVars->mc_info.implicit_channeling = 0;
+    pVars->mc_info.nch = num_ch;
+    pVars->mc_info.upsamplingFactor = upsamplingFactor;
+
+
+    /*
+     *  Set number of channels
+     */
+
+    if (num_ch == 2)
+    {
+        pVars->prog_config.front.ele_is_cpe[0] = 1;
+    }
+    else if (num_ch == 1)
+    {
+        pVars->prog_config.front.ele_is_cpe[0] = 0;
+    }
+    else
+    {
+        status = -1; /* do not support more than two channels */
+        pVars->status = status;
+        return (status);
+    }
+
+
+    /*
+     *  Set AAC bitstream
+     */
+
+    if ((audioObjectType == MP4AUDIO_AAC_LC)        ||
+            (audioObjectType == MP4AUDIO_LTP))
+    {
+        pVars->aacPlusEnabled = false;
+
+        status = set_mc_info(&(pVars->mc_info),
+                             audioObjectType, /* previously profile */
+                             pVars->prog_config.sampling_rate_idx,
+                             pVars->prog_config.front.ele_tag[0],
+                             pVars->prog_config.front.ele_is_cpe[0],
+                             pVars->winmap, /*pVars->pWinSeqInfo,*/
+                             pVars->SFBWidth128);
+    }
+    else if ((audioObjectType == MP4AUDIO_SBR)        ||
+             (audioObjectType == MP4AUDIO_PS))
+    {
+        pVars->aacPlusEnabled = true;
+
+
+        status = set_mc_info(&(pVars->mc_info),
+                             MP4AUDIO_AAC_LC,
+                             pVars->prog_config.sampling_rate_idx,
+                             pVars->prog_config.front.ele_tag[0],
+                             pVars->prog_config.front.ele_is_cpe[0],
+                             pVars->winmap, /*pVars->pWinSeqInfo,*/
+                             pVars->SFBWidth128);
+
+        pVars->mc_info.sbrPresentFlag = 1;
+        if (audioObjectType == MP4AUDIO_PS)
+        {
+            pVars->mc_info.psPresentFlag = 1;
+        }
+
+        if (upsamplingFactor == 1)
+        {
+#ifdef AAC_PLUS
+            pVars->mc_info.bDownSampledSbr = 1;
+#endif
+
+            /*
+             *  Disable SBR decoding for any sbr-downsampled file whose SF is >= 24 KHz
+             */
+            if (pVars->prog_config.sampling_rate_idx < 6)
+            {
+                pVars->aacPlusEnabled = false;
+            }
+        }
+
+    }
+    else
+    {
+        status = -1;
+    }
+
+
+    /*
+     * Translate from units of bits back into units of words.
+     */
+    pExt->inputBufferUsedLength = 0;
+
+    pExt->remainderBits = 0;
+
+    pVars->bno++;
+
+    pExt->samplingRate = samp_rate * upsamplingFactor;
+
+    pExt->aacPlusEnabled = pVars->aacPlusEnabled;
+
+    /*
+     *  we default to 2 channel, even for mono files, (where channels have same content)
+     *  this is done to ensure support for enhanced aac+ with implicit signalling
+     */
+
+    pExt->encodedChannels = 2;
+
+    pExt->frameLength = 1024;
+#ifdef AAC_PLUS
+    pExt->aacPlusUpsamplingFactor = upsamplingFactor;
+#endif
+
+    pVars->status = status;
+
+    return (status);
+
+} /* PVMP4AudioDecoderDecodeFrame */
diff --git a/media/libstagefright/codecs/aacdec/q_normalize.cpp b/media/libstagefright/codecs/aacdec/q_normalize.cpp
new file mode 100644
index 0000000..5266966
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/q_normalize.cpp
@@ -0,0 +1,388 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: q_normalize.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Modify to include search over the scalefactor bands to insure
+     that the data is using all 31 data-bits.
+
+ Description:
+ (1) Modify to remove search over the scalefactor bands to insure
+     that the data is using all 31 data-bits.
+     (Pushed out into separate function)
+ (2) Change variable "k" to more descriptive "shift_amt"
+ (3) Update pseudocode to reflect removed code.
+ (4) Add PV Copyright notice.
+
+ Description:
+ (1) Modified to protect q-normalize from shifting by amounts >= 32.
+
+ Description:
+ (1) Delete local variable idx_count.
+
+ Description:
+ (1) Included search for max in each frame, modified interface.
+
+ Description:
+ (1) unrolled loop based on the fact that the size of each scale band
+     is always an even number.
+
+ Description:Check shift, if zero, do not shift.
+
+ Description: Eliminated warning: non use variable "i" and memset function
+    definition
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    qFormat[] = Array of qFormats, one per scalefactor band. [ Int ]
+
+    pFrameInfo = Pointer to structure that holds information about each group.
+                 (long block flag, number of windows, scalefactor bands, etc.)
+                 [const FrameInfo]
+
+    coef[]    = Array of the spectral coefficients for one channel. [ Int32 ]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    min_q = The common q-format for the entire frame. [Int]
+
+ Pointers and Buffers Modified:
+    coef[]    = Array of spectral data, now normalized to one q-format.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This module first scans every scalefactor band for the frame, insuring that
+ at least one element in that scalefactor band is using all available bits.
+ If not, the elements in the scalefactor band are shifted up to use all 31
+ data bits.  The q-format is adjusted accordingly.
+
+ This module then scans the q-formats for each scalefactor band.
+ Upon finding the minimum q-format in the frame, the coefficients in each
+ scalefactor band are normalized to the minimum q-format.
+ The minimum q-format is then returned to the calling function, which is now
+ the q-format for the entire frame.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    nwin = pFrameInfo->num_win;
+
+    pQformat   = &(qFormat[0]);
+    pSfbPerWin = &(pFrameInfo->sfb_per_win[0]);
+    pCoef      = &(coef[0]);
+
+    FOR (win = nwin; win > 0; win--)
+
+        nsfb = *(pSfbPerWin++);
+
+        FOR (sfb = nsfb; sfb > 0; sfb--)
+
+            IF ( *(pQformat) < min_q)
+                min_q = *(pQformat);
+            ENDIF
+
+            pQformat++;
+
+        ENDFOR
+
+    ENDFOR
+
+    pQformat   = &(qFormat[0]);
+    pSfbPerWin = &(pFrameInfo->sfb_per_win[0]);
+    pCoef      = &(coef[0]);
+
+    FOR (win = 0; win < nwin; win++)
+
+        stop_idx = 0;
+
+        nsfb   = *(pSfbPerWin++);
+
+        pWinSfbTop = &(pFrameInfo->win_sfb_top[win][0]);
+
+        FOR (sfb = nsfb; sfb > 0; sfb--)
+
+            sfbWidth  = *(pWinSfbTop++) - stop_idx;
+
+            stop_idx += sfbWidth;
+
+            k = *(pQformat++) - min_q;
+
+            IF (k < 32)
+            THEN
+                FOR (; sfbWidth > 0; sfbWidth--)
+                    *(pCoef++) >>= k;
+                ENDFOR
+            ELSE
+                FOR (; sfbWidth > 0; sfbWidth--)
+                    *(pCoef++) = 0;
+                ENDFOR
+            ENDIF
+
+        ENDFOR
+
+    ENDFOR
+
+    return min_q;
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_frameinfo.h"
+#include "q_normalize.h"
+#include "aac_mem_funcs.h"         /* For pv_memset                         */
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int q_normalize(
+    Int        qFormat[],
+    const FrameInfo *pFrameInfo,
+    Int32      abs_max_per_window[],
+    Int32      coef[])
+{
+    Int    sfb;
+    Int    nsfb;
+    Int    win;
+    Int    nwin;
+    Int    sfbWidth;
+
+    Int    shift_amt;
+
+    /* Initialize min_q to a very large value */
+    Int    min_q = 1000;
+
+    Int stop_idx  = 0;
+
+    const Int   *pSfbPerWin;
+    const Int16 *pWinSfbTop;
+
+    Int   *pQformat;
+    Int32 *pCoef;
+
+    nwin = pFrameInfo->num_win;
+
+    /* Find the minimum q format */
+    pQformat   = &(qFormat[0]);
+    pSfbPerWin = &(pFrameInfo->sfb_per_win[0]);
+
+    for (win = nwin; win != 0; win--)
+    {
+
+        nsfb = *(pSfbPerWin++);
+
+        if (nsfb < 0 || nsfb > MAXBANDS)
+        {
+            break;  /* avoid any processing on error condition */
+        }
+
+        for (sfb = nsfb; sfb != 0; sfb--)
+        {
+            Int qformat = *(pQformat++);
+            if (qformat < min_q)
+            {
+                min_q = qformat;
+            }
+        }
+
+    } /* for(win) */
+
+    /* Normalize the coefs in each scalefactor band to one q-format */
+    pQformat   = &(qFormat[0]);
+    pSfbPerWin = &(pFrameInfo->sfb_per_win[0]);
+    pCoef      = &(coef[0]);
+
+    for (win = 0; win < nwin; win++)
+    {
+
+        Int32 max = 0;
+        stop_idx = 0;
+
+        nsfb   = *(pSfbPerWin++);
+
+        if (nsfb < 0 || nsfb > MAXBANDS)
+        {
+            break;  /* avoid any processing on error condition */
+        }
+
+        pWinSfbTop = &(pFrameInfo->win_sfb_top[win][0]);
+
+        for (sfb = nsfb; sfb != 0; sfb--)
+        {
+            Int tmp1, tmp2;
+            tmp1 = *(pWinSfbTop++);
+            tmp2 = *(pQformat++);
+            sfbWidth  = tmp1 - stop_idx;
+
+            if (sfbWidth < 2)
+            {
+                break;  /* will lead to error condition */
+            }
+
+            stop_idx += sfbWidth;
+
+            shift_amt = tmp2 - min_q;
+
+            if (shift_amt == 0)
+            {
+                Int32 tmp1, tmp2;
+                tmp1 = *(pCoef++);
+                tmp2 = *(pCoef++);
+                /*
+                 *  sfbWidth is always an even number
+                 *  (check tables in pg.66 IS0 14496-3)
+                 */
+                for (Int i = (sfbWidth >> 1) - 1; i != 0; i--)
+                {
+                    max  |= (tmp1 >> 31) ^ tmp1;
+                    max  |= (tmp2 >> 31) ^ tmp2;
+                    tmp1 = *(pCoef++);
+                    tmp2 = *(pCoef++);
+                }
+                max  |= (tmp1 >> 31) ^ tmp1;
+                max  |= (tmp2 >> 31) ^ tmp2;
+
+            }
+            else
+            {
+                if (shift_amt < 31)
+                {
+                    Int32 tmp1, tmp2;
+                    tmp1 = *(pCoef++) >> shift_amt;
+                    tmp2 = *(pCoef--) >> shift_amt;
+                    /*
+                     *  sfbWidth is always an even number
+                     *  (check tables in pg.66 IS0 14496-3)
+                     */
+                    for (Int i = (sfbWidth >> 1) - 1; i != 0; i--)
+                    {
+                        *(pCoef++)   = tmp1;
+                        *(pCoef++)   = tmp2;
+
+                        max  |= (tmp1 >> 31) ^ tmp1;
+                        max  |= (tmp2 >> 31) ^ tmp2;
+                        tmp1 = *(pCoef++) >> shift_amt;
+                        tmp2 = *(pCoef--) >> shift_amt;
+
+                    }
+                    *(pCoef++)   = tmp1;
+                    *(pCoef++)   = tmp2;
+                    max  |= (tmp1 >> 31) ^ tmp1;
+                    max  |= (tmp2 >> 31) ^ tmp2;
+
+                }
+                else
+                {
+                    pv_memset(pCoef, 0, sizeof(Int32)*sfbWidth);
+                    pCoef += sfbWidth;
+                }
+            }
+
+            abs_max_per_window[win] = max;
+
+        }
+
+    } /* for (win) */
+
+    return min_q;
+
+} /* normalize() */
diff --git a/media/libstagefright/codecs/aacdec/q_normalize.h b/media/libstagefright/codecs/aacdec/q_normalize.h
new file mode 100644
index 0000000..63a9d53
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/q_normalize.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: q_normalize.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Added PV Copyright notice.
+ (2) Removed embedded TABS
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+  This file includes the function definition for q_normalize.h
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef Q_NORMALIZE_H
+#define Q_NORMALIZE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_frameinfo.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int q_normalize(
+        Int        qFormat[],
+        const FrameInfo *pFrameInfo,
+        Int32     abs_max_per_window[],
+        Int32      coef[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.cpp b/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.cpp
new file mode 100644
index 0000000..1164129
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: qmf_filterbank_coeff.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+ Local Stores/Buffers/Pointers Needed:
+
+ Global Stores/Buffers/Pointers Needed:
+
+ Outputs:
+
+ Pointers and Buffers Modified:
+
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function defines the scalefactor bands for all sampling rates
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ 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
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "qmf_filterbank_coeff.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
+----------------------------------------------------------------------------*/
+
+
+
+const Int32 sbrDecoderFilterbankCoefficients[155] =
+{
+    /*  10/9*table */
+
+    0xFFEA0066,  0x020C09CF,  0x34F67965,  0xCE380A2F,  0xFE43005A,
+    0xFFEA006C,  0x02360998,  0x36907954,  0xCFCD0A57,  0xFE690054,
+    0xFFEC0072,  0x0262095B,  0x382B7937,  0xD1600A7A,  0xFE8E004F,
+    0xFFED0078,  0x028E0919,  0x39C6790F,  0xD2F00A98,  0xFEB20049,
+    0xFFED007E,  0x02BB08D0,  0x3B6378DB,  0xD47D0AB1,  0xFED50043,
+    0xFFEC0084,  0x02E90882,  0x3D00789B,  0xD6080AC6,  0xFEF6003E,
+    0xFFEB0089,  0x0318082F,  0x3E9D7851,  0xD78F0AD6,  0xFF160039,
+    0xFFEB008F,  0x034807D5,  0x403A77FB,  0xD9130AE2,  0xFF350033,
+    0xFFEA0095,  0x03790775,  0x41D7779A,  0xDA930AEA,  0xFF53002E,
+    0xFFE9009A,  0x03AB070E,  0x4373772D,  0xDC100AED,  0xFF6F0029,
+    0xFFE800A0,  0x03DE06A2,  0x450D76B6,  0xDD890AED,  0xFF8A0024,
+    0xFFE800A5,  0x0412062F,  0x46A77633,  0xDEFD0AE9,  0xFFA40020,
+    0xFFE700AA,  0x044705B6,  0x483F75A6,  0xE06D0AE2,  0xFFBD001C,
+    0xFFE600AF,  0x047B0537,  0x49D5750E,  0xE1D90AD7,  0xFFD40017,
+    0xFFE500B3,  0x04B104B0,  0x4B69746B,  0xE3400AC8,  0xFFEB0013,
+    0xFFE400B8,  0x04E70423,  0x4CFA73BE,  0xE4A20AB7,  0x0002000F,
+    0xFFE400BC,  0x051E0390,  0x4E897306,  0xE5FF0AA2,  0x0016000B,
+    0xFFE300BF,  0x055502F6,  0x50157244,  0xE7560A8A,  0x00280008,
+    0xFFE300C3,  0x058D0254,  0x519D7178,  0xE8A80A6F,  0x003A0004,
+    0xFFE300C6,  0x05C401AD,  0x532270A2,  0xE9F50A53,  0x004A0001,
+    0xFFE200C8,  0x05FC00FE,  0x54A36FC3,  0xEB3C0A33,  0x005AFFFC,
+    0xFFE200CA,  0x06340048,  0x56206EDA,  0xEC7D0A11,  0x0068FFF9,
+    0xFFE200CC,  0x066CFF8A,  0x57986DE8,  0xEDB809EC,  0x0075FFF7,
+    0xFFE200CD,  0x06A4FEC6,  0x590C6CEC,  0xEEED09C6,  0x0081FFF4,
+    0xFFE200CE,  0x06DCFDFC,  0x5A7B6BE7,  0xF01C099E,  0x008DFFF2,
+    0xFFE200CE,  0x0713FD2B,  0x5BE56ADA,  0xF1450973,  0x0097FFF0,
+    0xFFE300CD,  0x074BFC52,  0x5D4869C4,  0xF2680947,  0x00A0FFEE,
+    0xFFE300CC,  0x0781FB73,  0x5EA668A6,  0xF384091A,  0x00A8FFEC,
+    0xFFE400CA,  0x07B7FA8D,  0x5FFF6780,  0xF49908EB,  0x00B0FFEA,
+    0xFFE400C8,  0x07EDF9A0,  0x61506652,  0xF5A808BA,  0x00B6FFE9,
+    0xFFE500C5,  0x0822F8AC,  0x629B651C,  0xF6B00888,  0x00BCFFE7
+};
+
+
+const Int32 sbrDecoderFilterbankCoefficients_down_smpl[160] =
+{
+    0x0000FFEE,  0xFFF0FFEF, 0xFFEEFFED, 0xFFEBFFEA,
+    0xFFE9FFE8,  0xFFE7FFE6, 0xFFE6FFE7, 0xFFE7FFE8,
+    0xFFEAFFED,  0xFFEFFFF3, 0xFFF7FFFB, 0x00000007,
+    0x000D0014,  0x001C0025, 0x002E0037, 0x0041004B,
+    0x00560061,  0x006B0076, 0x0080008A, 0x0094009D,
+    0x00A500AC,  0x00B200B6, 0x00B800B9, 0x00B700B3,
+    0x00AD00A3,  0x00970087, 0x0074005D, 0x00420024,
+    0x0001FFDA,  0xFFAFFF7F, 0xFF4BFF12, 0xFED5FE93,
+    0x01B301FD,  0x024C029E, 0x02F4034D, 0x03A90408,
+    0x046904CC,  0x05300595, 0x05FA065E, 0x06C10722,
+    0x078007DA,  0x08300881, 0x08CB090F, 0x094A097C,
+    0x09A409C1,  0x09D209D5, 0x09CB09B2, 0x0988094D,
+    0x090108A2,  0x082F07A8, 0x070C0659, 0x059104B1,
+    0x03B902AA,  0x01810041, 0xFEE7FD74, 0xFBE9FA45,
+    0xF887F6B2,  0xF4C4F2BF, 0xF0A4EE72, 0xEC2AE9CF,
+    0xE760E4DE,  0xE24CDFA9, 0xDCF9DA3B, 0xD772D4A0,
+    0x2E3A311B,  0x33FF36E7, 0x39CE3CB4, 0x3F964273,
+    0x45484813,  0x4AD24D84, 0x502552B4, 0x55305795,
+    0x59E35C17,  0x5E2F602B, 0x620863C4, 0x655F66D7,
+    0x682B6959,  0x6A626B43, 0x6BFC6C8C, 0x6CF46D32,
+    0x6D476D32,  0x6CF46C8C, 0x6BFC6B43, 0x6A626959,
+    0x682B66D7,  0x655F63C4, 0x6208602B, 0x5E2F5C17,
+    0x59E35795,  0x553052B4, 0x50254D84, 0x4AD24813,
+    0x45484273,  0x3F963CB4, 0x39CE36E7, 0x33FF311B,
+    0xD1C6D4A0,  0xD772DA3B, 0xDCF9DFA9, 0xE24CE4DE,
+    0xE760E9CF,  0xEC2AEE72, 0xF0A4F2BF, 0xF4C4F6B2,
+    0xF887FA45,  0xFBE9FD74, 0xFEE70041, 0x018102AA,
+    0x03B904B1,  0x05910659, 0x070C07A8, 0x082F08A2,
+    0x0901094D,  0x098809B2, 0x09CB09D5, 0x09D209C1,
+    0x09A4097C,  0x094A090F, 0x08CB0881, 0x083007DA,
+    0x07800722,  0x06C1065E, 0x05FA0595, 0x053004CC,
+    0x04690408,  0x03A9034D, 0x02F4029E, 0x024C01FD,
+    0xFE4DFE93,  0xFED5FF12, 0xFF4BFF7F, 0xFFAFFFDA,
+    0x00010024,  0x0042005D, 0x00740087, 0x009700A3,
+    0x00AD00B3,  0x00B700B9, 0x00B800B6, 0x00B200AC,
+    0x00A5009D,  0x0094008A, 0x00800076, 0x006B0061,
+    0x0056004B,  0x00410037, 0x002E0025, 0x001C0014,
+    0x000D0007,  0x0000FFFB, 0xFFF7FFF3, 0xFFEFFFED,
+    0xFFEAFFE8,  0xFFE7FFE7, 0xFFE6FFE6, 0xFFE7FFE8,
+    0xFFE9FFEA,  0xFFEBFFED, 0xFFEEFFEF, 0xFFF0FFEE
+};
+
+const Int32 sbrDecoderFilterbankCoefficients_an_filt_LC[155] =
+{
+
+    Qfmt27(-0.00079446133872F), Qfmt27(0.02197766364781F), Qfmt27(0.54254182141522F), Qfmt27(-0.47923775873194F),
+    Qfmt27(-0.01574239605130F), Qfmt27(-0.00068946163857F), Qfmt27(0.02537571195384F), Qfmt27(0.57449847577240F),
+    Qfmt27(-0.44806230039026F), Qfmt27(-0.01291535202742F), Qfmt27(-0.00071286404460F), Qfmt27(0.02892516313544F),
+    Qfmt27(0.60657315615086F), Qfmt27(-0.41729436041451F), Qfmt27(-0.01026942774868F), Qfmt27(-0.00077308974337F),
+    Qfmt27(0.03262310249845F), Qfmt27(0.63865835544980F), Qfmt27(-0.38701849746199F), Qfmt27(-0.00782586328859F),
+    Qfmt27(-0.00083027488297F), Qfmt27(0.03646915244785F), Qfmt27(0.67068416485018F), Qfmt27(-0.35729827194706F),
+    Qfmt27(-0.00557215982767F), Qfmt27(-0.00089272089703F), Qfmt27(0.04045671426315F), Qfmt27(0.70254003810627F),
+    Qfmt27(-0.32819525024294F), Qfmt27(-0.00351102841332F), Qfmt27(-0.00095851011196F), Qfmt27(0.04455021764484F),
+    Qfmt27(0.73415149000395F), Qfmt27(-0.29977591877185F), Qfmt27(-0.00163598204794F), Qfmt27(-0.00101225729839F),
+    Qfmt27(0.04873676213679F), Qfmt27(0.76545064960593F), Qfmt27(-0.27208998714049F), Qfmt27(0.00003903936539F),
+    Qfmt27(-0.00105230782648F), Qfmt27(0.05300654158217F), Qfmt27(0.79631383686511F), Qfmt27(-0.24519750285673F),
+    Qfmt27(0.00154182229475F), Qfmt27(-0.00108630976316F), Qfmt27(0.05732502937107F), Qfmt27(0.82666485395476F),
+    Qfmt27(-0.21914753347432F), Qfmt27(0.00286720203220F), Qfmt27(-0.00110794157381F), Qfmt27(0.06167350555855F),
+    Qfmt27(0.85641712130638F), Qfmt27(-0.19396671004887F), Qfmt27(0.00402297937976F), Qfmt27(-0.00110360418081F),
+    Qfmt27(0.06602157445253F), Qfmt27(0.88547343436495F), Qfmt27(-0.16971665552213F), Qfmt27(0.00500649278750F),
+    Qfmt27(-0.00109714405326F), Qfmt27(0.07034096875232F), Qfmt27(0.91376152398903F), Qfmt27(-0.14641770628514F),
+    Qfmt27(0.00583386287581F), Qfmt27(-0.00106490281247F), Qfmt27(0.07461825625751F), Qfmt27(0.94117890777861F),
+    Qfmt27(-0.12410396326951F), Qfmt27(0.00651097277313F), Qfmt27(-0.00102041023958F), Qfmt27(0.07879625324269F),
+    Qfmt27(0.96765488212662F), Qfmt27(-0.10280530739363F), Qfmt27(0.00704839655425F), Qfmt27(-0.00094051141595F),
+    Qfmt27(0.08286099010631F), Qfmt27(0.99311573680798F), Qfmt27(-0.08254839941155F), Qfmt27(0.00745513427428F),
+    Qfmt27(-0.00084090835475F), Qfmt27(0.08675566213219F), Qfmt27(1.01745066253324F), Qfmt27(-0.06332944781672F),
+    Qfmt27(0.00774335382672F), Qfmt27(-0.00072769348801F), Qfmt27(0.09046949018457F), Qfmt27(1.04060828658052F),
+    Qfmt27(-0.04518854556363F), Qfmt27(0.00790787636150F), Qfmt27(-0.00057913742435F), Qfmt27(0.09395575430420F),
+    Qfmt27(1.06251808919053F), Qfmt27(-0.02811939233087F), Qfmt27(0.00797463714114F), Qfmt27(-0.00040969484059F),
+    Qfmt27(0.09716267023308F), Qfmt27(1.08310018709600F), Qfmt27(-0.01212147193047F), Qfmt27(0.00795079915733F),
+    Qfmt27(-0.00020454902123F), Qfmt27(0.10007381188066F), Qfmt27(1.10227871198194F), Qfmt27(0.00279527795884F),
+    Qfmt27(0.00784545014643F), Qfmt27(0.00001908481202F), Qfmt27(0.10262701466139F), Qfmt27(1.12001978353403F),
+    Qfmt27(0.01663452156443F), Qfmt27(0.00766458213130F), Qfmt27(0.00028892665922F), Qfmt27(0.10479373974558F),
+    Qfmt27(1.13624787143434F), Qfmt27(0.02941522773279F), Qfmt27(0.00741912981120F), Qfmt27(0.00056943874774F),
+    Qfmt27(0.10650970405576F), Qfmt27(1.15091404672203F), Qfmt27(0.04112872592057F), Qfmt27(0.00712664923329F),
+    Qfmt27(0.00088238158168F), Qfmt27(0.10776200996423F), Qfmt27(1.16395714324633F), Qfmt27(0.05181934748033F),
+    Qfmt27(0.00677868764313F), Qfmt27(0.00121741725989F), Qfmt27(0.10848340171661F), Qfmt27(1.17535833075364F),
+    Qfmt27(0.06148559051724F), Qfmt27(0.00639363830229F), Qfmt27(0.00159101288509F), Qfmt27(0.10864412991640F),
+    Qfmt27(1.18507099110810F), Qfmt27(0.07014197759039F), Qfmt27(0.00597707038378F), Qfmt27(0.00196610899088F),
+    Qfmt27(0.10819451041273F), Qfmt27(1.19306425909871F), Qfmt27(0.07784680399703F), Qfmt27(0.00554476792518F),
+    Qfmt27(0.00238550675072F), Qfmt27(0.10709920766553F), Qfmt27(1.19929775892826F), Qfmt27(0.08459352758522F),
+    Qfmt27(0.00509233837916F), Qfmt27(0.00280596092809F), Qfmt27(0.10531144797543F), Qfmt27(1.20377455661175F),
+    Qfmt27(0.09043115226911F), Qfmt27(0.00463008004888F), Qfmt27(0.00325513071185F), Qfmt27(0.10278145526768F),
+    Qfmt27(1.20646855283790F), Qfmt27(0.09539224314440F), Qfmt27(0.00416760958657F)
+};
+
+
+
+#ifdef HQ_SBR
+
+
+const Int32 sbrDecoderFilterbankCoefficients_an_filt[155] =
+{
+    Qfmt27(-0.000561769F),   Qfmt27(+ 0.015540555F),   Qfmt27(+ 0.383635001F),   Qfmt27(-0.338872269F),   Qfmt27(-0.011131555F),
+    Qfmt27(-0.000487523F),   Qfmt27(+ 0.017943338F),   Qfmt27(+ 0.406231768F),   Qfmt27(-0.316827891F),   Qfmt27(-0.009132533F),
+    Qfmt27(-0.000504071F),   Qfmt27(+ 0.020453179F),   Qfmt27(+ 0.428911992F),   Qfmt27(-0.295071672F),   Qfmt27(-0.007261582F),
+    Qfmt27(-0.000546657F),   Qfmt27(+ 0.023068017F),   Qfmt27(+ 0.451599654F),   Qfmt27(-0.273663404F),   Qfmt27(-0.005533721F),
+    Qfmt27(-0.000587093F),   Qfmt27(+ 0.025787585F),   Qfmt27(+ 0.474245321F),   Qfmt27(-0.252648031F),   Qfmt27(-0.003940112F),
+    Qfmt27(-0.000631249F),   Qfmt27(+ 0.028607217F),   Qfmt27(+ 0.496770825F),   Qfmt27(-0.232069087F),   Qfmt27(-0.002482672F),
+    Qfmt27(-0.000677769F),   Qfmt27(+ 0.031501761F),   Qfmt27(+ 0.519123497F),   Qfmt27(-0.211973585F),   Qfmt27(-0.001156814F),
+    Qfmt27(-0.000715774F),   Qfmt27(+ 0.034462095F),   Qfmt27(+ 0.541255345F),   Qfmt27(-0.192396675F),   Qfmt27(+ 0.000027605F),
+    Qfmt27(-0.000744094F),   Qfmt27(+ 0.037481285F),   Qfmt27(+ 0.563078914F),   Qfmt27(-0.173380817F),   Qfmt27(+ 0.001090233F),
+    Qfmt27(-0.000768137F),   Qfmt27(+ 0.040534917F),   Qfmt27(+ 0.584540324F),   Qfmt27(-0.154960707F),   Qfmt27(+ 0.002027418F),
+    Qfmt27(-0.000783433F),   Qfmt27(+ 0.043609754F),   Qfmt27(+ 0.605578354F),   Qfmt27(-0.137155176F),   Qfmt27(+ 0.002844676F),
+    Qfmt27(-0.000780366F),   Qfmt27(+ 0.046684303F),   Qfmt27(+ 0.626124270F),   Qfmt27(-0.120007798F),   Qfmt27(+ 0.003540125F),
+    Qfmt27(-0.000775798F),   Qfmt27(+ 0.049738576F),   Qfmt27(+ 0.646126970F),   Qfmt27(-0.103532953F),   Qfmt27(+ 0.004125164F),
+    Qfmt27(-0.000753000F),   Qfmt27(+ 0.052763075F),   Qfmt27(+ 0.665513988F),   Qfmt27(-0.087754754F),   Qfmt27(+ 0.004603953F),
+    Qfmt27(-0.000721539F),   Qfmt27(+ 0.055717365F),   Qfmt27(+ 0.684235329F),   Qfmt27(-0.072694330F),   Qfmt27(+ 0.004983969F),
+    Qfmt27(-0.000665042F),   Qfmt27(+ 0.058591568F),   Qfmt27(+ 0.702238872F),   Qfmt27(-0.058370533F),   Qfmt27(+ 0.005271576F),
+    Qfmt27(-0.000594612F),   Qfmt27(+ 0.061345517F),   Qfmt27(+ 0.719446263F),   Qfmt27(-0.044780682F),   Qfmt27(+ 0.005475378F),
+    Qfmt27(-0.000514557F),   Qfmt27(+ 0.063971590F),   Qfmt27(+ 0.735821176F),   Qfmt27(-0.031953127F),   Qfmt27(+ 0.005591713F),
+    Qfmt27(-0.000409512F),   Qfmt27(+ 0.066436751F),   Qfmt27(+ 0.751313746F),   Qfmt27(-0.019883413F),   Qfmt27(+ 0.005638920F),
+    Qfmt27(-0.000289698F),   Qfmt27(+ 0.068704383F),   Qfmt27(+ 0.765867487F),   Qfmt27(-0.008571175F),   Qfmt27(+ 0.005622064F),
+    Qfmt27(-0.000144638F),   Qfmt27(+ 0.070762871F),   Qfmt27(+ 0.779428752F),   Qfmt27(+ 0.001976560F),   Qfmt27(+ 0.005547571F),
+    Qfmt27(+ 0.000013495F),   Qfmt27(+ 0.072568258F),   Qfmt27(+ 0.791973584F),   Qfmt27(+ 0.011762383F),   Qfmt27(+ 0.005419678F),
+    Qfmt27(+ 0.000204302F),   Qfmt27(+ 0.074100364F),   Qfmt27(+ 0.803448575F),   Qfmt27(+ 0.020799707F),   Qfmt27(+ 0.005246117F),
+    Qfmt27(+ 0.000402654F),   Qfmt27(+ 0.075313734F),   Qfmt27(+ 0.813819127F),   Qfmt27(+ 0.029082401F),   Qfmt27(+ 0.005039302F),
+    Qfmt27(+ 0.000623938F),   Qfmt27(+ 0.076199248F),   Qfmt27(+ 0.823041989F),   Qfmt27(+ 0.036641812F),   Qfmt27(+ 0.004793256F),
+    Qfmt27(+ 0.000860844F),   Qfmt27(+ 0.076709349F),   Qfmt27(+ 0.831103846F),   Qfmt27(+ 0.043476878F),   Qfmt27(+ 0.004520985F),
+    Qfmt27(+ 0.001125016F),   Qfmt27(+ 0.076823001F),   Qfmt27(+ 0.837971734F),   Qfmt27(+ 0.049597868F),   Qfmt27(+ 0.004226427F),
+    Qfmt27(+ 0.001390249F),   Qfmt27(+ 0.076505072F),   Qfmt27(+ 0.843623828F),   Qfmt27(+ 0.055046003F),   Qfmt27(+ 0.003920743F),
+    Qfmt27(+ 0.001686808F),   Qfmt27(+ 0.075730576F),   Qfmt27(+ 0.848031578F),   Qfmt27(+ 0.059816657F),   Qfmt27(+ 0.003600827F),
+    Qfmt27(+ 0.001984114F),   Qfmt27(+ 0.074466439F),   Qfmt27(+ 0.851197152F),   Qfmt27(+ 0.063944481F),   Qfmt27(+ 0.003273961F),
+    Qfmt27(+ 0.002301725F),   Qfmt27(+ 0.072677464F),   Qfmt27(+ 0.853102095F),   Qfmt27(+ 0.067452502F),   Qfmt27(+ 0.002946945F)
+};
+
+
+
+#endif  /* HQ_SBR */
+
+
+#endif  /* AAC_PLUS */
diff --git a/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.h b/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.h
new file mode 100644
index 0000000..c8968cb
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/qmf_filterbank_coeff.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: qmf_filterbank_coeff.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ this file declares the scalefactor bands for all sampling rates
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef QMF_FILTERBANK_COEFF_H
+#define QMF_FILTERBANK_COEFF_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#define Qfmt(x)   (Int16)(x*(((Int32)1<<15)*1.11111111111111111F) + (x>=0?0.5F:-0.5F))
+
+
+#define Qfmt30(x)   (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F))
+#define Qfmt27(x)   (Int32)(x*(((Int32)1<<27)) + (x>=0?0.5F:-0.5F))
+
+extern const Int32 sbrDecoderFilterbankCoefficients[155];
+
+
+extern const Int32 sbrDecoderFilterbankCoefficients_down_smpl[160];
+extern const Int32 sbrDecoderFilterbankCoefficients_an_filt_LC[155];
+
+#ifdef HQ_SBR
+extern const Int32 sbrDecoderFilterbankCoefficients_an_filt[155];
+#endif
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_adif_header.h b/media/libstagefright/codecs/aacdec/s_adif_header.h
new file mode 100644
index 0000000..7fd49d3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_adif_header.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_ADIF_Header.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, ADIF_Header
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_ADIF_HEADER_H
+#define S_ADIF_HEADER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_adif_const.h"
+#include "e_rawbitstreamconst.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
+{
+    Char    adif_id[LEN_ADIF_ID+1];
+    Int     copy_id_present;
+    Char    copy_id[LEN_COPYRT_ID+1];
+    Int     original_copy;
+    Int     home;
+    Int     bitstream_type;
+    Int32   bitrate;
+    Int     num_pce;
+    Int     prog_tags[(1<<LEN_TAG)];
+} ADIF_Header;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/s_bit_buffer.h b/media/libstagefright/codecs/aacdec/s_bit_buffer.h
new file mode 100644
index 0000000..9f0dbda
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_bit_buffer.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_bit_buffer.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_BIT_BUFFER_H
+#define S_BIT_BUFFER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.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
+{
+    UChar *char_ptr;
+    UInt32 buffered_bits;
+    UInt32 buffer_word;
+    UInt32 nrBitsRead;
+    UInt32 bufferLen;
+}
+BIT_BUFFER;
+
+typedef BIT_BUFFER *HANDLE_BIT_BUFFER;
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_bits.h b/media/libstagefright/codecs/aacdec/s_bits.h
new file mode 100644
index 0000000..cae69ad
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_bits.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_BITS.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Remove unused field.
+
+ Description: Change buffer type from UInt to UInt32, makes API much easier
+              to understand and describe, and getbits is faster on TI C55X
+              if the buffer is 32 bits instead of 16.
+
+ Description: Change buffer type from UInt32 to UChar.
+
+ Who:                                   Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, BITS
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef  S_BITS_H
+#define  S_BITS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+/*
+ * Name: BITS
+ * Description: Holds information for processing the input data buffer
+ *    as a "stream". The data is in packed format.
+ * Fields:
+ *    pBuffer - pointer to the beginning of the buffer. If the data type of
+ *        this changes, make sure to update the constants in ibstream.h
+ *    usedBits - number of bits read thus far from the buffer. Bit 0 is
+ *        the LSB of pBuffer[0].
+ *    availableBits - number of bits available in the buffer.
+ *    byteAlignOffset - used with ADTS in case sync word is not aligned
+                        on a boundary.
+ */
+typedef struct
+{
+    UChar    *pBuffer;
+    UInt      usedBits;      /* Keep this unsigned so can go to 65536 */
+    UInt      availableBits; /* Ditto */
+    UInt      inputBufferCurrentLength; /* Ditto */
+    Int      byteAlignOffset; /* Used in ADTS.  See find_adts_syncword() */
+} BITS;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/s_ch_info.h b/media/libstagefright/codecs/aacdec/s_ch_info.h
new file mode 100644
index 0000000..9fd259c3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_ch_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_Ch_Info.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, Ch_Info
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_CH_INFO_H
+#define S_CH_INFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+{
+//    Int present;    /* channel present */
+    Int tag;        /* element tag */
+    Int cpe;        /* 0 if single channel, 1 if channel pair */
+//    Int common_window;  /* 1 if common window for cpe */
+//    Int ch_is_left; /* 1 if left channel of cpe */
+//    Int paired_ch;  /* index of paired channel in cpe */
+//    Int widx;       /* window element index for this channel */
+    Int is_present; /* intensity stereo is used */
+    Int ncch;       /* number of coupling channels for this ch */
+    /* #if (CChans > 0) */
+    /*    int cch[CChans];*/    /* coupling channel idx */
+    /*    int cc_dom[CChans];*/ /* coupling channel domain */
+    /*    int cc_ind[CChans];*/ /* independently switched coupling channel flag */
+    /* #endif */
+    Char *fext;     /* filename extension */
+
+} Ch_Info;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/s_crc_buffer.h b/media/libstagefright/codecs/aacdec/s_crc_buffer.h
new file mode 100644
index 0000000..69250e7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_crc_buffer.h
@@ -0,0 +1,90 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_crc_buffer.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_CRC_BUFFER_H
+#define S_CRC_BUFFER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; 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
+{
+    unsigned short crcState;
+    unsigned short crcMask;
+    unsigned short crcPoly;
+}
+CRC_BUFFER;
+
+typedef CRC_BUFFER *HANDLE_CRC;
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_elelist.h b/media/libstagefright/codecs/aacdec/s_elelist.h
new file mode 100644
index 0000000..40b2f13
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_elelist.h
@@ -0,0 +1,90 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_EleList.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, EleList
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_ELELIST_H
+#define S_ELELIST_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_rawbitstreamconst.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
+{
+    Int num_ele;
+    Int ele_is_cpe[(1<<LEN_TAG)];
+    Int ele_tag[(1<<LEN_TAG)];
+} EleList;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/s_frameinfo.h b/media/libstagefright/codecs/aacdec/s_frameinfo.h
new file mode 100644
index 0000000..871ae83
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_frameinfo.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_frameinfo.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changed name of bk_sfb_top to frame_sfb_top.
+ Included "interface.h" for defintion of MAX_WIN.  This
+ will hopefully be simplified when interface.h is broken up into smaller
+ include files.
+
+ Description: Eliminated the never used array, group_offs[8]
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, FrameInfo
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_FRAMEINFO_H
+#define S_FRAMEINFO_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_blockswitching.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
+    {
+        Int     islong;                 /* true if long block */
+        Int     num_win;                /* sub-blocks (SB) per block */
+        Int     coef_per_frame;         /* coef's per block */
+        Int     sfb_per_frame;          /* sfb per block */
+        Int     coef_per_win[MAX_WIN];  /* coef's per SB */
+        Int     sfb_per_win[MAX_WIN];   /* sfb per SB */
+        Int     sectbits[MAX_WIN];
+        Int16   *win_sfb_top[MAX_WIN];  /* top coef per sfb per SB */
+        Int     *sfb_width_128;         /* sfb width for short blocks */
+
+        Int     frame_sfb_top[MAXBANDS];    /* Only used in calc_gsfb_table() -
+                                      it is simply a cum version of
+                                      the above information */
+        Int     num_groups;
+        Int     group_len[8];
+
+    } FrameInfo;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_FRAMEINFO_H */
diff --git a/media/libstagefright/codecs/aacdec/s_hcb.h b/media/libstagefright/codecs/aacdec/s_hcb.h
new file mode 100644
index 0000000..6a64c27
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_hcb.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_Hcb.h
+
+     Date: 05/07/2001
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description:
+ (1) LAV removed from structure definition, since it was never used.
+
+ Description: Huffman tables are stored as UInt16
+
+ Description: Modified the declaration of the structure so no pointers are
+              used in the structure.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ define the structure Hcb to store Huffman codebook information,
+ this structure was originally defined in all.h
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_HCB_H
+#define S_HCB_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_huffman.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
+    {
+        Int     n;
+        Int     dim;
+        Int     mod;
+        Int     off;
+        Int     signed_cb;
+    } Hcb;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_HCB_H */
+
diff --git a/media/libstagefright/codecs/aacdec/s_huffman.h b/media/libstagefright/codecs/aacdec/s_huffman.h
new file mode 100644
index 0000000..2db3dd9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_huffman.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_Huffman.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:   Changed "ulong" to "UInt32"
+
+ Description: add helper structure to speed up decode_huff_cw
+
+ Description: Remove the structure definition of Huffman
+
+ Description: Added definition for SBR Huffman, used for AAC plus
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, Huffman
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_HUFFMAN_H
+#define S_HUFFMAN_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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 const Char(*SbrHuffman)[2];
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/s_hybrid.h b/media/libstagefright/codecs/aacdec/s_hybrid.h
new file mode 100644
index 0000000..3880d30a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_hybrid.h
@@ -0,0 +1,100 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_hybrid.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_HYBRID_H
+#define S_HYBRID_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "ps_constants.h"
+#include    "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define HYBRID_FILTER_LENGTH        13
+#define HYBRID_FILTER_LENGTH_m_1    12
+#define HYBRID_FILTER_DELAY         6
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+typedef enum
+{
+
+    HYBRID_2_REAL = 2,
+    HYBRID_4_CPLX = 4,
+    HYBRID_8_CPLX = 8
+
+} HYBRID_RES;
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+typedef struct
+{
+    Int32   nQmfBands;
+    Int32   *pResolution;
+    Int32   qmfBufferMove;
+
+    Int32 **mQmfBufferReal;
+    Int32 **mQmfBufferImag;
+    Int32 *mTempReal;
+    Int32 *mTempImag;
+
+
+} HYBRID;
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif      /*  S_HYBRID_H */
diff --git a/media/libstagefright/codecs/aacdec/s_lt_pred_status.h b/media/libstagefright/codecs/aacdec/s_lt_pred_status.h
new file mode 100644
index 0000000..4b5b56e4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_lt_pred_status.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: LT_PRED_STATUS.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+ (1) Merged in #defines from ltp_common.h, thereby eliminating that file.
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description: Moved large ltp_buffer up to s_tDec_Int_Chan.h, since this
+ move allowed for other elements in this structure to be shared with
+ the fxpCoef array.
+
+ Description: Decreased size of LTP buffers from 4096 to 3072.  The upper 1024
+ elements in the LTP buffers were never touched in the code.  This saves
+ 4 kilobytes in memory.
+
+ Description: Decreased size of LTP buffers again from 3072 to 2048.  This
+ time, I realized that 1024 elements were duplicated in the 32-bit array
+ pVars->pChVars[]->time_quant.  Rather than copy this data EVERY frame
+ from a 32-bit to a 16-bit LTP buffer, the data is accessed only
+ when it is needed.  This saves both MIPS and memory.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ define LT_PRED_STATUS structure for pulse data decoding.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_LT_PRED_STATUS_H
+#define S_LT_PRED_STATUS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_blockswitching.h"
+
+    /*----------------------------------------------------------------------------
+    ; MACROS
+    ; Define module specific macros here
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+    /*
+      Macro:    MAX_SHORT_WINDOWS
+      Purpose:  Number of short windows in one long window.
+      Explanation:  -  */
+#ifndef MAX_SHORT_WINDOWS
+#define MAX_SHORT_WINDOWS NSHORT
+#endif
+
+    /*
+      Macro:    MAX_SCFAC_BANDS
+      Purpose:  Maximum number of scalefactor bands in one frame.
+      Explanation:  -  */
+#ifndef MAX_SCFAC_BANDS
+#define MAX_SCFAC_BANDS MAXBANDS
+#endif
+
+    /*
+      Macro:    BLOCK_LEN_LONG
+      Purpose:  Length of one long window
+      Explanation:  -  */
+#ifndef BLOCK_LEN_LONG
+#define BLOCK_LEN_LONG LN2
+#endif
+
+
+    /*
+      Macro:    LTP_MAX_BLOCK_LEN_LONG
+      Purpose:  Informs the routine of the maximum block size used.
+      Explanation:  This is needed since the TwinVQ long window
+            is different from the AAC long window.  */
+#define LTP_MAX_BLOCK_LEN_LONG BLOCK_LEN_LONG //(2 * BLOCK_LEN_LONG) 
+
+    /*
+      Macro:    LT_BLEN
+      Purpose:  Length of the history buffer.
+      Explanation:  Has to hold 2 long windows of time domain data.  */
+#ifndef LT_BLEN
+#define LT_BLEN (2 * LTP_MAX_BLOCK_LEN_LONG)
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+    /*
+      Type:     LT_PRED_STATUS
+      Purpose:  Type of the struct holding the LTP encoding parameters.
+      Explanation:  -  */
+    typedef struct
+    {
+        Int weight_index;
+        Int win_prediction_used[MAX_SHORT_WINDOWS];
+        Int sfb_prediction_used[MAX_SCFAC_BANDS];
+        Bool ltp_data_present;
+
+        Int delay[MAX_SHORT_WINDOWS];
+    }
+    LT_PRED_STATUS;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_LT_PRED_STATUS_H */
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_mc_info.h b/media/libstagefright/codecs/aacdec/s_mc_info.h
new file mode 100644
index 0000000..9006119
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_mc_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_MC_Info.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) use enum type for audioObjectType (2) update revision history
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, MC_Info
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_MC_INFO_H
+#define S_MC_INFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_rawbitstreamconst.h"
+#include "s_ch_info.h"
+#include "chans.h"
+#include "e_tmp4audioobjecttype.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
+{
+    Int nch;        /* total number of audio channels */
+    Int nfsce;      /* number of front SCE's pror to first front CPE */
+    Int nfch;       /* number of front channels */
+    Int nsch;       /* number of side channels */
+    Int nbch;       /* number of back channels */
+    Int nlch;       /* number of lfe channels */
+    Int ncch;       /* number of valid coupling channels */
+    tMP4AudioObjectType audioObjectType;    /* Should eventually be called object */
+    Int sampling_rate_idx;
+
+    Int implicit_channeling;
+    Int  upsamplingFactor;
+#ifdef AAC_PLUS
+    bool bDownSampledSbr;
+    Int HE_AAC_level;
+#endif
+    /* All AAC content should be aware of these flag */
+    /*  AAC+ content Flag */
+    Int sbrPresentFlag;
+    /*  Enhanced AAC+ content Flag */
+    Int psPresentFlag;
+    tMP4AudioObjectType ExtendedAudioObjectType;    /* Should eventually be called object */
+
+    Ch_Info ch_info[Chans];
+} MC_Info;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/s_mixdown.h b/media/libstagefright/codecs/aacdec/s_mixdown.h
new file mode 100644
index 0000000..7f456d5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_mixdown.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_MIXdown.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, MIXdown
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_MIXDOWN_H
+#define S_MIXDOWN_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+{
+    Int present;
+    Int ele_tag;
+    Int pseudo_enab;
+} MIXdown;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/s_patch.h b/media/libstagefright/codecs/aacdec/s_patch.h
new file mode 100644
index 0000000..554fc2d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_patch.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_patch.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_PATCH_H
+#define S_PATCH_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define MAX_NUM_PATCHES   6
+
+#define     SBR_NUM_COLUMNS      38
+#define     SBR_NUM_BANDS        48
+#define     SBR_NUM_BANDS_OVR_4 (SBR_NUM_BANDS>>2)
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+struct PATCH
+{
+    Int32 noOfPatches;
+    Int32 targetStartBand[MAX_NUM_PATCHES];
+};
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_progconfig.h b/media/libstagefright/codecs/aacdec/s_progconfig.h
new file mode 100644
index 0000000..e58e5fc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_progconfig.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_ProgConfig.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, ProgConfig
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_PROGCONFIG_H
+#define S_PROGCONFIG_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_mixdown.h"
+#include "s_elelist.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
+{
+    Int     profile;
+    Int     sampling_rate_idx;
+    EleList front;
+    EleList side;
+    EleList back;
+    EleList lfe;
+    EleList data;
+    EleList coupling;
+    MIXdown mono_mix;
+    MIXdown stereo_mix;
+    MIXdown matrix_mix;
+
+    Char    comments[(1<<LEN_PC_COMM)+1]; /* TO BE DELETED */
+
+    Int32   buffer_fullness;    /* put this transport level info here */
+    Bool    file_is_adts;       /* For ADTS use only */
+    Int32   headerless_frames;  /* For ADTS use only */
+    Int32   frame_length;       /* For use by ADTS only */
+    Int32   CRC_absent;         /* For use by ADTS only */
+    UInt32  CRC_check;          /* For use by ADTS only */
+
+} ProgConfig;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/s_ps_dec.h b/media/libstagefright/codecs/aacdec/s_ps_dec.h
new file mode 100644
index 0000000..8b4391c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_ps_dec.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.
+ * -------------------------------------------------------------------
+ */
+/****************************************************************************
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2003.
+
+*******************************************************************************/
+
+#ifndef S_PS_DEC_H
+#define S_PS_DEC_H
+
+
+#include "s_hybrid.h"
+#include "s_patch.h"
+
+/****************************************************************
+  Type definitions
+ ****************************************************************/
+struct PS_DEC
+{
+
+    Int psDetected;
+    Int32 *R_ch_qmf_filter_history;
+    Int32 invNoSubSamples;
+
+    Int32 bForceMono;
+    UInt32 noSubSamples;
+    Int32 usb;
+    Int32 lastUsb;
+
+    Int32 bPsDataAvail;
+
+    UInt32 bEnableIid;
+    UInt32 bEnableIcc;
+
+    UInt32 bEnableExt;
+    Int32 bFineIidQ;
+
+    Int32 aIidPrevFrameIndex[NO_HI_RES_BINS];
+    Int32 aIccPrevFrameIndex[NO_HI_RES_BINS];
+
+    UInt32 freqResIid;
+    UInt32 freqResIcc;
+
+    UInt32 bFrameClass;
+    UInt32 noEnv;
+    UInt32 aEnvStartStop[MAX_NO_PS_ENV+1];
+
+    UInt32 abIidDtFlag[MAX_NO_PS_ENV];
+    UInt32 abIccDtFlag[MAX_NO_PS_ENV];
+
+    Int32   delayBufIndex;
+
+    UInt32 aDelayRBufIndexSer[NO_SERIAL_ALLPASS_LINKS];
+
+    Int32 **aaaRealDelayRBufferSerQmf[NO_SERIAL_ALLPASS_LINKS];
+    Int32 **aaaImagDelayRBufferSerQmf[NO_SERIAL_ALLPASS_LINKS];
+
+    Int32 **aaaRealDelayRBufferSerSubQmf[NO_SERIAL_ALLPASS_LINKS];
+    Int32 **aaaImagDelayRBufferSerSubQmf[NO_SERIAL_ALLPASS_LINKS];
+
+    Int32 **aaRealDelayBufferQmf;
+    Int32 **aaImagDelayBufferQmf;
+    Int32 **aaRealDelayBufferSubQmf;
+    Int32 **aaImagDelayBufferSubQmf;
+
+    Int32 *aPeakDecayFast;
+    Int32 *aPrevNrg;
+    Int32 *aPrevPeakDiff;
+
+    Int32 *mHybridRealLeft;
+    Int32 *mHybridImagLeft;
+    Int32 *mHybridRealRight;
+    Int32 *mHybridImagRight;
+
+
+    HYBRID *hHybrid;
+
+
+
+    Int32 h11Prev[NO_IID_GROUPS];
+    Int32 h12Prev[NO_IID_GROUPS];
+    Int32 h21Prev[NO_IID_GROUPS];
+    Int32 h22Prev[NO_IID_GROUPS];
+
+    Int32 H11[NO_IID_GROUPS];
+    Int32 H12[NO_IID_GROUPS];
+    Int32 H21[NO_IID_GROUPS];
+    Int32 H22[NO_IID_GROUPS];
+
+    Int32 deltaH11[NO_IID_GROUPS];
+    Int32 deltaH12[NO_IID_GROUPS];
+    Int32 deltaH21[NO_IID_GROUPS];
+    Int32 deltaH22[NO_IID_GROUPS];
+
+    Int32(*qmfBufferReal)[64];
+    Int32(*qmfBufferImag)[64];
+
+    Int32 aDelayBufIndex[NO_DELAY_CHANNELS];
+    Int32 aNoSampleDelay[NO_DELAY_CHANNELS];  /////
+    Int32 aaIidIndex[MAX_NO_PS_ENV+1][NO_HI_RES_BINS];
+    Int32 aaIccIndex[MAX_NO_PS_ENV+1][NO_HI_RES_BINS];
+
+};
+
+typedef struct PS_DEC STRUCT_PS_DEC;
+typedef struct PS_DEC * HANDLE_PS_DEC;
+
+
+
+#endif      /*  E_PS_DEC_H */
+
diff --git a/media/libstagefright/codecs/aacdec/s_pulseinfo.h b/media/libstagefright/codecs/aacdec/s_pulseinfo.h
new file mode 100644
index 0000000..a7ced04
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_pulseinfo.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_PulseInfo.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Comment out unused field.
+
+ Description:  Fix ARM warnings, update copyright.
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ define PulseInfo structure for pulse data decoding.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_PULSEINFO_H
+#define S_PULSEINFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_rawbitstreamconst.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
+{
+    Int pulse_data_present;
+    Int number_pulse;
+    Int pulse_start_sfb;
+    Int pulse_offset[NUM_PULSE_LINES];
+    Int pulse_amp[NUM_PULSE_LINES];
+} PulseInfo;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbr_channel.h b/media/libstagefright/codecs/aacdec/s_sbr_channel.h
new file mode 100644
index 0000000..99e28dd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbr_channel.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbr_channel.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBR_CHANNEL_H
+#define S_SBR_CHANNEL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "s_sbr_frame_data.h"
+#include    "e_sbr_sync_state.h"
+
+#ifdef PARAMETRICSTEREO
+#include "s_ps_dec.h"
+
+#endif
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define MAXNRELEMENTS 1
+#define MAXNRSBRCHANNELS (MAXNRELEMENTS*2)
+
+#ifdef PARAMETRICSTEREO
+#define MAXNRQMFCHANNELS MAXNRSBRCHANNELS
+#else
+#define MAXNRQMFCHANNELS MAXNRSBRCHANNELS
+#endif
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+typedef struct
+{
+    Int32 outFrameSize;
+    SBR_SYNC_STATE syncState;
+    SBR_FRAME_DATA frameData;
+
+} SBR_CHANNEL;
+
+typedef struct
+{
+    SBR_CHANNEL SbrChannel[MAXNRSBRCHANNELS];
+    Int32 setStreamType;
+#ifdef PARAMETRICSTEREO
+    HANDLE_PS_DEC hParametricStereoDec;
+    STRUCT_PS_DEC ParametricStereoDec;
+#endif
+
+} SBRDECODER_DATA;
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbr_dec.h b/media/libstagefright/codecs/aacdec/s_sbr_dec.h
new file mode 100644
index 0000000..810479c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbr_dec.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbr_dec.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBR_DEC_H
+#define S_SBR_DEC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "s_sbr_frame_data.h"
+#include    "pv_audio_type_defs.h"
+#include    "s_patch.h"
+#include    "e_blockswitching.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
+{
+    Int32 outSampleRate;
+    Int32 LC_aacP_DecoderFlag;  /* Low Complexity decoder flag  */
+
+    Int32 startIndexCodecQmf;
+    Int32 lowBandAddSamples;
+    Int32 noCols;
+    Int32 qmfBufLen;
+    Int32 bufWriteOffs;
+    Int32 bufReadOffs;
+
+    Int32 sbStopCodec;
+    Int   lowSubband;
+    Int   prevLowSubband;
+    Int32 highSubband;
+    Int32 noSubbands;
+
+    Int   FreqBandTable[2][MAX_FREQ_COEFFS + 1];
+    Int32 FreqBandTableNoise[MAX_NOISE_COEFFS + 1];
+    Int32 V_k_master[MAX_FREQ_COEFFS + 1];         /* Master BandTable which freqBandTable is derived from*/
+    Int32 NSfb[2];
+    Int32 NoNoiseBands;                            /* Number of noisebands */
+    Int32 Num_Master;                              /* Number of bands in V_k_master*/
+
+    struct PATCH Patch;                         /* Used by sbr_generate_high_freq */
+    /* Used by calc_sbr_envelope */
+    Int32 gateMode[4];
+    Int32 limSbc[4][12 + 1];                            /* Limiting bands */
+
+    Int32 sqrt_cache[8][4];                     /* cache memory for repeated sqrt() calculations */
+
+} SBR_DEC;
+
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbr_element_stream.h b/media/libstagefright/codecs/aacdec/s_sbr_element_stream.h
new file mode 100644
index 0000000..e9b6780
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbr_element_stream.h
@@ -0,0 +1,92 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbr_element_stream.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBR_ELEMENT_STREAM_H
+#define S_SBR_ELEMENT_STREAM_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+#define MAXSBRBYTES 1024
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+typedef struct
+{
+    Int32 ElementID;
+    Int32 ExtensionType;
+    Int32 Payload;
+    UChar Data[MAXSBRBYTES];
+}
+SBR_ELEMENT_STREAM;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbr_frame_data.h b/media/libstagefright/codecs/aacdec/s_sbr_frame_data.h
new file mode 100644
index 0000000..89d1bb1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbr_frame_data.h
@@ -0,0 +1,181 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbr_frame_data.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBR_FRAME_DATA_H
+#define S_SBR_FRAME_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sbr_header_data.h"
+#include    "e_invf_mode.h"
+#include    "e_coupling_mode.h"
+#include    "sbr_constants.h"
+#include    "s_patch.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
+{
+    Int32 nScaleFactors;            /* total number of scalefactors in frame */
+    Int32 nNoiseFactors;
+    Int32 crcCheckSum;
+    Int32 frameClass;
+    Int32 frameInfo[LENGTH_FRAME_INFO];
+    Int32 nSfb[2];
+    Int32 nNfb;
+    Int32 offset;
+    Int32 ampRes;
+    Int32 nNoiseFloorEnvelopes;
+    Int32 p;
+    Int32 prevEnvIsShort;
+
+    Int32 reset_flag;
+
+
+    SBR_HEADER_DATA sbr_header;
+
+
+    /* dynamic control signals */
+    Int32 domain_vec1[MAX_ENVELOPES];
+    Int32 domain_vec2[MAX_ENVELOPES];
+
+
+    INVF_MODE sbr_invf_mode[MAX_NUM_NOISE_VALUES];
+    INVF_MODE sbr_invf_mode_prev[MAX_NUM_NOISE_VALUES];
+
+    COUPLING_MODE coupling;               /*  3 possibilities: off, level, pan */
+
+
+    Int32 addHarmonics[MAX_NUM_ENVELOPE_VALUES];
+
+    /* Used by calc_sbr_envelope */
+    Int32 hFp[64];
+    Int32 harm_index;
+    Int32 phase_index;
+    Int32 sUp;
+
+    /*
+     *    envelope data
+     */
+
+    Int32 iEnvelope_man[MAX_NUM_ENVELOPE_VALUES]; /* mantissa */
+    Int32 iEnvelope_exp[MAX_NUM_ENVELOPE_VALUES]; /* exponent */
+    Int32 sfb_nrg_prev_man[MAX_FREQ_COEFFS];      /* mantissa */
+
+
+    /*
+     *    noise data
+     */
+
+    Int32 sbrNoiseFloorLevel_man[MAX_NUM_NOISE_VALUES]; /* mantissa */
+    Int32 sbrNoiseFloorLevel_exp[MAX_NUM_NOISE_VALUES]; /* exponent */
+    Int32 prevNoiseLevel_man[MAX_NUM_NOISE_VALUES]; /* mantissa */
+
+    Int32  BwVector[MAX_NUM_PATCHES];
+    Int32  BwVectorOld[MAX_NUM_PATCHES];
+    /* Both implement a pseudo circular buffer  */
+
+    /*
+     * 40 ==  Biggest of  autoCorrLength(38) + sbrDec->bufReadOffs (2)  and
+     *    sbrDec->noCols (32) + sbrDec->bufWriteOffs  (6)
+     */
+    Int32 codecQmfBufferReal[40][32];
+    Int32 *sbrQmfBufferReal;
+    Int32 HistsbrQmfBufferReal[6*SBR_NUM_BANDS];
+#ifdef HQ_SBR
+    Int32 codecQmfBufferImag[40][32];
+    Int32 *sbrQmfBufferImag;
+    Int32 HistsbrQmfBufferImag[6*SBR_NUM_BANDS];
+#endif
+    Int16  V[1152];     /* Used by calc_sbr_synfilterbank as freq. history buffer */
+
+
+    Int32 degreeAlias[64];
+
+
+#ifdef HQ_SBR
+
+    Int32 fBuffer_man[5][64];        /* smoothing history buffers */
+    Int32 fBufferN_man[5][64];
+    Int32 fBuffer_exp[5][64];        /* smoothing history buffers */
+    Int32 fBufferN_exp[5][64];
+
+    Int32 *fBuf_man[64];        /* pointer to smoothing history buffers */
+    Int32 *fBuf_exp[64];        /* pointer to smoothing history buffers */
+    Int32 *fBufN_man[64];
+    Int32 *fBufN_exp[64];
+
+
+#endif
+
+}
+SBR_FRAME_DATA;
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbr_header_data.h b/media/libstagefright/codecs/aacdec/s_sbr_header_data.h
new file mode 100644
index 0000000..7d7d746
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbr_header_data.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbr_header_data.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBR_HEADER_DATA_H
+#define S_SBR_HEADER_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "e_sbr_header_status.h"
+#include    "e_sbr_master_status.h"
+#include    "e_sr_mode.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
+{
+    SBR_HEADER_STATUS status;      /* the current status of the header     */
+    SBR_MASTER_STATUS masterStatus;/* status of v_k_master freq table      */
+
+    /* Changes in these variables indicates an error */
+    Int32 crcEnable;
+    SR_MODE sampleRateMode;
+    Int32 ampResolution;
+
+    /* Changes in these variables causes a reset of the decoder */
+    Int32 startFreq;
+    Int32 stopFreq;
+    Int32 xover_band;
+    Int32 freqScale;
+    Int32 alterScale;
+    Int32 noise_bands;               /* noise bands per octave, read from bitstream */
+
+    /* Helper variable*/
+    Int32 noNoiseBands;              /* actual number of noise bands to read from the bitstream */
+
+    Int32 limiterBands;
+    Int32 limiterGains;
+    Int32 interpolFreq;
+    Int32 smoothingLength;
+}
+SBR_HEADER_DATA;
+
+typedef SBR_HEADER_DATA *HANDLE_SBR_HEADER_DATA;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sbrbitstream.h b/media/libstagefright/codecs/aacdec/s_sbrbitstream.h
new file mode 100644
index 0000000..609463a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sbrbitstream.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: s_sbrbitstream.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SBRBITSTREAM_H
+#define S_SBRBITSTREAM_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "s_sbr_element_stream.h"
+#include    "s_sbr_channel.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
+{
+    Int32 NrElements;
+    Int32 NrElementsCore;
+    SBR_ELEMENT_STREAM sbrElement[MAXNRELEMENTS];
+}
+SBRBITSTREAM;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sectinfo.h b/media/libstagefright/codecs/aacdec/s_sectinfo.h
new file mode 100644
index 0000000..83dcc31
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sectinfo.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/s_SectInfo.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ defines a structre that holds the Huffman codebook index and section
+ boundary information for each Frame.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SECTINFO_H
+#define S_SECTINFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+{
+    Int   sect_cb;
+    Int   sect_end;
+} SectInfo;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/s_sr_info.h b/media/libstagefright/codecs/aacdec/s_sr_info.h
new file mode 100644
index 0000000..9b71003
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_sr_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_SR_info.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified the declaration of the structure so no pointers are
+              used in the structure.
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, SR_Info
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_SR_INFO_H
+#define S_SR_INFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+{
+    Int32   samp_rate;
+    Int     nsfb1024;
+    Int     nsfb128;
+} SR_Info;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/s_tdec_int_chan.h b/media/libstagefright/codecs/aacdec/s_tdec_int_chan.h
new file mode 100644
index 0000000..f7a3602
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_tdec_int_chan.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_tDec_Int_Chan.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change data types of win
+
+ Description: Remove wnd_shape structure.
+
+ Description: Remove dependency on window_block.h, Fix header too.
+
+ Description:
+ Modified to utilize memory in the last 1024 elements in fxpCoef.
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description:
+ (1) Move temporary FrameInfo structure into the shared region with fxpCoef.
+ (2) Add more comments detailing the size of the shared structure.
+
+ Description:
+ (1) Changed time_quant from 2048 Int32 buffer to 1024 Int32 buffer.
+
+ Who:                                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, tDec_Int_Chan
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TDEC_INT_CHAN_H
+#define S_TDEC_INT_CHAN_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_rawbitstreamconst.h"
+#include "s_tns_frame_info.h"
+#include "s_wnd_shape.h"
+#include "s_lt_pred_status.h"
+#include "s_sectinfo.h"
+#include "s_frameinfo.h"
+#include "e_window_shape.h"
+#include "e_window_sequence.h"
+#include "window_block_fxp.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
+    ----------------------------------------------------------------------------*/
+
+    /* This structure was created with the specific goal in mind of sharing memory
+     * with the last 1024 data elements in fxpCoef.
+     *
+     * The size of this structure must NOT exceed 4 kilobytes
+     * Also, the size of the fxpCoef array cannot be less than 8 kilobytes
+     *
+     * The fxpCoef array is declared as an Int32, so its size should not vary
+     * from platform to platform.
+     *
+     * The shared structure is 3,640 bytes (3.55 KB), on a 32-bit platform,
+     * which represents the worst case.
+     */
+    typedef struct
+    {
+        TNS_frame_info       tns;
+
+        FrameInfo            frameInfo;
+
+        Int                  factors[MAXBANDS];
+        Int                  cb_map[MAXBANDS];
+        Int                  group[NSHORT];
+        Int                  qFormat[MAXBANDS];
+
+        Int                  max_sfb;
+        LT_PRED_STATUS       lt_status;
+
+    } per_chan_share_w_fxpCoef;
+
+    /*
+     * This structure contains one per channel.
+     */
+    typedef struct
+    {
+#ifdef AAC_PLUS
+        Int16                ltp_buffer[LT_BLEN + 2*288]; /* LT_BLEN  = 2048 + 2*288 */
+#else
+        Int16                ltp_buffer[LT_BLEN]; /* LT_BLEN  = 2048 */
+#endif
+
+
+        Int32                time_quant[LONG_WINDOW]; /*  1024 holds overlap&add */
+
+        Int32                *fxpCoef;         /* Spectrum coeff.*/
+
+        per_chan_share_w_fxpCoef * pShareWfxpCoef;
+
+        Int32                abs_max_per_window[NUM_SHORT_WINDOWS];
+
+        WINDOW_SEQUENCE      wnd;
+
+
+        WINDOW_SHAPE         wnd_shape_prev_bk;
+        WINDOW_SHAPE         wnd_shape_this_bk;
+
+    } tDec_Int_Chan;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_TDEC_INT_CHAN_H */
+
diff --git a/media/libstagefright/codecs/aacdec/s_tdec_int_file.h b/media/libstagefright/codecs/aacdec/s_tdec_int_file.h
new file mode 100644
index 0000000..d0ffb0b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_tdec_int_file.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_tDec_Int_File.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Remove unneeded structure elements, clean up.
+
+ Description: Remove block.h, not needed, chains in other not needed files.
+
+ Description: Added declaration of scratch memory, scratchTnsDecCoefMem,
+ which will be utilized by tns_decode_coef().
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description: Per review comments...
+ (1) Removed declaration of unused variable, savedMCInfo
+ (2) Commented out ADTS related variables.
+ (3) Slight re-wording of comment for clarity.
+
+ Description:
+ (1) Moved scratch_prog_config into the scratch union.
+
+ Description:
+ (1) Added ltp state variable.
+
+ Description: Make tDec_Int_perChan an array of structures.
+              In the user applications, the malloc command will allocate a
+              continuous chunk of memory.
+
+ Description:
+           (1) Added the array data_stream_bytes[] to structure tDec_Int_File.
+               This to support Data Streaming Elements (DSE).
+           (2) Updated the copyright header.
+
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, tDec_Int_Chan
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TDEC_INT_FILE_H
+#define S_TDEC_INT_FILE_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_progconfig.h"
+#include "s_frameinfo.h"
+#include "s_mc_info.h"
+#include "s_adif_header.h"
+#include "s_tdec_int_chan.h"
+#include "s_pulseinfo.h"
+#include "s_bits.h"
+#include "s_hcb.h"
+#include "e_infoinitconst.h"
+
+#include "s_sbr_channel.h"
+#include "s_sbr_dec.h"
+#include "s_sbrbitstream.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
+    ----------------------------------------------------------------------------*/
+
+
+
+
+
+    /*
+     * Note: most of the names of the variables put into this structure were kept
+     * the same because the name is also used in called functions.
+     *
+     * bno - block number
+     *
+     */
+    typedef struct
+    {
+        UInt32         bno;
+        Int            status;  /* save the status */
+
+        bool           aacPlusEnabled;
+        bool           aacConfigUtilityEnabled;
+
+        Int            current_program;
+        Int            frameLength;
+        Int            adif_test;
+
+        BITS           inputStream;
+
+        ProgConfig     prog_config;
+
+        Int            SFBWidth128[(1<<LEN_MAX_SFBS)];
+
+        /*
+         * One of the two arrays should be deleted in the final version.
+         */
+        FrameInfo      longFrameInfo;
+        FrameInfo      shortFrameInfo;
+        FrameInfo     *winmap[NUM_WIN_SEQ];
+
+        /*
+         * Pns variables.
+         */
+        Int32          pns_cur_noise_state;
+
+        /*
+         *
+         */
+        MC_Info        mc_info;
+
+        Int            ltp_buffer_state;
+
+        /*
+         *  For eaac+, a scratch matrix is created with the rigth element ( perChan[1] is not used)
+         *  and the fxpCoef matrix. These  2 matrices are [2][38][64] == 4864 Int32
+         *    2349 coming from the perChan[1] plus 4096 coming from fxpCoef
+         */
+        tDec_Int_Chan  perChan[Chans];
+
+        Int32          fxpCoef[2][LN];         /* LN  = 2048     */
+
+
+
+#ifdef AAC_PLUS
+
+        SBRDECODER_DATA sbrDecoderData;/* allocates 2 SBR_CHANNEL, each has a SBR_FRAME_DATA */
+        SBR_DEC         sbrDec;
+        SBRBITSTREAM    sbrBitStr;
+
+#endif
+
+
+        /*
+         * If ADTS support is needed, the following variables will
+         * be required.
+         */
+        UInt32         syncword;
+        Int            invoke;
+
+        Int         mask[MAXBANDS];
+        Int         hasmask;
+
+
+        /*  SBR usage
+         *  These two unions are used for the SBR tool and used
+         *  as a single 2560 int32 continuous memory for circular
+         *  buffering the synthesis QMF's bank history
+         */
+
+        /* This union specifies memory for arrays which are used
+         * by only one function.  This is the simplest type of scratch
+         * memory to implement, since there are no worries about
+         * function interaction.
+         */
+        union scratch_memory
+        {
+            Int32  fft[LONG_WINDOW];    /* 1024, as needed by the FFT */
+            Int32  tns_inv_filter[TNS_MAX_ORDER];
+            Int32  tns_decode_coef[2*TNS_MAX_ORDER];
+            Int    huffbook_used[248];
+            Int16  tmp_spec[LN2];  /* Used in conjunction with quant_spec */
+
+            ADIF_Header    adif_header;
+
+            ProgConfig     scratch_prog_config;
+
+
+            Int32  scratch_mem[16][64];
+        } scratch;
+
+        /* This union tries to take advantage of the fact that
+         * some variables are only used before LTP, and
+         * the long array, predictedSamples, is only used after LTP.
+         */
+
+        /*
+         *  also used by the circular buffer scheme on aac+ (needs 4096 + 1152)
+         *  from scratch_mem[2] + 5248  (uses most of shared_memory).
+         *  For eaac+, shared memory is used by sbrQmfBufferReal which needs
+         *  1824 bytes
+         */
+        union shared_memory
+        {
+            Int32       predictedSamples[LONG_BLOCK1];  /* 2048 Int32 */
+
+            Char        data_stream_bytes[(1<<LEN_D_CNT)+1];
+
+            struct
+            {
+                Int16         quantSpec[LN2];
+                SectInfo    sect[MAXBANDS + 1];
+                PulseInfo   pulseInfo;
+            } a;
+
+        } share;
+
+
+    } tDec_Int_File;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_TDEC_INT_FILE_H */
diff --git a/media/libstagefright/codecs/aacdec/s_tns_frame_info.h b/media/libstagefright/codecs/aacdec/s_tns_frame_info.h
new file mode 100644
index 0000000..61af0ac
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_tns_frame_info.h
@@ -0,0 +1,147 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_TNS_frame_info.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to eliminate triple-nested structure, which wasted
+ 2 KB of memory.
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Description:
+ (1) Changed hard coded size of arrays from "8" to "TNS_MAX_WIN"
+ (2) Moved elements from s_TNSinfo.h up to the level of TNS_frame_info
+ (3) Added Bool "tns_data_present" for future use.
+ (4) Moved lpc_coef up from s_TNSfilt.h (allowed for use of smaller array.)
+
+ Description:
+ (1) Removed the array "coef_res", which is now a local variable on the
+ stack inside get_tns.c
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, s_TNS_frame_info
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TNS_FRAME_INFO_H
+#define S_TNS_FRAME_INFO_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_tns_const.h"
+#include "s_tnsfilt.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
+    {
+        Bool tns_data_present;
+
+        /* Information about the number of filters for each window. */
+        Int n_filt[TNS_MAX_WIN];
+
+        /*
+         * Filter Information
+         *
+         * For short windows, there is a maximum of
+         * 1 filter per window (8 total)
+         *
+         * For long windows, there is a maximum of 3 filters
+         *
+         */
+        TNSfilt filt[TNS_MAX_WIN];
+
+        /*
+         * For short windows, there is a maximum of 8 filters,
+         * each of order 7 (requring 56 Ints)
+         *
+         * For long windows, there is a maximum of 3 filters,
+         * each of order 20 (requiring 60 Ints)
+         *
+         * So, 3*TNS_MAX_ORDER declares an array of sufficient
+         * size (60) for both cases.
+         */
+        Int32 lpc_coef[3*TNS_MAX_ORDER];
+
+    } TNS_frame_info;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_TNS_FRAME_INFO_H */
diff --git a/media/libstagefright/codecs/aacdec/s_tnsfilt.h b/media/libstagefright/codecs/aacdec/s_tnsfilt.h
new file mode 100644
index 0000000..c1d78af
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_tnsfilt.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_TNSfilt.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Added lpc, start, & size, so the data from
+ tns_inv_subblock can be shared with tns_decode_subblock.
+
+ Description: Removed lpc to save 2KB of memory (on 32-bit machines.)
+ This change requires tns_decode_coef.c to perform calculations in place.
+
+ Description: Removed start & size.  start_band and stop_band can simply
+ take on a new meaning after this function.  (coef index, rather than
+ scalefactor band index.)
+
+ Description: Had to add "start_coef" and "stop_coef" in order to preserve
+ values "start_band" and "stop_band."  This required a change to
+ tns_setup_filter.c also.
+
+ Description: Had to add element "q_lpc" to store the q-format of the lpc
+ coefficients passed via "coef."
+
+ Description: Moved lpc_coef array up to the s_TNS_frame_info.h structure.
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, s_TNSfilt
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TNSFILT_H
+#define S_TNSFILT_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_tns_const.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
+    {
+        Int start_band;
+        Int stop_band;
+        Int start_coef;
+        Int stop_coef;
+        UInt order;
+        Int direction;
+        Int q_lpc;
+
+    } TNSfilt;
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* S_TNSFILT_H */
diff --git a/media/libstagefright/codecs/aacdec/s_wnd_shape.h b/media/libstagefright/codecs/aacdec/s_wnd_shape.h
new file mode 100644
index 0000000..c8a05c8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/s_wnd_shape.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: s_Wnd_Shape.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Change data type to Int
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, Wnd_Shape
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_WND_SHAPE_H
+#define S_WND_SHAPE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+{
+    Int    this_bk;
+    Int    prev_bk;
+} Wnd_Shape;
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.cpp b/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.cpp
new file mode 100644
index 0000000..efbab7d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.cpp
@@ -0,0 +1,366 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_aliasing_reduction.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+
+#include    "sbr_aliasing_reduction.h"
+#include    "pv_sqrt.h"
+
+#include    "aac_mem_funcs.h"
+
+#include    "pv_div.h"
+#include    "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Q30fmt(x)   (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+#include "pv_normalize.h"
+#include  "sbr_constants.h"
+
+/*******************************************************************************
+ Functionname:  sbr_aliasing_reduction
+ *******************************************************************************
+ Description:
+ Arguments:
+
+ Return:        none
+*******************************************************************************/
+void sbr_aliasing_reduction(Int32 *degreeAlias,
+                            Int32  * nrg_gain_man,
+                            Int32  * nrg_gain_exp,
+                            Int32  * nrg_est_man,
+                            Int32  * nrg_est_exp,
+                            Int32  * dontUseTheseGainValues,
+                            Int32    noSubbands,
+                            Int32    lowSubband,
+                            Int32  sqrt_cache[][4],
+                            Int32 * groupVector)
+{
+
+    Int32 temp1;
+    Int32 est_total;
+    Int32 ref_total_man;
+    Int32 ref_total_exp;
+    Int32 tmp_q1;
+    Int32 tmp_q2;
+    Int32 tmp_q3;
+    Int32 tmp_q4;
+    Int32 bst_man;
+    Int32 bst_exp;
+    struct intg_div   quotient;
+    struct intg_sqrt  root_sq;
+    Int32 group;
+    Int32 grouping = 0;
+    Int32 index = 0;
+    Int32 noGroups;
+    Int32 k;
+
+
+    /* Calculate grouping*/
+    for (k = 0; k < noSubbands - 1; k++)
+    {
+        if (degreeAlias[k + lowSubband + 1] && dontUseTheseGainValues[k] == 0)
+        {
+            if (grouping == 0)
+            {
+                groupVector[index] = k + lowSubband;
+                grouping = 1;
+                index++;
+            }
+        }
+        else
+        {
+            if (grouping)
+            {
+                groupVector[index] = k + lowSubband;
+
+                if (! dontUseTheseGainValues[k])
+                {
+                    (groupVector[index])++;
+                }
+                grouping = 0;
+                index++;
+            }
+        }
+    }
+
+    if (grouping)
+    {
+        groupVector[index] = noSubbands + lowSubband;
+        index++;
+    }
+    noGroups = (index >> 1);
+
+
+
+    /*Calculate new gain*/
+    for (group = 0; group < noGroups; group ++)
+    {
+
+        int startGroup = groupVector[(group<<1)] - lowSubband;
+        int stopGroup  = groupVector[(group<<1)+1] - lowSubband;
+
+
+        est_total = 0;
+        ref_total_man = 0;
+
+        tmp_q1 = -100;
+        tmp_q2 = -100;
+
+        for (k = startGroup; k < stopGroup; k++)
+        {
+            if (tmp_q1 < nrg_est_exp[k])
+            {
+                tmp_q1 = nrg_est_exp[k];    /* max */
+            }
+            if (tmp_q2 < (nrg_est_exp[k] + (nrg_gain_exp[k] << 1)))
+            {
+                tmp_q2 = (nrg_est_exp[k] + (nrg_gain_exp[k] << 1));  /* max */
+            }
+        }
+
+
+        k -= startGroup;        /*  number of element used in the addition */
+        /* adjust Q format */
+        tmp_q2 += 59 - pv_normalize(k);
+
+        for (k = startGroup; k < stopGroup; k++)
+        {
+            /*
+             *  est_total += nrg_est[k]
+             *  ref_total += nrg_est[k]*nrg_gain[k]*nrg_gain[k
+             */
+            est_total += nrg_est_man[k] >> (tmp_q1 - nrg_est_exp[k]);
+
+            if (tmp_q2 - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1)) < 60)
+            {
+                nrg_gain_man[k] = fxp_mul32_Q28(nrg_gain_man[k], nrg_gain_man[k]);
+                nrg_gain_exp[k] = (nrg_gain_exp[k] << 1) + 28;
+                tmp_q3          = fxp_mul32_Q28(nrg_gain_man[k], nrg_est_man[k]);
+                ref_total_man    += tmp_q3 >> (tmp_q2 - (nrg_est_exp[k] + nrg_gain_exp[k]));
+            }
+        }
+
+        ref_total_exp = tmp_q2 + 28;
+
+        pv_div(ref_total_man, est_total, &quotient);
+
+        tmp_q2 += - tmp_q1 - quotient.shift_factor - 2;
+
+
+
+        for (k = startGroup; k < stopGroup; k++)
+        {
+            Int32 alpha;
+            temp1 = k + lowSubband;
+            if (k < noSubbands - 1)
+            {
+                alpha = degreeAlias[temp1 + 1] > degreeAlias[temp1 ] ?
+                        degreeAlias[temp1 + 1] : degreeAlias[temp1 ];
+            }
+            else
+            {
+                alpha = degreeAlias[temp1];
+            }
+
+            /*
+             *  nrg_gain[k] = alpha*newGain + (1.0f-alpha)*nrg_gain[k]*nrg_gain[k];
+             */
+
+            tmp_q1 = tmp_q2 > nrg_gain_exp[k] ? tmp_q2 : nrg_gain_exp[k];
+            tmp_q1++;
+
+            tmp_q3 = fxp_mul32_Q30(alpha, quotient.quotient);
+            tmp_q4 = fxp_mul32_Q30(Q30fmt(1.0f) - alpha, nrg_gain_man[k]);
+
+            nrg_gain_man[k] = (tmp_q3 >> (tmp_q1 - tmp_q2)) +
+                              (tmp_q4 >> (tmp_q1 - nrg_gain_exp[k]));
+
+            nrg_gain_exp[k] = tmp_q1;
+        }
+
+
+        bst_exp = -100;
+
+        for (k = startGroup; k < stopGroup; k++)
+        {
+            if (bst_exp < nrg_gain_exp[k] + nrg_est_exp[k])
+            {
+                bst_exp = nrg_gain_exp[k] + nrg_est_exp[k];    /* max */
+            }
+        }
+
+        k -= startGroup;        /*  number of element used in the addition */
+
+        while (k != 0)          /*  bit guard protection depends on log2(k)  */
+        {
+            k >>= 1;
+            bst_exp++;           /*  add extra bit-overflow-guard */
+        }
+
+        bst_man = 0;
+
+        for (k = startGroup; k < stopGroup; k++)
+        {
+            tmp_q2 =  fxp_mul32_Q28(nrg_gain_man[k], nrg_est_man[k]);
+            bst_man +=  tmp_q2 >> (bst_exp - nrg_gain_exp[k] - nrg_est_exp[k]);
+        }
+
+        bst_exp += 28;  /* compensate for shift down */
+
+        if (bst_man)
+        {
+            /*
+             *  bst = ref_total / bst
+             */
+
+            pv_div(ref_total_man, bst_man, &quotient);
+            bst_exp = ref_total_exp - bst_exp - quotient.shift_factor - 30;
+            bst_man = quotient.quotient;      /*  Q30 */
+
+            for (k = startGroup; k < stopGroup; k++)
+            {
+                tmp_q1 = fxp_mul32_Q30(bst_man, nrg_gain_man[k]);
+                pv_sqrt(tmp_q1, (bst_exp + nrg_gain_exp[k] + 60), &root_sq, sqrt_cache[0]);
+                nrg_gain_man[k] = root_sq.root;
+                nrg_gain_exp[k] = root_sq.shift_factor;
+            }
+        }
+        else
+        {
+            pv_memset((void *)&nrg_gain_man[startGroup],
+                      0,
+                      (stopGroup - startGroup)*sizeof(nrg_gain_man[0]));
+
+            pv_memset((void *)&nrg_gain_exp[startGroup],
+                      0,
+                      (stopGroup - startGroup)*sizeof(nrg_gain_exp[0]));
+
+        }
+
+    }
+}
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.h b/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.h
new file mode 100644
index 0000000..2ce99ec
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_aliasing_reduction.h
@@ -0,0 +1,92 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_aliasing_reduction.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_ALIASING_REDUCTION_H
+#define SBR_ALIASING_REDUCTION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+void sbr_aliasing_reduction(Int32 *degreeAlias,
+                            Int32  * nrg_gain_man,
+                            Int32  * nrg_gain_exp,
+                            Int32  * nrg_est_man,
+                            Int32  * nrg_est_exp,
+                            Int32  * dontUseTheseGainValues,
+                            Int32    noSubbands,
+                            Int32    lowSubband,
+                            Int32  sqrt_cache[][4],
+                            Int32 * groupVector);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_applied.cpp b/media/libstagefright/codecs/aacdec/sbr_applied.cpp
new file mode 100644
index 0000000..c8b81b2
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_applied.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Filename: sbr_applied.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    INPUT
+
+    SBRDECODER self,
+    SBRBITSTREAM * stream,
+    float *timeData,
+    int numChannels
+
+    OUTPUT
+
+    errorCode, noError if successful
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        sbr decoder processing, set up SBR decoder phase 2 in case of
+        different cotrol data
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+#include    "sbr_applied.h"
+#include    "sbr_read_data.h"
+
+#include    "sbr_decode_envelope.h"
+#include    "decode_noise_floorlevels.h"
+#include    "sbr_requantize_envelope_data.h"
+#include    "sbr_envelope_unmapping.h"
+#include    "sbr_dec.h"
+#include    "e_sbr_element_id.h"
+#include    "aac_mem_funcs.h"
+
+#ifdef PARAMETRICSTEREO
+#include    "ps_bstr_decoding.h"
+#include    "ps_allocate_decoder.h"
+
+#endif
+
+#include    "init_sbr_dec.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LEFT  (0)
+#define RIGHT (1)
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR  sbr_applied(SBRDECODER_DATA * self,
+                       SBRBITSTREAM * stream,
+                       Int16 *ch_left,
+                       Int16 *ch_right,
+                       Int16 *timeData,
+                       SBR_DEC *sbrDec,
+                       tDec_Int_File  *pVars,
+                       Int32 numChannels)
+{
+    SBR_ERROR err = SBRDEC_OK ;
+
+    Int32 eleChannels = 0;
+
+    SBR_CHANNEL *SbrChannel = self->SbrChannel;
+
+    /* Get SBR or PS Data only when available */
+    if (stream->NrElements)
+    {
+        /* read frame data from bitstream */
+
+        err = sbr_read_data(self,
+                            sbrDec,
+                            stream);
+
+        if (err != SBRDEC_OK)
+        {
+            /*
+             * This error condition disables any further SBR processing
+             */
+            self->SbrChannel[LEFT].syncState = UPSAMPLING;
+            if (eleChannels == 2)
+            {
+                self->SbrChannel[RIGHT].syncState = UPSAMPLING;
+            }
+        }
+
+        /*
+         *  Setting bistream and decoding type is only done once,
+         */
+        if (SbrChannel[LEFT].syncState == SBR_ACTIVE && self->setStreamType)
+        {
+            self->setStreamType = 0;  /* Disable Lock for AAC stream type setting  */
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+
+            Int sbrEnablePS = self->hParametricStereoDec->psDetected;
+
+            pVars->mc_info.psPresentFlag  = sbrEnablePS;
+
+            if (sbrEnablePS)   /* Initialize PS arrays */
+            {
+                pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_PS;
+                ps_allocate_decoder(self, 32);
+
+                /* Disable LC (or Enable HQ)  if PS is detected */
+                sbrDec->LC_aacP_DecoderFlag = OFF;
+            }
+            else
+            {
+                /*
+                 *  Do not downgrade stream type from eaac+, if it has been explicitly declared
+                 */
+                if (pVars->mc_info.ExtendedAudioObjectType != MP4AUDIO_PS)
+                {
+                    pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR;
+
+                    if (pVars->mc_info.nch > 1)
+                    {
+                        sbrDec->LC_aacP_DecoderFlag = ON;    /* Enable LC for stereo */
+                    }
+                    else
+                    {
+                        sbrDec->LC_aacP_DecoderFlag = OFF;    /* Disable LC, Enable HQ for mono */
+                    }
+                }
+                else
+                {
+                    sbrEnablePS = 1;  /* Force this condition as it was explicititly declared */
+                    pVars->mc_info.psPresentFlag  = sbrEnablePS;
+
+                }
+            }
+#else
+
+            pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR;
+
+            if (pVars->mc_info.nch > 1)
+            {
+                sbrDec->LC_aacP_DecoderFlag = ON;    /* Enable LC for stereo */
+            }
+            else
+            {
+                sbrDec->LC_aacP_DecoderFlag = OFF;    /* Disable LC, Enable HQ for mono */
+            }
+#endif
+
+#else
+            pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR;
+
+            sbrDec->LC_aacP_DecoderFlag = ON;       /* Enable LC for all sbr decoding */
+
+#endif
+
+        }   /*   (SbrChannel[LEFT].syncState == SBR_ACTIVE && lock)  */
+        else
+        {
+            /*
+             *  Default setting for upsampler
+             */
+            if (pVars->mc_info.ExtendedAudioObjectType == MP4AUDIO_AAC_LC)
+            {
+                /*
+                 *  Change only in implicit signalling, otherwise keep original declaration
+                 */
+                pVars->mc_info.ExtendedAudioObjectType = MP4AUDIO_SBR;
+            }
+
+#ifdef HQ_SBR
+            if (pVars->mc_info.nch > 1)
+            {
+                sbrDec->LC_aacP_DecoderFlag = ON;    /* Enable LC for stereo */
+            }
+            else
+            {
+                sbrDec->LC_aacP_DecoderFlag = OFF;    /* Disable LC, Enable HQ for mono */
+            }
+#else
+            sbrDec->LC_aacP_DecoderFlag = ON;       /* Enable LC for all sbr decoding */
+
+#endif
+            /* mask error and let upsampler run */
+            err = SBRDEC_OK;
+
+        }
+
+        /* decoding */
+        eleChannels = (stream->sbrElement [LEFT].ElementID == SBR_ID_CPE) ? 2 : 1;
+
+        if (SbrChannel[LEFT].syncState == SBR_ACTIVE)
+        {
+
+            sbr_decode_envelope(&(SbrChannel[LEFT].frameData));
+
+            decode_noise_floorlevels(&(SbrChannel[LEFT].frameData));
+
+            if (! SbrChannel[LEFT].frameData.coupling)
+            {
+                sbr_requantize_envelope_data(&(SbrChannel[LEFT].frameData));
+            }
+
+            if (eleChannels == 2)
+            {
+
+                sbr_decode_envelope(&(SbrChannel[RIGHT].frameData));
+
+                decode_noise_floorlevels(&(SbrChannel[RIGHT].frameData));
+
+                if (SbrChannel[RIGHT].frameData.coupling)
+                {
+                    sbr_envelope_unmapping(&(SbrChannel[ LEFT].frameData),
+                                           &(SbrChannel[RIGHT].frameData));
+                }
+                else
+                {
+                    sbr_requantize_envelope_data(&(SbrChannel[RIGHT].frameData));
+                }
+            }
+        }
+        else            /* enable upsampling until valid SBR is obtained */
+        {
+            /*
+             *  Incomplete sbr frame, or disabled SBR section
+             *  Set the decoder to act as a regular upsampler
+             */
+
+            init_sbr_dec((sbrDec->outSampleRate >> 1),
+                         pVars->mc_info.upsamplingFactor,
+                         sbrDec,
+                         &(self->SbrChannel[LEFT].frameData));
+
+            if ((eleChannels == 2) && (SbrChannel[RIGHT].syncState != SBR_ACTIVE))
+            {
+                init_sbr_dec((sbrDec->outSampleRate >> 1),
+                             pVars->mc_info.upsamplingFactor,
+                             sbrDec,
+                             &(self->SbrChannel[RIGHT].frameData));
+
+            }
+
+        }
+
+    }
+
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+    if (pVars->mc_info.ExtendedAudioObjectType == MP4AUDIO_PS)
+    {
+        ps_bstr_decoding(self->hParametricStereoDec);
+        /* allocate pointer for rigth channel qmf filter history  */
+        Int16 *tempInt16Ptr = (Int16 *)SbrChannel[RIGHT].frameData.V;
+        self->hParametricStereoDec->R_ch_qmf_filter_history = (Int32 *)tempInt16Ptr;
+
+
+        /*
+         * 1824 (48*38) Int32 needed by each matrix sbrQmfBufferReal, sbrQmfBufferImag
+         * pVars->share.predictedSamples  has 2048 available
+         * pVars->fxpCoef[1]  has 2048 available
+         */
+        SbrChannel[LEFT].frameData.sbrQmfBufferReal = pVars->share.predictedSamples;
+        SbrChannel[LEFT].frameData.sbrQmfBufferImag = &pVars->fxpCoef[0][920];
+
+        sbr_dec(ch_left,
+                timeData,
+                &(SbrChannel[LEFT].frameData),
+                (SbrChannel[LEFT].syncState == SBR_ACTIVE),
+                sbrDec,
+                &timeData[RIGHT],
+                self->hParametricStereoDec,
+                pVars);
+    }
+    else
+    {
+#endif
+#endif
+
+        SbrChannel[LEFT].frameData.sbrQmfBufferReal = pVars->fxpCoef[LEFT];
+#ifdef HQ_SBR
+        SbrChannel[LEFT].frameData.sbrQmfBufferImag = pVars->fxpCoef[RIGHT];
+#endif
+
+        sbr_dec(ch_left,
+                timeData,
+                &(SbrChannel[LEFT].frameData),
+                (SbrChannel[LEFT].syncState == SBR_ACTIVE),
+                sbrDec,
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+                NULL,
+                NULL,
+#endif
+#endif
+                pVars);
+
+        if (numChannels == 2)
+        {
+            SbrChannel[RIGHT].frameData.sbrQmfBufferReal = pVars->fxpCoef[LEFT];
+#ifdef HQ_SBR
+            SbrChannel[RIGHT].frameData.sbrQmfBufferImag = pVars->fxpCoef[RIGHT];
+#endif
+
+            sbr_dec(ch_right,
+                    &timeData[RIGHT],
+                    &(SbrChannel[RIGHT].frameData),
+                    (SbrChannel[RIGHT].syncState == SBR_ACTIVE),
+                    sbrDec,
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+                    NULL,
+                    NULL,
+#endif
+#endif
+                    pVars);
+
+        }
+
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+    }
+#endif
+#endif
+
+    return err;
+}
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_applied.h b/media/libstagefright/codecs/aacdec/sbr_applied.h
new file mode 100644
index 0000000..6878537
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_applied.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_applied.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_APPLIED_H
+#define SBR_APPLIED_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "e_sbr_error.h"
+#include "s_sbr_channel.h"
+#include "s_sbrbitstream.h"
+#include "sbr_dec.h"
+#include "pv_audio_type_defs.h"
+#include "s_tdec_int_file.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define MAX_FRAME_SIZE  1024
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+    SBR_ERROR  sbr_applied(SBRDECODER_DATA * self,
+    SBRBITSTREAM * stream,
+    Int16 *ch_left,
+    Int16 *ch_right,
+    Int16 *timeData,
+    SBR_DEC *sbrDec,
+    tDec_Int_File  *pVars,
+    Int32 numChannels);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.cpp b/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.cpp
new file mode 100644
index 0000000..9db3221
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_code_book_envlevel.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include   "pv_audio_type_defs.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+    /*******************************************************************************/
+    /* table       : envelope level, 1.5 dB                                        */
+    /* theor range : [-58,58], CODE_BOOK_SCF_LAV   = 58                            */
+    /* implem range: [-60,60], CODE_BOOK_SCF_LAV10 = 60                            */
+    /* raw stats   : envelopeLevel_00 (yes, wrong suffix in name)  KK 01-03-09     */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode3C2FIX.m/envelopeLevel_00T_cF.mat/m_hALC_cF
+       built by : FH 01-07-05 */
+
+    extern const Char bookSbrEnvLevel10T[120][2] =
+    {
+        {   1,   2 },    { -64, -65 },    {   3,   4 },    { -63, -66 },
+        {   5,   6 },    { -62, -67 },    {   7,   8 },    { -61, -68 },
+        {   9,  10 },    { -60, -69 },    {  11,  12 },    { -59, -70 },
+        {  13,  14 },    { -58, -71 },    {  15,  16 },    { -57, -72 },
+        {  17,  18 },    { -73, -56 },    {  19,  21 },    { -74,  20 },
+        { -55, -75 },    {  22,  26 },    {  23,  24 },    { -54, -76 },
+        { -77,  25 },    { -53, -78 },    {  27,  34 },    {  28,  29 },
+        { -52, -79 },    {  30,  31 },    { -80, -51 },    {  32,  33 },
+        { -83, -82 },    { -81, -50 },    {  35,  57 },    {  36,  40 },
+        {  37,  38 },    { -88, -84 },    { -48,  39 },    { -90, -85 },
+        {  41,  46 },    {  42,  43 },    { -49, -87 },    {  44,  45 },
+        { -89, -86 },    { -124, -123 },    {  47,  50 },    {  48,  49 },
+        { -122, -121 },    { -120, -119 },    {  51,  54 },    {  52,  53 },
+        { -118, -117 },    { -116, -115 },    {  55,  56 },    { -114, -113 },
+        { -112, -111 },    {  58,  89 },    {  59,  74 },    {  60,  67 },
+        {  61,  64 },    {  62,  63 },    { -110, -109 },    { -108, -107 },
+        {  65,  66 },    { -106, -105 },    { -104, -103 },    {  68,  71 },
+        {  69,  70 },    { -102, -101 },    { -100, -99 },    {  72,  73 },
+        { -98, -97 },    { -96, -95 },    {  75,  82 },    {  76,  79 },
+        {  77,  78 },    { -94, -93 },    { -92, -91 },    {  80,  81 },
+        { -47, -46 },    { -45, -44 },    {  83,  86 },    {  84,  85 },
+        { -43, -42 },    { -41, -40 },    {  87,  88 },    { -39, -38 },
+        { -37, -36 },    {  90, 105 },    {  91,  98 },    {  92,  95 },
+        {  93,  94 },    { -35, -34 },    { -33, -32 },    {  96,  97 },
+        { -31, -30 },    { -29, -28 },    {  99, 102 },    { 100, 101 },
+        { -27, -26 },    { -25, -24 },    { 103, 104 },    { -23, -22 },
+        { -21, -20 },    { 106, 113 },    { 107, 110 },    { 108, 109 },
+        { -19, -18 },    { -17, -16 },    { 111, 112 },    { -15, -14 },
+        { -13, -12 },    { 114, 117 },    { 115, 116 },    { -11, -10 },
+        {  -9,  -8 },    { 118, 119 },    {  -7,  -6 },    {  -5,  -4 }
+    };
+
+    /* direction: freq
+       raw table: HuffCode3C2FIX.m/envelopeLevel_00F_cF.mat/m_hALC_cF
+       built by : FH 01-07-05 */
+
+    extern const Char bookSbrEnvLevel10F[120][2] =
+    {
+        {   1,   2 },    { -64, -65 },    {   3,   4 },    { -63, -66 },
+        {   5,   6 },    { -67, -62 },    {   7,   8 },    { -68, -61 },
+        {   9,  10 },    { -69, -60 },    {  11,  13 },    { -70,  12 },
+        { -59, -71 },    {  14,  16 },    { -58,  15 },    { -72, -57 },
+        {  17,  19 },    { -73,  18 },    { -56, -74 },    {  20,  23 },
+        {  21,  22 },    { -55, -75 },    { -54, -53 },    {  24,  27 },
+        {  25,  26 },    { -76, -52 },    { -77, -51 },    {  28,  31 },
+        {  29,  30 },    { -50, -78 },    { -79, -49 },    {  32,  36 },
+        {  33,  34 },    { -48, -47 },    { -80,  35 },    { -81, -82 },
+        {  37,  47 },    {  38,  41 },    {  39,  40 },    { -83, -46 },
+        { -45, -84 },    {  42,  44 },    { -85,  43 },    { -44, -43 },
+        {  45,  46 },    { -88, -87 },    { -86, -90 },    {  48,  66 },
+        {  49,  56 },    {  50,  53 },    {  51,  52 },    { -92, -42 },
+        { -41, -39 },    {  54,  55 },    { -105, -89 },    { -38, -37 },
+        {  57,  60 },    {  58,  59 },    { -94, -91 },    { -40, -36 },
+        {  61,  63 },    { -20,  62 },    { -115, -110 },    {  64,  65 },
+        { -108, -107 },    { -101, -97 },    {  67,  89 },    {  68,  75 },
+        {  69,  72 },    {  70,  71 },    { -95, -93 },    { -34, -27 },
+        {  73,  74 },    { -22, -17 },    { -16, -124 },    {  76,  82 },
+        {  77,  79 },    { -123,  78 },    { -122, -121 },    {  80,  81 },
+        { -120, -119 },    { -118, -117 },    {  83,  86 },    {  84,  85 },
+        { -116, -114 },    { -113, -112 },    {  87,  88 },    { -111, -109 },
+        { -106, -104 },    {  90, 105 },    {  91,  98 },    {  92,  95 },
+        {  93,  94 },    { -103, -102 },    { -100, -99 },    {  96,  97 },
+        { -98, -96 },    { -35, -33 },    {  99, 102 },    { 100, 101 },
+        { -32, -31 },    { -30, -29 },    { 103, 104 },    { -28, -26 },
+        { -25, -24 },    { 106, 113 },    { 107, 110 },    { 108, 109 },
+        { -23, -21 },    { -19, -18 },    { 111, 112 },    { -15, -14 },
+        { -13, -12 },    { 114, 117 },    { 115, 116 },    { -11, -10 },
+        {  -9,  -8 },    { 118, 119 },    {  -7,  -6 },    {  -5,  -4 }
+    };
+
+    /*******************************************************************************/
+    /* table       : envelope balance, 1.5 dB                                      */
+    /* theor range : [-48,48], CODE_BOOK_SCF_LAV = 48                              */
+    /* implem range: same but mapped to [-24,24], CODE_BOOK_SCF_LAV_BALANCE10 = 24 */
+    /* raw stats   : envelopePan_00 (yes, wrong suffix in name)  KK 01-03-09       */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode3C.m/envelopePan_00T.mat/v_hALB
+       built by : FH 01-05-15 */
+
+    extern const Char bookSbrEnvBalance10T[48][2] =
+    {
+        { -64,   1 },    { -63,   2 },    { -65,   3 },    { -62,   4 },
+        { -66,   5 },    { -61,   6 },    { -67,   7 },    { -60,   8 },
+        { -68,   9 },    {  10,  11 },    { -69, -59 },    {  12,  13 },
+        { -70, -58 },    {  14,  28 },    {  15,  21 },    {  16,  18 },
+        { -57,  17 },    { -71, -56 },    {  19,  20 },    { -88, -87 },
+        { -86, -85 },    {  22,  25 },    {  23,  24 },    { -84, -83 },
+        { -82, -81 },    {  26,  27 },    { -80, -79 },    { -78, -77 },
+        {  29,  36 },    {  30,  33 },    {  31,  32 },    { -76, -75 },
+        { -74, -73 },    {  34,  35 },    { -72, -55 },    { -54, -53 },
+        {  37,  41 },    {  38,  39 },    { -52, -51 },    { -50,  40 },
+        { -49, -48 },    {  42,  45 },    {  43,  44 },    { -47, -46 },
+        { -45, -44 },    {  46,  47 },    { -43, -42 },    { -41, -40 }
+    };
+
+    /* direction: freq
+       raw table: HuffCode3C.m/envelopePan_00T.mat/v_hALB
+       built by : FH 01-05-15 */
+
+    extern const Char bookSbrEnvBalance10F[48][2] =
+    {
+        { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
+        { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
+        { -60,   9 },    {  10,  11 },    { -69, -59 },    { -70,  12 },
+        { -58,  13 },    {  14,  17 },    { -71,  15 },    { -57,  16 },
+        { -56, -73 },    {  18,  32 },    {  19,  25 },    {  20,  22 },
+        { -72,  21 },    { -88, -87 },    {  23,  24 },    { -86, -85 },
+        { -84, -83 },    {  26,  29 },    {  27,  28 },    { -82, -81 },
+        { -80, -79 },    {  30,  31 },    { -78, -77 },    { -76, -75 },
+        {  33,  40 },    {  34,  37 },    {  35,  36 },    { -74, -55 },
+        { -54, -53 },    {  38,  39 },    { -52, -51 },    { -50, -49 },
+        {  41,  44 },    {  42,  43 },    { -48, -47 },    { -46, -45 },
+        {  45,  46 },    { -44, -43 },    { -42,  47 },    { -41, -40 }
+    };
+
+    /*******************************************************************************/
+    /* table       : envelope level, 3.0 dB                                        */
+    /* theor range : [-29,29], CODE_BOOK_SCF_LAV   = 29                            */
+    /* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31                            */
+    /* raw stats   : envelopeLevel_11  KK 00-02-03                                 */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode2.m
+       built by : FH 00-02-04 */
+
+    extern const Char bookSbrEnvLevel11T[62][2] =
+    {
+        { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
+        { -62,   5 },    { -67,   6 },    { -61,   7 },    { -68,   8 },
+        { -60,   9 },    {  10,  11 },    { -69, -59 },    {  12,  14 },
+        { -70,  13 },    { -71, -58 },    {  15,  18 },    {  16,  17 },
+        { -72, -57 },    { -73, -74 },    {  19,  22 },    { -56,  20 },
+        { -55,  21 },    { -54, -77 },    {  23,  31 },    {  24,  25 },
+        { -75, -76 },    {  26,  27 },    { -78, -53 },    {  28,  29 },
+        { -52, -95 },    { -94,  30 },    { -93, -92 },    {  32,  47 },
+        {  33,  40 },    {  34,  37 },    {  35,  36 },    { -91, -90 },
+        { -89, -88 },    {  38,  39 },    { -87, -86 },    { -85, -84 },
+        {  41,  44 },    {  42,  43 },    { -83, -82 },    { -81, -80 },
+        {  45,  46 },    { -79, -51 },    { -50, -49 },    {  48,  55 },
+        {  49,  52 },    {  50,  51 },    { -48, -47 },    { -46, -45 },
+        {  53,  54 },    { -44, -43 },    { -42, -41 },    {  56,  59 },
+        {  57,  58 },    { -40, -39 },    { -38, -37 },    {  60,  61 },
+        { -36, -35 },    { -34, -33 }
+    };
+
+    /* direction: freq
+       raw table: HuffCode2.m
+       built by : FH 00-02-04 */
+
+    extern const Char bookSbrEnvLevel11F[62][2] =
+    {
+        { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
+        { -62,   5 },    { -67,   6 },    {   7,   8 },    { -61, -68 },
+        {   9,  10 },    { -60, -69 },    {  11,  12 },    { -59, -70 },
+        {  13,  14 },    { -58, -71 },    {  15,  16 },    { -57, -72 },
+        {  17,  19 },    { -56,  18 },    { -55, -73 },    {  20,  24 },
+        {  21,  22 },    { -74, -54 },    { -53,  23 },    { -75, -76 },
+        {  25,  30 },    {  26,  27 },    { -52, -51 },    {  28,  29 },
+        { -77, -79 },    { -50, -49 },    {  31,  39 },    {  32,  35 },
+        {  33,  34 },    { -78, -46 },    { -82, -88 },    {  36,  37 },
+        { -83, -48 },    { -47,  38 },    { -86, -85 },    {  40,  47 },
+        {  41,  44 },    {  42,  43 },    { -80, -44 },    { -43, -42 },
+        {  45,  46 },    { -39, -87 },    { -84, -40 },    {  48,  55 },
+        {  49,  52 },    {  50,  51 },    { -95, -94 },    { -93, -92 },
+        {  53,  54 },    { -91, -90 },    { -89, -81 },    {  56,  59 },
+        {  57,  58 },    { -45, -41 },    { -38, -37 },    {  60,  61 },
+        { -36, -35 },    { -34, -33 }
+    };
+
+    /*******************************************************************************/
+    /* table       : envelope balance, 3.0 dB                                      */
+    /* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24                              */
+    /* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 */
+    /* raw stats   : envelopeBalance_11  KK 00-02-03                               */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_hALB
+       built by : FH 01-05-15 */
+
+    extern const Char bookSbrEnvBalance11T[24][2] =
+    {
+        { -64,   1 },    { -63,   2 },    { -65,   3 },    { -66,   4 },
+        { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
+        { -60,   9 },    {  10,  16 },    {  11,  13 },    { -69,  12 },
+        { -76, -75 },    {  14,  15 },    { -74, -73 },    { -72, -71 },
+        {  17,  20 },    {  18,  19 },    { -70, -59 },    { -58, -57 },
+        {  21,  22 },    { -56, -55 },    { -54,  23 },    { -53, -52 }
+    };
+
+    /* direction: time (?)
+       raw table: HuffCode3C.m/envelopeBalance_11T.mat/v_hALB
+       built by : FH 01-05-15 */
+
+    extern const Char bookSbrEnvBalance11F[24][2] =
+    {
+        { -64,   1 },    { -65,   2 },    { -63,   3 },    { -66,   4 },
+        { -62,   5 },    { -61,   6 },    { -67,   7 },    { -68,   8 },
+        { -60,   9 },    {  10,  13 },    { -69,  11 },    { -59,  12 },
+        { -58, -76 },    {  14,  17 },    {  15,  16 },    { -75, -74 },
+        { -73, -72 },    {  18,  21 },    {  19,  20 },    { -71, -70 },
+        { -57, -56 },    {  22,  23 },    { -55, -54 },    { -53, -52 }
+    };
+
+    /*******************************************************************************/
+    /* table       : noise level, 3.0 dB                                           */
+    /* theor range : [-29,29], CODE_BOOK_SCF_LAV   = 29                            */
+    /* implem range: [-31,31], CODE_BOOK_SCF_LAV11 = 31                            */
+    /* raw stats   : noiseLevel_11  KK 00-02-03                                    */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode2.m
+       built by : FH 00-02-04 */
+
+    extern const Char bookSbrNoiseLevel11T[62][2] =
+    {
+        { -64,   1 },    { -63,   2 },    { -65,   3 },    { -66,   4 },
+        { -62,   5 },    { -67,   6 },    {   7,   8 },    { -61, -68 },
+        {   9,  30 },    {  10,  15 },    { -60,  11 },    { -69,  12 },
+        {  13,  14 },    { -59, -53 },    { -95, -94 },    {  16,  23 },
+        {  17,  20 },    {  18,  19 },    { -93, -92 },    { -91, -90 },
+        {  21,  22 },    { -89, -88 },    { -87, -86 },    {  24,  27 },
+        {  25,  26 },    { -85, -84 },    { -83, -82 },    {  28,  29 },
+        { -81, -80 },    { -79, -78 },    {  31,  46 },    {  32,  39 },
+        {  33,  36 },    {  34,  35 },    { -77, -76 },    { -75, -74 },
+        {  37,  38 },    { -73, -72 },    { -71, -70 },    {  40,  43 },
+        {  41,  42 },    { -58, -57 },    { -56, -55 },    {  44,  45 },
+        { -54, -52 },    { -51, -50 },    {  47,  54 },    {  48,  51 },
+        {  49,  50 },    { -49, -48 },    { -47, -46 },    {  52,  53 },
+        { -45, -44 },    { -43, -42 },    {  55,  58 },    {  56,  57 },
+        { -41, -40 },    { -39, -38 },    {  59,  60 },    { -37, -36 },
+        { -35,  61 },    { -34, -33 }
+    };
+
+    /*******************************************************************************/
+    /* table       : noise balance, 3.0 dB                                         */
+    /* theor range : [-24,24], CODE_BOOK_SCF_LAV = 24                              */
+    /* implem range: same but mapped to [-12,12], CODE_BOOK_SCF_LAV_BALANCE11 = 12 */
+    /* raw stats   : noiseBalance_11  KK 00-02-03                                  */
+    /*******************************************************************************/
+
+    /* direction: time
+       raw table: HuffCode3C.m/noiseBalance_11.mat/v_hALB
+       built by : FH 01-05-15 */
+
+    extern const Char bookSbrNoiseBalance11T[24][2] =
+    {
+        { -64,   1 },    { -65,   2 },    { -63,   3 },    {   4,   9 },
+        { -66,   5 },    { -62,   6 },    {   7,   8 },    { -76, -75 },
+        { -74, -73 },    {  10,  17 },    {  11,  14 },    {  12,  13 },
+        { -72, -71 },    { -70, -69 },    {  15,  16 },    { -68, -67 },
+        { -61, -60 },    {  18,  21 },    {  19,  20 },    { -59, -58 },
+        { -57, -56 },    {  22,  23 },    { -55, -54 },    { -53, -52 }
+    };
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.h b/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.h
new file mode 100644
index 0000000..3df0531
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_code_book_envlevel.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: sbr_code_book_envlevel.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ this file declares the scalefactor bands for all sampling rates
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_CODE_BOOK_ENVLEVEL_H
+#define SBR_CODE_BOOK_ENVLEVEL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Char bookSbrEnvLevel10T[120][2];
+    extern const Char bookSbrEnvLevel10F[120][2];
+    extern const Char bookSbrEnvBalance10T[48][2];
+    extern const Char bookSbrEnvBalance10F[48][2];
+    extern const Char bookSbrEnvLevel11T[62][2];
+    extern const Char bookSbrEnvLevel11F[62][2];
+    extern const Char bookSbrEnvBalance11T[24][2];
+    extern const Char bookSbrEnvBalance11F[24][2];
+    extern const Char bookSbrNoiseLevel11T[62][2];
+    extern const Char bookSbrNoiseBalance11T[24][2];
+
+    /*----------------------------------------------------------------------------
+    ; 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/aacdec/sbr_constants.h b/media/libstagefright/codecs/aacdec/sbr_constants.h
new file mode 100644
index 0000000..d54a699
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_constants.h
@@ -0,0 +1,210 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_constants.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_CONSTANTS_H
+#define SBR_CONSTANTS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+
+#define SBR_AMP_RES_1_5         0
+#define SBR_AMP_RES_3_0         1
+
+#define MAX_NOISE_ENVELOPES     2
+#define MAX_NOISE_COEFFS        5
+#define MAX_NUM_NOISE_VALUES     (MAX_NOISE_ENVELOPES * MAX_NOISE_COEFFS)
+
+#define MAX_ENVELOPES           5
+#define MAX_FREQ_COEFFS         58
+#define MAX_NUM_ENVELOPE_VALUES (MAX_ENVELOPES * MAX_FREQ_COEFFS)
+
+#define MAX_NUM_CHANNELS            2
+#define NOISE_FLOOR_OFFSET          6
+#define NOISE_FLOOR_OFFSET_PLUS_1   7
+
+#define LOW_RES                     0
+#define HIGH_RES                    1
+
+#define LO                          0
+#define HI                          1
+
+#define TIME                        1
+#define FREQ                        0
+
+#define LENGTH_FRAME_INFO           35
+
+#define SI_SBR_CRC_BITS             10
+
+#define SBR_FREQ_SCALE_DEFAULT      2
+#define SBR_ALTER_SCALE_DEFAULT     1
+#define SBR_NOISE_BANDS_DEFAULT     2
+
+#define SBR_LIMITER_BANDS_DEFAULT      2
+#define SBR_LIMITER_GAINS_DEFAULT      2
+#define SBR_INTERPOL_FREQ_DEFAULT      1
+#define SBR_SMOOTHING_LENGTH_DEFAULT   1
+
+/* header */
+#define SI_SBR_AMP_RES_BITS            1
+#define SI_SBR_START_FREQ_BITS         4
+#define SI_SBR_STOP_FREQ_BITS          4
+#define SI_SBR_XOVER_BAND_BITS         3
+#define SI_SBR_RESERVED_BITS_HDR       2
+#define SI_SBR_DATA_EXTRA_BITS         1
+#define SI_SBR_HEADER_EXTRA_1_BITS     1
+#define SI_SBR_HEADER_EXTRA_2_BITS     1
+
+#define SI_SBR_FREQ_SCALE_BITS         2
+#define SI_SBR_ALTER_SCALE_BITS        1
+#define SI_SBR_NOISE_BANDS_BITS        2
+
+#define SI_SBR_LIMITER_BANDS_BITS      2
+#define SI_SBR_LIMITER_GAINS_BITS      2
+#define SI_SBR_INTERPOL_FREQ_BITS      1
+#define SI_SBR_SMOOTHING_LENGTH_BITS   1
+
+
+/* data */
+#define SI_SBR_RESERVED_PRESENT        1
+#define SI_SBR_RESERVED_BITS_DATA      4
+
+#define SI_SBR_COUPLING_BITS           1
+
+#define SI_SBR_INVF_MODE_BITS          2
+
+#define SI_SBR_EXTENDED_DATA_BITS      1
+#define SI_SBR_EXTENSION_SIZE_BITS     4
+#define SI_SBR_EXTENSION_ESC_COUNT_BITS   8
+#define SI_SBR_EXTENSION_ID_BITS          2
+
+#define SI_SBR_NOISE_MODE_BITS         1
+#define SI_SBR_DOMAIN_BITS             1
+
+#define SI_SBR_START_ENV_BITS_AMP_RES_3_0           6
+#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0   5
+#define SI_SBR_START_NOISE_BITS_AMP_RES_3_0         5
+#define SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0 5
+
+#define SI_SBR_START_ENV_BITS_AMP_RES_1_5           7
+#define SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5   6
+
+
+#define SBR_CLA_BITS  2
+#define SBR_ABS_BITS  2
+#define SBR_RES_BITS  1
+#define SBR_REL_BITS  2
+#define SBR_ENV_BITS  2
+#define SBR_NUM_BITS  2
+
+
+#define FIXFIX  0
+#define FIXVAR  1
+#define VARFIX  2
+#define VARVAR  3
+
+
+#define    LEN_EX_TYPE  (4)
+#define    LEN_NIBBLE   (4)
+
+
+/*----------------------------------------------------------------------------
+; 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/aacdec/sbr_crc_check.cpp b/media/libstagefright/codecs/aacdec/sbr_crc_check.cpp
new file mode 100644
index 0000000..3bb4398
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_crc_check.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_crc_check.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "sbr_crc_check.h"
+#include "s_crc_buffer.h"
+#include "buf_getbits.h"
+#include "sbr_constants.h"
+#include "check_crc.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
+----------------------------------------------------------------------------*/
+
+const unsigned short MAXCRCSTEP = 16;
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int32 sbr_crc_check(BIT_BUFFER * hBitBuf, UInt32 NrBits)
+{
+    Int32 crcResult = 1;
+    BIT_BUFFER BitBufferCRC;
+    UInt32 NrCrcBits;
+
+    UInt32 crcCheckSum;
+
+    Int32 i;
+    CRC_BUFFER CrcBuf;
+    UInt32 bValue;
+    Int32 CrcStep;
+    Int32 CrcNrBitsRest;
+
+    crcCheckSum = buf_getbits(hBitBuf, SI_SBR_CRC_BITS);
+
+
+    /*
+     *    Copy Bit buffer State
+     */
+
+    BitBufferCRC.char_ptr       = hBitBuf->char_ptr;
+    BitBufferCRC.buffer_word    = hBitBuf->buffer_word;
+    BitBufferCRC.buffered_bits  = hBitBuf->buffered_bits;
+    BitBufferCRC.nrBitsRead     = hBitBuf->nrBitsRead;
+    BitBufferCRC.bufferLen      = hBitBuf->bufferLen;
+
+
+    NrCrcBits = min(NrBits, BitBufferCRC.bufferLen - BitBufferCRC.nrBitsRead);
+
+
+    CrcStep = NrCrcBits / MAXCRCSTEP;
+    CrcNrBitsRest = (NrCrcBits - CrcStep * MAXCRCSTEP);
+
+    CrcBuf.crcState = CRCSTART;
+    CrcBuf.crcMask  = CRCMASK;
+    CrcBuf.crcPoly  = CRCPOLY;
+
+    for (i = 0; i < CrcStep; i++)
+    {
+        bValue = buf_getbits(&BitBufferCRC, MAXCRCSTEP);
+        check_crc(&CrcBuf, bValue, MAXCRCSTEP);
+    }
+
+    bValue = buf_getbits(&BitBufferCRC, CrcNrBitsRest);
+    check_crc(&CrcBuf, bValue, CrcNrBitsRest);
+
+    if ((UInt32)(CrcBuf.crcState & CRCRANGE) != crcCheckSum)
+    {
+        crcResult = 0;
+    }
+
+    return (crcResult);
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_crc_check.h b/media/libstagefright/codecs/aacdec/sbr_crc_check.h
new file mode 100644
index 0000000..9e6b1be
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_crc_check.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_crc_check.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_CRC_CHECK_H
+#define SBR_CRC_CHECK_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "s_bit_buffer.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define CRCPOLY  0x0233
+#define CRCMASK  0x0200
+#define CRCSTART 0x0000
+#define CRCRANGE 0x03FF
+
+#define SBR_EXTENSION      13 /* 1101 */
+#define SBR_EXTENSION_CRC  14 /* 1110 */
+
+
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+Int32 sbr_crc_check(BIT_BUFFER * hBitBuf,
+                    UInt32 NrBits);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.cpp b/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.cpp
new file mode 100644
index 0000000..9472ffc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_create_limiter_bands.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_create_limiter_bands.h"
+#include    "shellsort.h"
+#include    "s_patch.h"
+#include    "pv_log2.h"
+
+#include "fxp_mul32.h"
+
+#define R_SHIFT     29
+#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+
+/*----------------------------------------------------------------------------
+; 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 sbr_create_limiter_bands(Int32 limSbc[][13],
+                              Int32 *gateMode,
+                              Int   *freqTable,
+                              struct PATCH Patch,
+                              const Int32 noBands)
+{
+    Int32 i;
+    Int32 j;
+    Int32 k;
+    Int isPatchBorder[2];
+    Int32 patchBorders[MAX_NUM_PATCHES + 1];
+    Int32 workLimiterBandTable[32 + MAX_NUM_PATCHES + 1];
+
+    Int32 nOctaves;
+    const Int32 limiterBandsPerOctave[4] =
+        {Q_fmt(0.0F), Q_fmt(1.2F),
+         Q_fmt(2.0F), Q_fmt(3.0F)
+        };
+
+    Int32 tmp_q1;
+
+    Int32 noPatches = Patch.noOfPatches;
+    Int32 lowSubband = freqTable[0];
+    Int32 highSubband = freqTable[noBands];
+
+
+    for (i = 0; i < noPatches; i++)
+    {
+        patchBorders[i] = Patch.targetStartBand[i] - lowSubband;
+    }
+    patchBorders[i] = highSubband - lowSubband;
+
+    /* First band: 1 limiter band. */
+    limSbc[0][0] = freqTable[0] - lowSubband;
+    limSbc[0][1] = freqTable[noBands] - lowSubband;
+    gateMode[0] = 1;
+
+    /* Next three bands: 1.2, 2, 3 limiter bands/octave plus bandborders at patchborders. */
+    for (i = 1; i < 4; i++)
+    {
+
+        for (k = 0; k <= noBands; k++)
+        {
+            workLimiterBandTable[k] = freqTable[k] - lowSubband;
+        }
+
+        for (k = 1; k < noPatches; k++)
+        {
+            workLimiterBandTable[noBands+k] = patchBorders[k];
+        }
+
+        gateMode[i] = noBands + noPatches - 1;
+        shellsort(workLimiterBandTable, gateMode[i] + 1);
+
+        for (j = 1; j <= gateMode[i]; j++)
+        {
+            tmp_q1 = ((workLimiterBandTable[j] + lowSubband) << 20) / (workLimiterBandTable[j-1] + lowSubband);
+
+            nOctaves = pv_log2(tmp_q1);
+
+            tmp_q1 = fxp_mul32_Q20(nOctaves, limiterBandsPerOctave[i]);
+            if (tmp_q1 < Q_fmt(0.49))
+            {
+                if (workLimiterBandTable[j] == workLimiterBandTable[j-1])
+                {
+                    workLimiterBandTable[j] = highSubband;
+                    shellsort(workLimiterBandTable, gateMode[i] + 1);
+                    gateMode[i]--;
+                    j--;
+                    continue;
+                }
+
+                isPatchBorder[0] = isPatchBorder[1] = 0;
+
+                for (k = 0; k <= noPatches; k++)
+                {
+                    if (workLimiterBandTable[j-1] == patchBorders[k])
+                    {
+                        isPatchBorder[0] = 1;
+                        break;
+                    }
+                }
+
+                for (k = 0; k <= noPatches; k++)
+                {
+                    if (workLimiterBandTable[j] == patchBorders[k])
+                    {
+                        isPatchBorder[1] = 1;
+                        break;
+                    }
+                }
+
+                if (!isPatchBorder[1])
+                {
+                    workLimiterBandTable[j] = highSubband;
+                    shellsort(workLimiterBandTable, gateMode[i] + 1);
+                    gateMode[i]--;
+                    j--;
+                }
+                else if (!isPatchBorder[0])
+                {
+                    workLimiterBandTable[j-1] = highSubband;
+                    shellsort(workLimiterBandTable, gateMode[i] + 1);
+                    gateMode[i]--;
+                    j--;
+                }
+            }
+        }
+        for (k = 0; k <= gateMode[i]; k++)
+        {
+            limSbc[i][k] = workLimiterBandTable[k];
+        }
+    }
+}
+
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.h b/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.h
new file mode 100644
index 0000000..7a53944
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_create_limiter_bands.h
@@ -0,0 +1,95 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_create_limiter_bands.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_CREATE_LIMITER_BANDS_H
+#define SBR_CREATE_LIMITER_BANDS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "sbr_generate_high_freq.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void sbr_create_limiter_bands(Int32 limSbc[4][12 + 1],
+    Int32 gateMode[4],
+    Int   *freqTable,
+    struct PATCH Patch,
+    const Int32 noBands);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_dec.cpp b/media/libstagefright/codecs/aacdec/sbr_dec.cpp
new file mode 100644
index 0000000..8fcc3ce
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_dec.cpp
@@ -0,0 +1,942 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_dec.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    sbr decoder core function
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+#include    "s_sbr_frame_data.h"
+#include    "calc_sbr_synfilterbank.h"
+#include    "calc_sbr_anafilterbank.h"
+#include    "calc_sbr_envelope.h"
+#include    "sbr_generate_high_freq.h"
+#include    "sbr_dec.h"
+#include    "decode_noise_floorlevels.h"
+#include    "aac_mem_funcs.h"
+#include    "fxp_mul32.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
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+#ifdef PARAMETRICSTEREO
+
+#include   "ps_applied.h"
+#include   "ps_init_stereo_mixing.h"
+
+#endif
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void sbr_dec(Int16 *inPcmData,
+             Int16 *ftimeOutPtr,
+             SBR_FRAME_DATA * hFrameData,
+             int32_t applyProcessing,
+             SBR_DEC *sbrDec,
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+             Int16 * ftimeOutPtrPS,
+             HANDLE_PS_DEC hParametricStereoDec,
+#endif
+#endif
+             tDec_Int_File  *pVars)
+{
+    int32_t   i;
+    int32_t   j;
+    int32_t   m;
+
+    int32_t  *frameInfo = hFrameData->frameInfo;
+    Int  num_qmf_bands;
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+
+    int32_t env;
+
+    int32_t *qmf_PS_generated_Real;
+    int32_t *qmf_PS_generated_Imag;
+
+    int32_t *Sr_x;
+    int32_t *Si_x;
+
+
+#endif
+#endif
+
+    int32_t(*scratch_mem)[64];
+    Int16 *circular_buffer_s;
+
+    int32_t   k;
+    int32_t *Sr;
+    int32_t *Si;
+    int32_t *ptr_tmp1;
+    int32_t *ptr_tmp2;
+    scratch_mem = pVars->scratch.scratch_mem;
+
+
+    if (applyProcessing)
+    {
+        num_qmf_bands = sbrDec->lowSubband;
+    }
+    else
+    {
+        num_qmf_bands = 32;     /* becomes a resampler by 2  */
+    }
+
+    /* -------------------------------------------------- */
+    /*
+     *    Re-Load Buffers
+     */
+    pv_memmove(&hFrameData->sbrQmfBufferReal[0],
+               &hFrameData->HistsbrQmfBufferReal[0],
+               6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+#ifdef HQ_SBR
+
+
+    if (sbrDec->LC_aacP_DecoderFlag == OFF)
+    {
+        pv_memmove(&hFrameData->sbrQmfBufferImag[0],
+                   &hFrameData->HistsbrQmfBufferImag[0],
+                   6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+    }
+#endif
+    /* -------------------------------------------------- */
+
+
+    /*
+     *    low band codec signal subband filtering
+     */
+
+    for (i = 0; i < 32; i++)
+    {
+
+        if (sbrDec->LC_aacP_DecoderFlag == ON)
+        {
+
+            calc_sbr_anafilterbank_LC(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i],
+                                      &inPcmData[319] + (i << 5),
+                                      scratch_mem,
+                                      num_qmf_bands);
+
+        }
+#ifdef HQ_SBR
+        else
+        {
+
+            calc_sbr_anafilterbank(hFrameData->codecQmfBufferReal[sbrDec->bufWriteOffs + i],
+                                   hFrameData->codecQmfBufferImag[sbrDec->bufWriteOffs + i],
+                                   &inPcmData[319] + (i << 5),
+                                   scratch_mem,
+                                   num_qmf_bands);
+        }
+#endif
+
+    }
+
+    if (pVars->ltp_buffer_state)
+    {
+        pv_memcpy(&inPcmData[-1024-288], &inPcmData[1024], 288*sizeof(*inPcmData));
+    }
+    else
+    {
+        pv_memcpy(&inPcmData[1024 + 288], &inPcmData[1024], 288*sizeof(*inPcmData));
+    }
+
+
+    if (applyProcessing)
+    {
+
+        /*
+         *  Inverse filtering of lowband + HF generation
+         */
+
+        if (sbrDec->LC_aacP_DecoderFlag == ON)
+        {
+
+            sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs),
+                                   NULL,
+                                   (int32_t *)(hFrameData->sbrQmfBufferReal),
+                                   NULL,
+                                   hFrameData->sbr_invf_mode,
+                                   hFrameData->sbr_invf_mode_prev,
+                                   &(sbrDec->FreqBandTableNoise[1]),
+                                   sbrDec->NoNoiseBands,
+                                   sbrDec->lowSubband,
+                                   sbrDec->V_k_master,
+                                   sbrDec->Num_Master,
+                                   sbrDec->outSampleRate,
+                                   frameInfo,
+                                   hFrameData->degreeAlias,
+                                   scratch_mem,
+                                   hFrameData->BwVector,/* */
+                                   hFrameData->BwVectorOld,
+                                   &(sbrDec->Patch),
+                                   sbrDec->LC_aacP_DecoderFlag,
+                                   &(sbrDec->highSubband));
+
+
+            /*
+             *      Adjust envelope of current frame.
+             */
+
+            calc_sbr_envelope(hFrameData,
+                              (int32_t *)(hFrameData->sbrQmfBufferReal),
+                              NULL,
+                              sbrDec->FreqBandTable,
+                              sbrDec->NSfb,
+                              sbrDec->FreqBandTableNoise,
+                              sbrDec->NoNoiseBands,
+                              hFrameData->reset_flag,
+                              hFrameData->degreeAlias,
+                              &(hFrameData->harm_index),
+                              &(hFrameData->phase_index),
+                              hFrameData->hFp,
+                              &(hFrameData->sUp),
+                              sbrDec->limSbc,
+                              sbrDec->gateMode,
+#ifdef HQ_SBR
+                              NULL,
+                              NULL,
+                              NULL,
+                              NULL,
+#endif
+                              scratch_mem,
+                              sbrDec->Patch,
+                              sbrDec->sqrt_cache,
+                              sbrDec->LC_aacP_DecoderFlag);
+        }
+#ifdef HQ_SBR
+        else
+        {
+
+            sbr_generate_high_freq((int32_t(*)[32])(hFrameData->codecQmfBufferReal + sbrDec->bufReadOffs),
+                                   (int32_t(*)[32])(hFrameData->codecQmfBufferImag + sbrDec->bufReadOffs),
+                                   (int32_t *)(hFrameData->sbrQmfBufferReal),
+                                   (int32_t *)(hFrameData->sbrQmfBufferImag),
+                                   hFrameData->sbr_invf_mode,
+                                   hFrameData->sbr_invf_mode_prev,
+                                   &(sbrDec->FreqBandTableNoise[1]),
+                                   sbrDec->NoNoiseBands,
+                                   sbrDec->lowSubband,
+                                   sbrDec->V_k_master,
+                                   sbrDec->Num_Master,
+                                   sbrDec->outSampleRate,
+                                   frameInfo,
+                                   NULL,
+                                   scratch_mem,
+                                   hFrameData->BwVector,
+                                   hFrameData->BwVectorOld,
+                                   &(sbrDec->Patch),
+                                   sbrDec->LC_aacP_DecoderFlag,
+                                   &(sbrDec->highSubband));
+
+            /*
+             *      Adjust envelope of current frame.
+             */
+
+            calc_sbr_envelope(hFrameData,
+                              (int32_t *)(hFrameData->sbrQmfBufferReal),
+                              (int32_t *)(hFrameData->sbrQmfBufferImag),
+                              sbrDec->FreqBandTable,
+                              sbrDec->NSfb,
+                              sbrDec->FreqBandTableNoise,
+                              sbrDec->NoNoiseBands,
+                              hFrameData->reset_flag,
+                              NULL,
+                              &(hFrameData->harm_index),
+                              &(hFrameData->phase_index),
+                              hFrameData->hFp,
+                              &(hFrameData->sUp),
+                              sbrDec->limSbc,
+                              sbrDec->gateMode,
+                              hFrameData->fBuf_man,
+                              hFrameData->fBuf_exp,
+                              hFrameData->fBufN_man,
+                              hFrameData->fBufN_exp,
+                              scratch_mem,
+                              sbrDec->Patch,
+                              sbrDec->sqrt_cache,
+                              sbrDec->LC_aacP_DecoderFlag);
+
+        }
+#endif
+
+
+    }
+    else   /*  else for applyProcessing */
+    {
+        /* no sbr, set high band buffers to zero */
+
+        for (i = 0; i < SBR_NUM_COLUMNS; i++)
+        {
+            pv_memset((void *)&hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS],
+                      0,
+                      SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+#ifdef HQ_SBR
+            pv_memset((void *)&hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS],
+                      0,
+                      SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+
+#endif
+        }
+
+    }
+
+
+    /*
+     *  Synthesis subband filtering.
+     */
+
+#ifdef HQ_SBR
+
+#ifdef PARAMETRICSTEREO
+
+
+    /*
+     * psPresentFlag set implies hParametricStereoDec !=NULL, second condition is
+     * is just here to prevent CodeSonar warnings.
+     */
+    if ((pVars->mc_info.psPresentFlag) && (applyProcessing) &&
+            (hParametricStereoDec != NULL))
+    {
+
+        /*
+         *  qmfBufferReal uses the rigth aac channel ( perChan[1] is not used)
+         *  followed by the buffer fxpCoef[2][2048]  which makes a total of
+         *  2349 + 2048*2 = 6445
+         *  These  2 matrices (qmfBufferReal & qmfBufferImag) are
+         *  [2][38][64] == 4864 int32_t
+         */
+
+
+        tDec_Int_Chan *tmpx = &pVars->perChan[1];
+        /*
+         *  dereferencing type-punned pointer avoid
+         *  breaking strict-aliasing rules
+         */
+        int32_t *tmp = (int32_t *)tmpx;
+        hParametricStereoDec->qmfBufferReal = (int32_t(*)[64]) tmp;
+
+        tmp = (int32_t *) & hParametricStereoDec->qmfBufferReal[38][0];
+        hParametricStereoDec->qmfBufferImag = (int32_t(*)[64]) tmp;
+
+        for (i = 0; i < 32; i++)
+        {
+            Int   xoverBand;
+
+            if (i < ((hFrameData->frameInfo[1]) << 1))
+            {
+                xoverBand = sbrDec->prevLowSubband;
+            }
+            else
+            {
+                xoverBand = sbrDec->lowSubband;
+            }
+
+            if (xoverBand > sbrDec->highSubband)
+            {
+                xoverBand = 32; /* error condition, default to upsampling mode */
+            }
+
+            m = sbrDec->bufReadOffs + i;    /*  2 + i */
+
+            Sr_x = hParametricStereoDec->qmfBufferReal[i];
+            Si_x = hParametricStereoDec->qmfBufferImag[i];
+
+
+
+            for (int32_t j = 0; j < xoverBand; j++)
+            {
+                Sr_x[j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]);
+                Si_x[j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]);
+            }
+
+
+
+
+            pv_memcpy(&Sr_x[xoverBand],
+                      &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS],
+                      (sbrDec->highSubband - xoverBand)*sizeof(*Sr_x));
+
+            pv_memcpy(&Si_x[xoverBand],
+                      &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS],
+                      (sbrDec->highSubband - xoverBand)*sizeof(*Si_x));
+
+            pv_memset((void *)&Sr_x[sbrDec->highSubband],
+                      0,
+                      (64 - sbrDec->highSubband)*sizeof(*Sr_x));
+
+            pv_memset((void *)&Si_x[sbrDec->highSubband],
+                      0,
+                      (64 - sbrDec->highSubband)*sizeof(*Si_x));
+
+
+        }
+
+        for (i = 32; i < 32 + 6; i++)
+        {
+            m = sbrDec->bufReadOffs + i;     /*  2 + i */
+
+            for (int32_t j = 0; j < 5; j++)
+            {
+                hParametricStereoDec->qmfBufferReal[i][j] = shft_lft_1(hFrameData->codecQmfBufferReal[m][j]);
+                hParametricStereoDec->qmfBufferImag[i][j] = shft_lft_1(hFrameData->codecQmfBufferImag[m][j]);
+            }
+
+        }
+
+
+        /*
+         *    Update Buffers
+         */
+        for (i = 0; i < sbrDec->bufWriteOffs; i++)     /* sbrDec->bufWriteOffs set to 8 and unchanged */
+        {
+            j = sbrDec->noCols + i;                    /* sbrDec->noCols set to 32 and unchanged */
+
+            pv_memmove(hFrameData->codecQmfBufferReal[i],         /* to    */
+                       hFrameData->codecQmfBufferReal[j],        /* from  */
+                       sizeof(*hFrameData->codecQmfBufferReal[i]) << 5);
+
+            pv_memmove(hFrameData->codecQmfBufferImag[i],
+                       hFrameData->codecQmfBufferImag[j],
+                       sizeof(*hFrameData->codecQmfBufferImag[i]) << 5);
+        }
+
+
+        pv_memmove(&hFrameData->HistsbrQmfBufferReal[0],
+                   &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS],
+                   6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+        pv_memmove(&hFrameData->HistsbrQmfBufferImag[0],
+                   &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS],
+                   6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+
+
+        /*
+         *   Needs whole QMF matrix formed before applying
+         *   Parametric stereo processing.
+         */
+
+        qmf_PS_generated_Real = scratch_mem[0];
+        qmf_PS_generated_Imag = scratch_mem[1];
+        env = 0;
+
+        /*
+         *  Set circular buffer for Left channel
+         */
+
+        circular_buffer_s = (Int16 *)scratch_mem[7];
+
+
+        if (pVars->mc_info.bDownSampledSbr)
+        {
+            pv_memmove(&circular_buffer_s[2048],
+                       hFrameData->V,
+                       640*sizeof(*circular_buffer_s));
+        }
+        else
+        {
+            pv_memmove(&circular_buffer_s[4096],
+                       hFrameData->V,
+                       1152*sizeof(*circular_buffer_s));
+
+        }
+
+
+        /*
+         *  Set Circular buffer for PS hybrid analysis
+         */
+        for (i = 0, j = 0; i < 3; i++)
+        {
+
+            pv_memmove(&scratch_mem[2][32 + j     ],
+                       hParametricStereoDec->hHybrid->mQmfBufferReal[i],
+                       HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal));
+            pv_memmove(&scratch_mem[2][32 + j + 44],
+                       hParametricStereoDec->hHybrid->mQmfBufferImag[i],
+                       HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag));
+            j += 88;
+        }
+
+        pv_memset((void *)&qmf_PS_generated_Real[hParametricStereoDec->usb],
+                  0,
+                  (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Real));
+
+        pv_memset((void *)&qmf_PS_generated_Imag[hParametricStereoDec->usb],
+                  0,
+                  (64 - hParametricStereoDec->usb)*sizeof(*qmf_PS_generated_Imag));
+
+
+        for (i = 0; i < 32; i++)
+        {
+            if (i == (Int)hParametricStereoDec-> aEnvStartStop[env])
+            {
+                ps_init_stereo_mixing(hParametricStereoDec, env, sbrDec->highSubband);
+                env++;
+            }
+
+
+            ps_applied(hParametricStereoDec,
+                       &hParametricStereoDec->qmfBufferReal[i],
+                       &hParametricStereoDec->qmfBufferImag[i],
+                       qmf_PS_generated_Real,
+                       qmf_PS_generated_Imag,
+                       scratch_mem[2],
+                       i);
+
+            /* Create time samples for regular mono channel */
+
+            if (pVars->mc_info.bDownSampledSbr)
+            {
+                calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i],  /* realSamples  */
+                                       hParametricStereoDec->qmfBufferImag[i], /* imagSamples  */
+                                       ftimeOutPtr + (i << 6),
+                                       &circular_buffer_s[1984 - (i<<6)],
+                                       pVars->mc_info.bDownSampledSbr);
+            }
+            else
+            {
+                calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i],  /* realSamples  */
+                                       hParametricStereoDec->qmfBufferImag[i], /* imagSamples  */
+                                       ftimeOutPtr + (i << 7),
+                                       &circular_buffer_s[3968 - (i<<7)],
+                                       pVars->mc_info.bDownSampledSbr);
+
+            }
+
+            pv_memmove(hParametricStereoDec->qmfBufferReal[i], qmf_PS_generated_Real, 64*sizeof(*qmf_PS_generated_Real));
+            pv_memmove(hParametricStereoDec->qmfBufferImag[i], qmf_PS_generated_Imag, 64*sizeof(*qmf_PS_generated_Real));
+
+        }
+
+
+        /*
+         *  Save Circular buffer history used on PS hybrid analysis
+         */
+
+        for (i = 0, j = 0; i < 3; i++)
+        {
+            pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferReal[i],
+                       &scratch_mem[2][ 64 + j     ],
+                       HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferReal));
+
+            pv_memmove(hParametricStereoDec->hHybrid->mQmfBufferImag[i],
+                       &scratch_mem[2][ 64 + j + 44],
+                       HYBRID_FILTER_LENGTH_m_1*sizeof(*hParametricStereoDec->hHybrid->mQmfBufferImag));
+
+            j += 88;
+        }
+
+        pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+
+        /*
+         *  Set circular buffer for Right channel
+         */
+
+        circular_buffer_s = (Int16 *)scratch_mem[5];
+
+        if (pVars->mc_info.bDownSampledSbr)
+        {
+            pv_memmove(&circular_buffer_s[2048],
+                       (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history,
+                       640*sizeof(*circular_buffer_s));
+        }
+        else
+        {
+            pv_memmove(&circular_buffer_s[4096],
+                       (int32_t *)hParametricStereoDec->R_ch_qmf_filter_history,
+                       1152*sizeof(*circular_buffer_s));
+
+        }
+
+
+        for (i = 0; i < 32; i++)
+        {
+            if (pVars->mc_info.bDownSampledSbr)
+            {
+
+                calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i],  /* realSamples  */
+                                       hParametricStereoDec->qmfBufferImag[i], /* imagSamples  */
+                                       ftimeOutPtrPS + (i << 6),
+                                       &circular_buffer_s[1984 - (i<<6)],
+                                       pVars->mc_info.bDownSampledSbr);
+            }
+            else
+            {
+                calc_sbr_synfilterbank(hParametricStereoDec->qmfBufferReal[i],  /* realSamples  */
+                                       hParametricStereoDec->qmfBufferImag[i], /* imagSamples  */
+                                       ftimeOutPtrPS + (i << 7),
+                                       &circular_buffer_s[3968 - (i<<7)],
+                                       pVars->mc_info.bDownSampledSbr);
+            }
+
+        }
+
+        if (pVars->mc_info.bDownSampledSbr)
+        {
+            pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s));
+        }
+        else
+        {
+            pv_memmove((int32_t *)hParametricStereoDec->R_ch_qmf_filter_history, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+        }
+
+
+
+
+
+    }
+    else    /*  else -- sbrEnablePS  */
+    {
+
+#endif      /*   PARAMETRICSTEREO */
+#endif      /*   HQ_SBR */
+
+        /*
+         *  Use shared aac memory as continuous buffer
+         */
+
+
+        Sr  = scratch_mem[0];
+        Si  = scratch_mem[1];
+
+        circular_buffer_s = (Int16*)scratch_mem[2];
+
+        if (pVars->mc_info.bDownSampledSbr)
+        {
+
+            pv_memmove(&circular_buffer_s[2048],
+                       hFrameData->V,
+                       640*sizeof(*circular_buffer_s));
+        }
+        else
+        {
+            pv_memmove(&circular_buffer_s[4096],
+                       hFrameData->V,
+                       1152*sizeof(*circular_buffer_s));
+        }
+
+        for (i = 0; i < 32; i++)
+        {
+            Int   xoverBand;
+
+            if (applyProcessing)
+            {
+                if (i < ((hFrameData->frameInfo[1]) << 1))
+                {
+                    xoverBand = sbrDec->prevLowSubband;
+
+                }
+                else
+                {
+                    xoverBand = sbrDec->lowSubband;
+                }
+
+                if (xoverBand > sbrDec->highSubband)
+                {
+                    xoverBand = 32; /* error condition, default to upsampling mode */
+                }
+            }
+            else
+            {
+                xoverBand = 32;
+                sbrDec->highSubband = 32;
+            }
+
+
+            m = sbrDec->bufReadOffs + i;    /* sbrDec->bufReadOffs == 2 */
+
+
+            ptr_tmp1 = (hFrameData->codecQmfBufferReal[m]);
+            ptr_tmp2 = Sr;
+
+            if (sbrDec->LC_aacP_DecoderFlag == ON)
+            {
+
+                for (k = (xoverBand >> 1); k != 0; k--)
+                {
+                    *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9;
+                    *(ptr_tmp2++) = (*(ptr_tmp1++)) >> 9;
+                }
+                if (xoverBand & 1)
+                {
+                    *(ptr_tmp2++) = (*(ptr_tmp1)) >> 9;
+                }
+
+                ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS];
+
+
+                for (k = xoverBand; k < sbrDec->highSubband; k++)
+                {
+                    *(ptr_tmp2++) = (*(ptr_tmp1++)) << 1;
+                }
+
+                pv_memset((void *)ptr_tmp2,
+                          0,
+                          (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+                if (pVars->mc_info.bDownSampledSbr)
+                {
+                    calc_sbr_synfilterbank_LC(Sr,               /* realSamples  */
+                                              ftimeOutPtr + (i << 6),
+                                              &circular_buffer_s[1984 - (i<<6)],
+                                              pVars->mc_info.bDownSampledSbr);
+                }
+                else
+                {
+                    calc_sbr_synfilterbank_LC(Sr,               /* realSamples  */
+                                              ftimeOutPtr + (i << 7),
+                                              &circular_buffer_s[3968 - (i<<7)],
+                                              pVars->mc_info.bDownSampledSbr);
+                }
+            }
+#ifdef HQ_SBR
+            else
+            {
+
+                for (k = xoverBand; k != 0; k--)
+                {
+                    *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+                }
+
+                ptr_tmp1 = &hFrameData->sbrQmfBufferReal[i*SBR_NUM_BANDS];
+                ptr_tmp2 = &Sr[xoverBand];
+
+
+                for (k = xoverBand; k < sbrDec->highSubband; k++)
+                {
+                    *(ptr_tmp2++) = (*(ptr_tmp1++));
+                }
+
+                pv_memset((void *)ptr_tmp2,
+                          0,
+                          (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+                ptr_tmp1 = (hFrameData->codecQmfBufferImag[m]);
+                ptr_tmp2 = Si;
+
+                for (k = (xoverBand >> 1); k != 0; k--)
+                {
+                    *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+                    *(ptr_tmp2++) = shft_lft_1(*(ptr_tmp1++));
+                }
+                if (xoverBand & 1)
+                {
+                    *(ptr_tmp2) = shft_lft_1(*(ptr_tmp1));
+                }
+
+                ptr_tmp1 = &hFrameData->sbrQmfBufferImag[i*SBR_NUM_BANDS];
+                ptr_tmp2 = &Si[xoverBand];
+
+                for (k = xoverBand; k < sbrDec->highSubband; k++)
+                {
+                    *(ptr_tmp2++) = (*(ptr_tmp1++));
+                }
+
+                pv_memset((void *)ptr_tmp2,
+                          0,
+                          (64 - sbrDec->highSubband)*sizeof(*ptr_tmp2));
+
+
+                if (pVars->mc_info.bDownSampledSbr)
+                {
+                    calc_sbr_synfilterbank(Sr,              /* realSamples  */
+                                           Si,             /* imagSamples  */
+                                           ftimeOutPtr + (i << 6),
+                                           &circular_buffer_s[1984 - (i<<6)],
+                                           pVars->mc_info.bDownSampledSbr);
+                }
+                else
+                {
+                    calc_sbr_synfilterbank(Sr,              /* realSamples  */
+                                           Si,             /* imagSamples  */
+                                           ftimeOutPtr + (i << 7),
+                                           &circular_buffer_s[3968 - (i<<7)],
+                                           pVars->mc_info.bDownSampledSbr);
+                }
+            }
+#endif
+
+        }
+
+        if (pVars->mc_info.bDownSampledSbr)
+        {
+            pv_memmove(hFrameData->V, &circular_buffer_s[0], 640*sizeof(*circular_buffer_s));
+        }
+        else
+        {
+            pv_memmove(hFrameData->V, &circular_buffer_s[0], 1152*sizeof(*circular_buffer_s));
+        }
+
+
+
+
+        /*
+         *    Update Buffers
+         */
+        for (i = 0; i < sbrDec->bufWriteOffs; i++)     /* sbrDec->bufWriteOffs set to 8 and unchanged */
+        {
+            j = sbrDec->noCols + i;                    /* sbrDec->noCols set to 32 and unchanged */
+
+            pv_memmove(hFrameData->codecQmfBufferReal[i],         /* to    */
+                       hFrameData->codecQmfBufferReal[j],        /* from  */
+                       sizeof(*hFrameData->codecQmfBufferReal[i]) << 5);
+        }
+
+
+        pv_memmove(&hFrameData->HistsbrQmfBufferReal[0],
+                   &hFrameData->sbrQmfBufferReal[32*SBR_NUM_BANDS],
+                   6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferReal));
+
+#ifdef HQ_SBR
+        if (sbrDec->LC_aacP_DecoderFlag == OFF)
+        {
+            for (i = 0; i < sbrDec->bufWriteOffs; i++)     /* sbrDec->bufWriteOffs set to 6 and unchanged */
+            {
+                j = sbrDec->noCols + i;                    /* sbrDec->noCols set to 32 and unchanged */
+
+
+                pv_memmove(hFrameData->codecQmfBufferImag[i],
+                           hFrameData->codecQmfBufferImag[j],
+                           sizeof(*hFrameData->codecQmfBufferImag[i]) << 5);
+
+            }
+
+            pv_memmove(&hFrameData->HistsbrQmfBufferImag[0],
+                       &hFrameData->sbrQmfBufferImag[32*SBR_NUM_BANDS],
+                       6*SBR_NUM_BANDS*sizeof(*hFrameData->sbrQmfBufferImag));
+        }
+#endif
+
+
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+    }
+#endif
+#endif
+
+
+    hFrameData->reset_flag = 0;
+    if (applyProcessing)
+    {
+        sbrDec->prevLowSubband = sbrDec->lowSubband;
+    }
+
+}
+
+
+#endif      /*  AAC_PLUS */
diff --git a/media/libstagefright/codecs/aacdec/sbr_dec.h b/media/libstagefright/codecs/aacdec/sbr_dec.h
new file mode 100644
index 0000000..ba7c1f3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_dec.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_dec.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_DEC_H
+#define SBR_DEC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "s_sbr_frame_data.h"
+#include    "pv_audio_type_defs.h"
+#include    "s_patch.h"
+#include    "e_blockswitching.h"
+#include    "s_sbr_dec.h"
+#include    "s_tdec_int_file.h"
+#ifdef PARAMETRICSTEREO
+#include    "s_ps_dec.h"
+#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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+
+    void sbr_dec(Int16 *inPcmData,
+    Int16 *ftimeOutPtr,
+    SBR_FRAME_DATA * hFrameData,
+    Int32 applyProcessing,
+    SBR_DEC *sbrDec,
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+    Int16 * ftimeOutPtrPS,
+    HANDLE_PS_DEC hParametricStereoDec,
+#endif
+#endif
+    tDec_Int_File  *pVars);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_decode_envelope.cpp b/media/libstagefright/codecs/aacdec/sbr_decode_envelope.cpp
new file mode 100644
index 0000000..771bb32
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_decode_envelope.cpp
@@ -0,0 +1,286 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_decode_envelope.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_decode_envelope.h"
+#include    "sbr_constants.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
+----------------------------------------------------------------------------*/
+void mapLowResEnergyVal(
+    Int32  currVal,
+    Int32 *prevData,
+    Int32 offset,
+    Int32 index,
+    Int32 res);
+
+Int32 indexLow2High(Int32 offset,
+                    Int32 index,
+                    Int32 res);
+
+/*----------------------------------------------------------------------------
+; 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 sbr_decode_envelope(SBR_FRAME_DATA * hFrameData)
+
+{
+    Int32 i;
+    Int32 no_of_bands;
+    Int32 band;
+    Int32 freqRes;
+    Int32 *iEnvelope    = hFrameData->iEnvelope_man;
+    Int32 *sfb_nrg_prev = hFrameData->sfb_nrg_prev_man;
+
+    Int32  offset       = hFrameData->offset;
+    Int32 *nSfb         = hFrameData->nSfb;
+    Int32 *domain_vec   = hFrameData->domain_vec1;
+    Int32 *frameInfo    = hFrameData->frameInfo;
+
+
+
+    for (i = 0; i < frameInfo[0]; i++)
+    {
+        freqRes = frameInfo[frameInfo[0] + i + 2];
+        no_of_bands = nSfb[freqRes];
+
+        if (domain_vec[i] == 0)
+        {
+            mapLowResEnergyVal(*iEnvelope,
+                               sfb_nrg_prev,
+                               offset,
+                               0,
+                               freqRes);
+            iEnvelope++;
+
+            for (band = 1; band < no_of_bands; band++)
+            {
+                *iEnvelope +=  *(iEnvelope - 1);
+
+                mapLowResEnergyVal(*iEnvelope,
+                                   sfb_nrg_prev,
+                                   offset,
+                                   band,
+                                   freqRes);
+                iEnvelope++;
+            }
+        }
+        else
+        {
+            for (band = 0; band < no_of_bands; band++)
+            {
+                *iEnvelope +=  sfb_nrg_prev[ indexLow2High(offset, band, freqRes)];
+
+                mapLowResEnergyVal(*iEnvelope,
+                                   sfb_nrg_prev,
+                                   offset,
+                                   band,
+                                   freqRes);
+                iEnvelope++;
+            }
+        }
+    }
+}
+
+
+
+void mapLowResEnergyVal(
+    Int32  currVal,
+    Int32 *prevData,
+    Int32  offset,
+    Int32  index,
+    Int32  res)
+{
+    Int32 tmp;
+
+    if (res == LO)
+    {
+        if (offset >= 0)
+        {
+            if (index < offset)
+            {
+                prevData[index] = currVal;
+            }
+            else
+            {
+                tmp = (index << 1) - offset;
+                prevData[tmp    ] = currVal;
+                prevData[tmp +1 ] = currVal;
+            }
+        }
+        else
+        {
+            offset = -offset;
+            if (index < offset)
+            {
+                tmp = (index << 1) + index;
+                prevData[tmp    ] = currVal;
+                prevData[tmp + 1] = currVal;
+                prevData[tmp + 2] = currVal;
+            }
+            else
+            {
+                tmp = (index << 1) + offset;
+                prevData[tmp    ] = currVal;
+                prevData[tmp + 1] = currVal;
+            }
+        }
+    }
+    else
+    {
+        prevData[index] = currVal;
+    }
+}
+
+
+Int32 indexLow2High(Int32 offset,
+                    Int32 index,
+                    Int32 res)
+{
+    if (res == LO)
+    {
+        if (offset >= 0)
+        {
+            if (index < offset)
+            {
+                return(index);
+            }
+            else
+            {
+                return((index << 1) - offset);
+            }
+        }
+        else
+        {
+            offset = -offset;
+            if (index < offset)
+            {
+                return((index << 1) + index);
+            }
+            else
+            {
+                return((index << 1) + offset);
+            }
+        }
+    }
+    else
+    {
+        return(index);
+    }
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_decode_envelope.h b/media/libstagefright/codecs/aacdec/sbr_decode_envelope.h
new file mode 100644
index 0000000..19c04a9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_decode_envelope.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_decode_envelope.h
+ Funtions:
+    decodeEnvelope
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_DECODE_ENVELOPE_H
+#define SBR_DECODE_ENVELOPE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void sbr_decode_envelope(SBR_FRAME_DATA * hFrameData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.cpp b/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.cpp
new file mode 100644
index 0000000..290fd18
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.cpp
@@ -0,0 +1,149 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_decode_huff_cw.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+        SbrHuffman          h,     pointer to huffman codebook table
+        BIT_BUFFER    * hBitBuf    pointer  to Bitbuffer
+
+    return    decoded value
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Decodes one huffman code word
+
+  Reads bits from the bitstream until a valid codeword is found.
+  The table entries are interpreted either as index to the next entry
+  or - if negative - as the codeword.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_decode_huff_cw.h"
+#include    "buf_getbits.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
+----------------------------------------------------------------------------*/
+
+Int32 sbr_decode_huff_cw(SbrHuffman h,
+                         BIT_BUFFER * hBitBuf)
+{
+    Int32 bits;
+    Char index = 0;
+
+    while (index >= 0)
+    {
+        bits = buf_get_1bit(hBitBuf);
+        index = h[index][bits];
+    }
+
+    return((Int32)index + 64); /* Add offset */
+}
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.h b/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.h
new file mode 100644
index 0000000..bfbdb67
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_decode_huff_cw.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_decode_huff_cw.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_DECODE_HUFF_CW_H
+#define SBR_DECODE_HUFF_CW_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_huffman.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int32 sbr_decode_huff_cw(SbrHuffman h,
+    BIT_BUFFER * hBitBuf);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.cpp b/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.cpp
new file mode 100644
index 0000000..c2b007a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.cpp
@@ -0,0 +1,162 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_downsample_lo_res.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_downsample_lo_res.h"
+#include    "sbr_constants.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  sbr_downsample_lo_res(Int32 v_result[],
+                            Int32 num_result,
+                            Int   freqBandTableRef[],
+                            Int32 num_Ref)
+{
+    Int32 step;
+    Int32 i, j;
+    Int32 org_length;
+    Int32 result_length;
+    Int32 v_index[MAX_FREQ_COEFFS/2];
+
+    /* init */
+    org_length = num_Ref;
+    result_length = num_result;
+
+    v_index[0] = 0; /* Always use left border */
+    i = 0;
+    while (org_length > 0)  /* Create downsample vector */
+    {
+        i++;
+        step = org_length / result_length; /* floor; */
+        org_length = org_length - step;
+        result_length--;
+        v_index[i] = v_index[i-1] + step;
+    }
+
+    for (j = 0; j <= i; j++)   /* Use downsample vector to index LoResolution vector. */
+    {
+        v_result[j] = freqBandTableRef[ v_index[j]];
+    }
+
+}  /* End downSampleLoRes */
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.h b/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.h
new file mode 100644
index 0000000..2f49aea
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_downsample_lo_res.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_downsample_lo_res.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_DOWNSAMPLE_LO_RES_H
+#define SBR_DOWNSAMPLE_LO_RES_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void  sbr_downsample_lo_res(Int32 v_result[],
+    Int32 num_result,
+    Int   freqBandTableRef[],
+    Int32 num_Ref);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.cpp b/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.cpp
new file mode 100644
index 0000000..2ed76dd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.cpp
@@ -0,0 +1,424 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_envelope_calc_tbl.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_envelope_calc_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 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
+----------------------------------------------------------------------------*/
+#define Q30_fmt(x)   (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F))
+#define Qfmt15(x)    (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+
+const Int32 limGains[5] = { Q30_fmt(0.70795f), Q30_fmt(1.0f),
+                            Q30_fmt(1.41254f), Q30_fmt(1.16415321826935f), 33
+                          };
+
+const Int32 smoothLengths[2] = { 4, 0 };
+
+const Int16 rP_LCx[512] =
+{
+    Qfmt15(-0.99948153278296f), Qfmt15(0.97113454393991f), Qfmt15(0.14130051758487f), Qfmt15(-0.47005496701697f),
+    Qfmt15(0.80705063769351f), Qfmt15(-0.38981478896926f), Qfmt15(-0.01053049862020f), Qfmt15(-0.91266367957293f),
+    Qfmt15(0.54840422910309f), Qfmt15(0.40009252867955f), Qfmt15(-0.99867974711855f), Qfmt15(-0.95531076805040f),
+    Qfmt15(-0.45725933317144f), Qfmt15(-0.72929675029275f), Qfmt15(0.75622801399036f), Qfmt15(0.07069442601050f),
+    Qfmt15(0.74496252926055f), Qfmt15(-0.96440182703856f), Qfmt15(0.30424629369539f), Qfmt15(0.66565033746925f),
+    Qfmt15(0.91697008020594f), Qfmt15(-0.70774918760427f), Qfmt15(-0.70051415345560f), Qfmt15(-0.99496513054797f),
+    Qfmt15(0.98164490790123f), Qfmt15(-0.54671580548181f), Qfmt15(-0.01689629065389f), Qfmt15(-0.86110349531986f),
+    Qfmt15(-0.98892980586032f), Qfmt15(0.51756627678691f), Qfmt15(-0.99635026409640f), Qfmt15(-0.99969370862163f),
+    Qfmt15(0.55266258627194f), Qfmt15(0.34581177741673f), Qfmt15(0.62664209577999f), Qfmt15(-0.77149701404973f),
+    Qfmt15(-0.91592244254432f), Qfmt15(-0.76285492357887f), Qfmt15(0.79788337195331f), Qfmt15(0.54473080610200f),
+    Qfmt15(-0.85639281671058f), Qfmt15(-0.92882402971423f), Qfmt15(-0.11708371046774f), Qfmt15(0.21356749817493f),
+    Qfmt15(-0.76191692573909f), Qfmt15(0.98111043100884f), Qfmt15(-0.85913269895572f), Qfmt15(-0.93307242253692f),
+    Qfmt15(0.30485754879632f), Qfmt15(0.85289650925190f), Qfmt15(0.91328082618125f), Qfmt15(-0.05890199924154f),
+    Qfmt15(0.28398686150148f), Qfmt15(0.95258164539612f), Qfmt15(-0.78566324168507f), Qfmt15(-0.95789495447877f),
+    Qfmt15(0.82411158711197f), Qfmt15(-0.65185446735885f), Qfmt15(-0.93643603134666f), Qfmt15(0.91427159529618f),
+    Qfmt15(-0.70395684036886f), Qfmt15(0.00563771969365f), Qfmt15(0.89065051931895f), Qfmt15(-0.68683707712762f),
+    Qfmt15(0.72165342518718f), Qfmt15(-0.62928247730667f), Qfmt15(0.29938434065514f), Qfmt15(-0.91781958879280f),
+    Qfmt15(0.99298717043688f), Qfmt15(0.82368298622748f), Qfmt15(-0.98512833386833f), Qfmt15(-0.95915368242257f),
+    Qfmt15(-0.21411126572790f), Qfmt15(-0.68821476106884f), Qfmt15(0.91851997982317f), Qfmt15(-0.96062769559127f),
+    Qfmt15(0.51646184922287f), Qfmt15(0.61130721139669f), Qfmt15(0.47336129371299f), Qfmt15(0.90998308703519f),
+    Qfmt15(0.44844799194357f), Qfmt15(0.66614891079092f), Qfmt15(0.74922239129237f), Qfmt15(-0.99571588506485f),
+    Qfmt15(0.97401082477563f), Qfmt15(0.72683747733879f), Qfmt15(0.95432193457128f), Qfmt15(-0.72962208425191f),
+    Qfmt15(-0.85359479233537f), Qfmt15(-0.81412430338535f), Qfmt15(-0.87930772356786f), Qfmt15(-0.71573331064977f),
+    Qfmt15(0.83524300028228f), Qfmt15(-0.48086065601423f), Qfmt15(0.97139128574778f), Qfmt15(0.51992825347895f),
+    Qfmt15(-0.00848591195325f), Qfmt15(-0.70294374303036f), Qfmt15(-0.95894428168140f), Qfmt15(0.97079252950321f),
+    Qfmt15(-0.92404293670797f), Qfmt15(-0.69506469500450f), Qfmt15(0.26559203620024f), Qfmt15(0.28038443336943f),
+    Qfmt15(-0.74138124825523f), Qfmt15(-0.01752795995444f), Qfmt15(-0.55126773094930f), Qfmt15(0.97960898850996f),
+    Qfmt15(-0.99196309146936f), Qfmt15(-0.67684928085260f), Qfmt15(0.09140039465500f), Qfmt15(-0.71658965751996f),
+    Qfmt15(0.81014640078925f), Qfmt15(0.40616991671205f), Qfmt15(-0.67680188682972f), Qfmt15(0.86849774348749f),
+    Qfmt15(-0.99500381284851f), Qfmt15(0.84329189340667f), Qfmt15(-0.09215968531446f), Qfmt15(0.99956173327206f),
+    Qfmt15(-0.79732779473535f), Qfmt15(0.96349973642406f), Qfmt15(-0.79942778496547f), Qfmt15(-0.11566039853896f),
+    Qfmt15(-0.39922954514662f), Qfmt15(0.99089197565987f), Qfmt15(0.28631285179909f), Qfmt15(-0.83302725605608f),
+    Qfmt15(0.95404443402072f), Qfmt15(-0.06449863579434f), Qfmt15(-0.99575054486311f), Qfmt15(-0.65501142790847f),
+    Qfmt15(-0.81254441908887f), Qfmt15(-0.99646369485481f), Qfmt15(0.00287840603348f), Qfmt15(0.70176989408455f),
+    Qfmt15(0.96361882270190f), Qfmt15(-0.68883758192426f), Qfmt15(-0.34875585502238f), Qfmt15(0.91980081243087f),
+    Qfmt15(-0.99009048343881f), Qfmt15(0.68865791458395f), Qfmt15(-0.99484402129368f), Qfmt15(0.94214511408023f),
+    Qfmt15(-0.67414626793544f), Qfmt15(-0.47339353684664f), Qfmt15(0.14323651387360f), Qfmt15(-0.29268293575672f),
+    Qfmt15(0.43793861458754f), Qfmt15(-0.36345126374441f), Qfmt15(-0.08750604656825f), Qfmt15(-0.96495267812511f),
+    Qfmt15(0.55526940659947f), Qfmt15(0.73538215752630f), Qfmt15(-0.30889773919437f), Qfmt15(0.03574995626194f),
+    Qfmt15(0.98720684660488f), Qfmt15(-0.81689296271203f), Qfmt15(0.67866860118215f), Qfmt15(-0.15808569732583f),
+    Qfmt15(0.80723395114371f), Qfmt15(0.47788757329038f), Qfmt15(0.96367554763201f), Qfmt15(-0.99143875716818f),
+    Qfmt15(0.83081876925833f), Qfmt15(-0.58753191905341f), Qfmt15(0.95538108220960f), Qfmt15(-0.96490920476211f),
+    Qfmt15(-0.97327101028521f), Qfmt15(0.91400366022124f), Qfmt15(-0.99925837363824f), Qfmt15(-0.86875903507313f),
+    Qfmt15(-0.26240034795124f), Qfmt15(-0.24664412953388f), Qfmt15(0.02416275806869f), Qfmt15(0.82068619590515f),
+    Qfmt15(0.88547373760759f), Qfmt15(-0.18173078152226f), Qfmt15(0.09355476558534f), Qfmt15(-0.54668414224090f),
+    Qfmt15(0.37050990604091f), Qfmt15(-0.70373594262891f), Qfmt15(-0.34600785879594f), Qfmt15(-0.68774481731008f),
+    Qfmt15(-0.26843291251234f), Qfmt15(0.49072334613242f), Qfmt15(0.38975993093975f), Qfmt15(-0.97757125224150f),
+    Qfmt15(-0.17325552859616f), Qfmt15(0.99948035025744f), Qfmt15(-0.64946246527458f), Qfmt15(-0.12016920576437f),
+    Qfmt15(-0.58947456517751f), Qfmt15(-0.41815140454465f), Qfmt15(0.99885650204884f), Qfmt15(-0.56649614128386f),
+    Qfmt15(0.94138021032330f), Qfmt15(-0.75725076534641f), Qfmt15(0.20541973692630f), Qfmt15(0.99980371023351f),
+    Qfmt15(0.29078277605775f), Qfmt15(-0.62858772103030f), Qfmt15(0.43440904467688f), Qfmt15(-0.98298583762390f),
+    Qfmt15(0.19513029146934f), Qfmt15(-0.95476662400101f), Qfmt15(0.93379635304810f), Qfmt15(-0.85235410573336f),
+    Qfmt15(-0.86425093011245f), Qfmt15(0.38879779059045f), Qfmt15(0.92045124735495f), Qfmt15(0.89162532251878f),
+    Qfmt15(-0.36834336949252f), Qfmt15(0.93891760988045f), Qfmt15(0.99267657565094f), Qfmt15(-0.94063471614176f),
+    Qfmt15(0.99740224117019f), Qfmt15(-0.35899413170555f), Qfmt15(0.05237237274947f), Qfmt15(0.36703583957424f),
+    Qfmt15(0.91653180367913f), Qfmt15(0.69000803499316f), Qfmt15(-0.38658751133527f), Qfmt15(-0.29250814029851f),
+    Qfmt15(-0.60182204677608f), Qfmt15(-0.97418588163217f), Qfmt15(0.88461574003963f), Qfmt15(0.05198933055162f),
+    Qfmt15(-0.53499621979720f), Qfmt15(-0.49429560226497f), Qfmt15(-0.98935142339139f), Qfmt15(-0.98081380091130f),
+    Qfmt15(-0.27338148835532f), Qfmt15(0.06310802338302f), Qfmt15(-0.20461677199539f), Qfmt15(0.66223843141647f),
+    Qfmt15(-0.84764345483665f), Qfmt15(-0.89039863483811f), Qfmt15(0.95903308477986f), Qfmt15(0.73504123909879f),
+    Qfmt15(-0.31744434966056f), Qfmt15(-0.34110827591623f), Qfmt15(0.47803883714199f), Qfmt15(0.98299195879514f),
+    Qfmt15(-0.30963073129751f), Qfmt15(0.99992588229018f), Qfmt15(-0.93149731080767f), Qfmt15(0.99923472302773f),
+    Qfmt15(-0.26024169633417f), Qfmt15(-0.35712514743563f), Qfmt15(-0.99899084509530f), Qfmt15(0.86557171579452f),
+    Qfmt15(0.33408042438752f), Qfmt15(0.99010736374716f), Qfmt15(-0.66694269691195f), Qfmt15(0.64016792079480f),
+    Qfmt15(0.99570534804836f), Qfmt15(-0.63431466947340f), Qfmt15(-0.07706847005931f), Qfmt15(0.98590090577724f),
+    Qfmt15(0.80099335254678f), Qfmt15(0.78368131392666f), Qfmt15(0.08707806671691f), Qfmt15(-0.86811883080712f),
+    Qfmt15(-0.39466529740375f), Qfmt15(0.97875325649683f), Qfmt15(-0.95038560288864f), Qfmt15(0.17005239424212f),
+    Qfmt15(-0.76910792026848f), Qfmt15(0.99743281016846f), Qfmt15(0.95437383549973f), Qfmt15(0.99578905365569f),
+    Qfmt15(0.28058259829990f), Qfmt15(0.85256524470573f), Qfmt15(-0.50608540105128f), Qfmt15(-0.97210735183243f),
+    Qfmt15(0.95424048234441f), Qfmt15(-0.96926570524023f), Qfmt15(0.30872163214726f), Qfmt15(-0.24523839572639f),
+    Qfmt15(-0.33813265086024f), Qfmt15(-0.05826828420146f), Qfmt15(-0.22898461455054f), Qfmt15(-0.18509915019881f),
+    Qfmt15(-0.10488238045009f), Qfmt15(-0.71886586182037f), Qfmt15(0.99793873738654f), Qfmt15(0.57563307626120f),
+    Qfmt15(0.28909646383717f), Qfmt15(0.42188998312520f), Qfmt15(0.93335049681047f), Qfmt15(-0.97087374418267f),
+    Qfmt15(0.36722871286923f), Qfmt15(-0.81093025665696f), Qfmt15(-0.26240603062237f), Qfmt15(0.83996497984604f),
+    Qfmt15(-0.99909615720225f), Qfmt15(0.74649464155061f), Qfmt15(-0.74774595569805f), Qfmt15(0.95781667469567f),
+    Qfmt15(0.95472308713099f), Qfmt15(0.48708332746299f), Qfmt15(0.46332038247497f), Qfmt15(-0.76497004940162f),
+    Qfmt15(0.57397389364339f), Qfmt15(0.75374316974495f), Qfmt15(-0.59174397685714f), Qfmt15(0.75087906691890f),
+    Qfmt15(-0.98607857336230f), Qfmt15(-0.40761056640505f), Qfmt15(0.66929266740477f), Qfmt15(-0.97463695257310f),
+    Qfmt15(0.90145509409859f), Qfmt15(-0.87259289048043f), Qfmt15(-0.91529461447692f), Qfmt15(-0.03305738840705f),
+    Qfmt15(0.07223051368337f), Qfmt15(0.99498012188353f), Qfmt15(-0.74904939500519f), Qfmt15(0.04585228574211f),
+    Qfmt15(-0.89054954257993f), Qfmt15(-0.83782144651251f), Qfmt15(0.33454804933804f), Qfmt15(-0.99707579362824f),
+    Qfmt15(-0.22827527843994f), Qfmt15(0.67248046289143f), Qfmt15(-0.05146538187944f), Qfmt15(0.99947295749905f),
+    Qfmt15(0.66951124390363f), Qfmt15(-0.99602956559179f), Qfmt15(0.82104905483590f), Qfmt15(0.99186510988782f),
+    Qfmt15(-0.65284592392918f), Qfmt15(0.93885443798188f), Qfmt15(0.96735248738388f), Qfmt15(-0.22225968841114f),
+    Qfmt15(-0.44132783753414f), Qfmt15(-0.85694974219574f), Qfmt15(0.91783042091762f), Qfmt15(0.72556974415690f),
+    Qfmt15(-0.99711581834508f), Qfmt15(0.77638976371966f), Qfmt15(0.07717324253925f), Qfmt15(-0.56049829194163f),
+    Qfmt15(0.98398893639988f), Qfmt15(0.47546946844938f), Qfmt15(0.65675089314631f), Qfmt15(0.03273375457980f),
+    Qfmt15(-0.38684144784738f), Qfmt15(-0.97346267944545f), Qfmt15(-0.53282156061942f), Qfmt15(0.99817310731176f),
+    Qfmt15(-0.50254500772635f), Qfmt15(0.01995873238855f), Qfmt15(0.99930381973804f), Qfmt15(0.82907767600783f),
+    Qfmt15(-0.58660709669728f), Qfmt15(-0.17573736667267f), Qfmt15(0.83434292401346f), Qfmt15(0.05946491307025f),
+    Qfmt15(0.81505484574602f), Qfmt15(-0.44976380954860f), Qfmt15(-0.89746474625671f), Qfmt15(0.39677256130792f),
+    Qfmt15(-0.07588948563079f), Qfmt15(0.76343198951445f), Qfmt15(-0.74490104699626f), Qfmt15(0.64880119792759f),
+    Qfmt15(0.62319537462542f), Qfmt15(0.42215817594807f), Qfmt15(0.02704554141885f), Qfmt15(0.80001773566818f),
+    Qfmt15(-0.79351832348816f), Qfmt15(0.63872359151636f), Qfmt15(0.52890520960295f), Qfmt15(0.74238552914587f),
+    Qfmt15(0.99096131449250f), Qfmt15(-0.80412329643109f), Qfmt15(-0.64612616129736f), Qfmt15(0.11657770663191f),
+    Qfmt15(-0.95053182488101f), Qfmt15(-0.62228872928622f), Qfmt15(0.03004475787316f), Qfmt15(-0.97987214341034f),
+    Qfmt15(-0.99986980746200f), Qfmt15(0.89110648599879f), Qfmt15(0.10407960510582f), Qfmt15(0.95964737821728f),
+    Qfmt15(0.50843233159162f), Qfmt15(0.17006334670615f), Qfmt15(0.25872675063360f), Qfmt15(-0.01115998681937f),
+    Qfmt15(-0.79598702973261f), Qfmt15(-0.99264708948101f), Qfmt15(-0.99829663752818f), Qfmt15(-0.70801016548184f),
+    Qfmt15(-0.70467057786826f), Qfmt15(0.99846021905254f), Qfmt15(-0.63364968534650f), Qfmt15(-0.16258217500792f),
+    Qfmt15(-0.43645594360633f), Qfmt15(-0.99848471702976f), Qfmt15(-0.16796458968998f), Qfmt15(-0.87979225745213f),
+    Qfmt15(0.44183099021786f), Qfmt15(0.93310180125532f), Qfmt15(-0.93941931782002f), Qfmt15(-0.88590003188677f),
+    Qfmt15(0.99971463703691f), Qfmt15(-0.75376385639978f), Qfmt15(0.93887685615875f), Qfmt15(0.85126435782309f),
+    Qfmt15(0.39701421446381f), Qfmt15(-0.37024464187437f), Qfmt15(-0.36024828242896f), Qfmt15(-0.93388812549209f),
+    Qfmt15(-0.65298804552119f), Qfmt15(0.11960319006843f), Qfmt15(0.94292565553160f), Qfmt15(0.75081145286948f),
+    Qfmt15(0.56721979748394f), Qfmt15(0.46857766746029f), Qfmt15(0.97312313923635f), Qfmt15(-0.38299976567017f),
+    Qfmt15(0.41025800019463f), Qfmt15(0.09638062008048f), Qfmt15(-0.85283249275397f), Qfmt15(0.88866808958124f),
+    Qfmt15(-0.48202429536989f), Qfmt15(0.27572582416567f), Qfmt15(-0.65889129659168f), Qfmt15(0.98838086953732f),
+    Qfmt15(-0.20651349620689f), Qfmt15(-0.62126416356920f), Qfmt15(0.20320105410437f), Qfmt15(-0.97790548600584f),
+    Qfmt15(0.11112534735126f), Qfmt15(-0.41368337314182f), Qfmt15(0.24133038992960f), Qfmt15(-0.66393410674885f),
+    Qfmt15(-0.53697829178752f), Qfmt15(-0.97224737889348f), Qfmt15(0.87392477144549f), Qfmt15(0.19050361015753f),
+    Qfmt15(-0.46353441212724f), Qfmt15(-0.07064096339021f), Qfmt15(-0.92444085484466f), Qfmt15(-0.83822593578728f),
+    Qfmt15(0.75214681811150f), Qfmt15(-0.42102998829339f), Qfmt15(-0.72094786237696f), Qfmt15(0.78843311019251f),
+    Qfmt15(0.97394027897442f), Qfmt15(0.99206463477946f), Qfmt15(0.76789609461795f), Qfmt15(-0.82002421836409f),
+    Qfmt15(0.81924990025724f), Qfmt15(-0.26719850873357f), Qfmt15(-0.43311260380975f), Qfmt15(0.99194979673836f),
+    Qfmt15(-0.80692001248487f), Qfmt15(0.43080003649976f), Qfmt15(0.67709491937357f), Qfmt15(0.56151770568316f),
+    Qfmt15(0.10831862810749f), Qfmt15(0.91229417540436f), Qfmt15(-0.48972893932274f), Qfmt15(-0.89033658689697f),
+    Qfmt15(0.65269447475094f), Qfmt15(0.67439478141121f), Qfmt15(-0.47770832416973f), Qfmt15(-0.99715979260878f),
+    Qfmt15(-0.90889593602546f), Qfmt15(-0.06618622548177f), Qfmt15(0.99430266919728f), Qfmt15(0.97686402381843f),
+    Qfmt15(0.94813650221268f), Qfmt15(-0.95434497492853f), Qfmt15(-0.49104783137150f), Qfmt15(0.99881175120751f),
+    Qfmt15(0.50449166760303f), Qfmt15(0.47162891065108f), Qfmt15(-0.62081581361840f), Qfmt15(-0.43867015250812f),
+    Qfmt15(0.98630563232075f), Qfmt15(-0.61510362277374f), Qfmt15(-0.03841517601843f), Qfmt15(-0.30102157304644f),
+    Qfmt15(0.41881284182683f), Qfmt15(-0.86135454941237f), Qfmt15(0.67226861393788f), Qfmt15(-0.70737398842068f),
+    Qfmt15(0.94044946687963f), Qfmt15(-0.82386352534327f), Qfmt15(-0.32070666698656f), Qfmt15(0.57593163224487f),
+    Qfmt15(-0.36326018419965f), Qfmt15(0.99979044674350f), Qfmt15(-0.92366023326932f), Qfmt15(-0.44607178518598f),
+    Qfmt15(0.44226800932956f), Qfmt15(0.03671907158312f), Qfmt15(0.52175424682195f), Qfmt15(-0.94701139690956f),
+    Qfmt15(-0.98759606946049f), Qfmt15(0.87434794743625f), Qfmt15(-0.93412041758744f), Qfmt15(0.96063943315511f),
+    Qfmt15(0.97534253457837f), Qfmt15(0.99642466504163f), Qfmt15(-0.94705089665984f), Qfmt15(0.91599807087376f)
+};
+
+
+#ifdef HQ_SBR
+
+
+const Int32 fir_table[5][5] =
+{
+    { Q30_fmt(1.0f)},
+    { Q30_fmt(0.33333333333333f), Q30_fmt(0.66666666666666f)},
+    { Q30_fmt(0.12500000000000f), Q30_fmt(0.37500000000000f),
+      Q30_fmt(0.50000000000000f)},
+    { Q30_fmt(0.05857864376269f), Q30_fmt(0.20000000000000f),
+      Q30_fmt(0.34142135623731f), Q30_fmt(0.40000000000000f)},
+    { Q30_fmt(0.03183050093751f), Q30_fmt(0.11516383427084f),
+      Q30_fmt(0.21816949906249f), Q30_fmt(0.30150283239582f),
+      Q30_fmt(0.33333333333333f)}
+};
+
+
+
+const Int32 rPxx[512] =
+{
+
+    0x8010B3DB,  0x7C4DA98F, 0x12168648, 0xC3D4D033,
+    0x674D25F5,  0xCE1972A6, 0xFEA5AA4A, 0x8B2DF13E,
+    0x46326048,  0x3336815E, 0x802A8F2B, 0x85B7745C,
+    0xC577B766,  0xA2A5828C, 0x60CB1AD1, 0x090C9BD7,
+    0x5F5A8B4D,  0x848D86BB, 0x26F1C0B7, 0x553352C1,
+    0x755E166B,  0xA5674343, 0xA654C5F5, 0x80A48CB4,
+    0x7DA69CD8,  0xBA04FCB4, 0xFDD4005E, 0x91C63676,
+    0x816A8F82,  0x423F55AA, 0x8077B59E, 0x80097DE9,
+    0x46BD4C18,  0x2C437971, 0x5035A0C2, 0x9D3ED49F,
+    0x8AC204B8,  0x9E5A8B0A, 0x662088B9, 0x45B9F0BC,
+    0x9261364F,  0x891B23AD, 0xF1028040, 0x1B568BE1,
+    0x9E787FB3,  0x7D94854D, 0x92077A94, 0x88903F45,
+    0x2705A5B4,  0x6D2B3BDC, 0x74E58034, 0xF8745A8C,
+    0x24592C54,  0x79EDB9BB, 0x9B6E9F44, 0x8563E5DA,
+    0x697C7BB7,  0xAC8F8E6A, 0x88227FD5, 0x7506822F,
+    0xA5E34B42,  0x00B94F10, 0x72004390, 0xA814676E,
+    0x5C5EA758,  0xAF721171, 0x2652C50C, 0x8A84A142,
+    0x7F19343E,  0x696EA13B, 0x81E68008, 0x853980F9,
+    0xE4968869,  0xA7E7DD92, 0x75910BFA, 0x85092E35,
+    0x421BA4A3,  0x4E3F3C18, 0x3C97DD02, 0x74797BCB,
+    0x39667EFD,  0x55447BA2, 0x5FE68CF3, 0x808B4390,
+    0x7CABEA6B,  0x5D08C27A, 0x7A265820, 0xA29A9DF0,
+    0x92BC7195,  0x97CA8338, 0x8F725FAD, 0xA46281D3,
+    0x6AE86B23,  0xC2728178, 0x7C566684, 0x428C66B7,
+    0xFEE89DDB,  0xA60546DC, 0x8540C89D, 0x7C420BF0,
+    0x89B86D72,  0xA7077E3F, 0x21FF5DD7, 0x23E3129C,
+    0xA1197F1D,  0xFDC0963F, 0xB96F8168, 0x7D6387A6,
+    0x810655C8,  0xA95C102B, 0x0BB3E5B4, 0xA44682D4,
+    0x67B244C3,  0x33FDDE1D, 0xA95D78F5, 0x6F2AE887,
+    0x80A3FC9F,  0x6BF00D52, 0xF4325902, 0x7FF1F02C,
+    0x99F08AC5,  0x7B537BB2, 0x99AB5255, 0xF1302497,
+    0xCCE4787B,  0x7ED58A28, 0x24A68B79, 0x955EA9D0,
+    0x7A1D3EED,  0xF7BD0429, 0x808A3642, 0xAC2769A8,
+    0x97FDBDE9,  0x80736C25, 0x005E52E7, 0x59D3E5D0,
+    0x7B57341A,  0xA7D374E9, 0xD35A5B7B, 0x75BB5520,
+    0x81446DE8,  0x5825473E, 0x80A8E653, 0x78978062,
+    0xA9B43F6B,  0xC366920A, 0x1255877D, 0xDA88075F,
+    0x380E9AFF,  0xD1795309, 0xF4CB7D09, 0x847BBAED,
+    0x471364FA,  0x5E207B74, 0xD87498BF, 0x0493836B,
+    0x7E5C3DF6,  0x976F8BBC, 0x56DE680A, 0xEBC26D28,
+    0x6753E05B,  0x3D2BC4B0, 0x7B593143, 0x8118E010,
+    0x6A5786AD,  0xB4CA01A7, 0x7A49927C, 0x847DAE0C,
+    0x836B0FD8,  0x74FD4A34, 0x80175AFC, 0x90CBE605,
+    0xDE68A89E,  0xE06C8FD0, 0x031822CE, 0x690B9315,
+    0x71568D43,  0xE8BBDE85, 0x0BFA4633, 0xBA057ADA,
+    0x2F6CB34F,  0xA5EB74C5, 0xD3B480B6, 0xA7F7D94A,
+    0xDDA26A63,  0x3ED0C5EF, 0x31E37A42, 0x82DE06CB,
+    0xE9D18940,  0x7FEE4A9A, 0xACDD57DD, 0xF09CB6D9,
+    0xB48BD364,  0xCA7814D5, 0x7FDA0E41, 0xB77C8C2A,
+    0x787E2D29,  0x9F1144AC, 0x1A4B871E, 0x7FF96630,
+    0x25382D4D,  0xAF89319E, 0x379A81DB, 0x822D1AE8,
+    0x18FA875E,  0x85C97DE7, 0x7786A544, 0x92E5F550,
+    0x915FC560,  0x31C47C82, 0x75D0B014, 0x72204656,
+    0xD0D87B76,  0x782E8CD6, 0x7F0FFB2F, 0x879834E7,
+    0x7FAAEA73,  0xD20BC44E, 0x06B4DF2C, 0x2EFBCE84,
+    0x7550D8D7,  0x5851746A, 0xCE837F5C, 0xDA8D2FEE,
+    0xB2F66F13,  0x834D7B7A, 0x713A499C, 0x06A81B39,
+    0xBB847C77,  0xC0B97DAC, 0x815CCC7A, 0x8274A2BD,
+    0xDD007FEF,  0x0814BA2F, 0xE5CDEDCE, 0x54C45CD5,
+    0x937F0309,  0x8E0671BF, 0x7AC1623B, 0x5E15FB32,
+    0xD75CD0D9,  0xD4553378, 0x3D30CD88, 0x7DD2028C,
+    0xD85CE8DB,  0x7FFDDE5A, 0x88C48228, 0x7FE6996A,
+    0xDEAF9EB7,  0xD24818B4, 0x80205F8B, 0x6ECA4728,
+    0x2AC36E51,  0x7EBB05E4, 0xAAA08AB1, 0x51F01408,
+    0x7F723AAE,  0xAECD1AFB, 0xF6218D55, 0x7E3170F2,
+    0x6686D0D3,  0x644F3A3F, 0x0B256799, 0x90E0325D,
+    0xCD7AAA7B,  0x7D47A33C, 0x865972A3, 0x15C445FE,
+    0x9D8D84D3,  0x7FAB36A7, 0x7A287C29, 0x7F75BABD,
+    0x23EA92BC,  0x6D20AD59, 0xBF37ABB6, 0x8391E26E,
+    0x7A2480F8,  0x83EE5E6E, 0x27843523, 0xE09A50E7,
+    0xD4B6CE82,  0xF889F71C, 0xE2AF7C3A, 0xE84D3CE2,
+    0xF2918FA6,  0xA3FB63E0, 0x7FBB7340, 0x49AE8B79,
+    0x25017B45,  0x36003DA1, 0x7777C844, 0x83B96EE4,
+    0x2F015392,  0x98320B3C, 0xDE68893F, 0x6B834779,
+    0x801D8516,  0x5F8C0F8C, 0xA049DD90, 0x7A999AD0,
+    0x7A33F500,  0x3E587FFF, 0x3B4E0E09, 0x9E147230,
+    0x49772D2B,  0x607A7BC7, 0xB4408D8F, 0x601CDA17,
+    0x81C7200B,  0xCBD28CBD, 0x55AB7E3E, 0x833EFFC0,
+    0x73627FB7,  0x904E7F04, 0x8AD7EBE6, 0xFBC3D05F,
+    0x093F8E53,  0x7F5B7C47, 0xA01E7FFA, 0x05DE7FC2,
+    0x8E01D74D,  0x94C17CF9, 0x2AD2919F, 0x805F7757,
+    0xE2C61829,  0x5613FB53, 0xF9688978, 0x7FEE77D6,
+    0x55B27E98,  0x8081C6D6, 0x69177F69, 0x7EF45C30,
+    0xAC6E42CC,  0x782BA021, 0x7BD17457, 0xE38B491E,
+    0xC781895B,  0x924E71B8, 0x757BC4A8, 0x5CDF8020,
+    0x805E4A82,  0x636078BA, 0x09E14B0E, 0xB84069A0,
+    0x7DF23284,  0x3CDC57D2, 0x54101777, 0x0431A015,
+    0xCE7A41B6,  0x8365846A, 0xBBCB8AF9, 0x7FC34E40,
+    0xBFAB8E4B,  0x028E6D15, 0x7FE8790F, 0x6A1EF7E6,
+    0xB4E97BF4,  0xE980C257, 0x6ACBEF53, 0x079C1A41,
+    0x685386CC,  0xC66D3458, 0x8D1F7FCD, 0x32C9A02E,
+    0xF6475ED7,  0x61B7356F, 0xA0A6793F, 0x530B34E9,
+    0x4FC488D4,  0x3609F61F, 0x0376F90F, 0x6666752C,
+    0x9A6DD1A5,  0x51C10A67, 0x43B34CDC, 0x5F0605C0,
+    0x7ED7E718,  0x99118EB3, 0xAD4A5C69, 0x0EEC94E8,
+    0x865483EA,  0xB05769F0, 0x03D88055, 0x82932EC1,
+    0x8003D1E3,  0x720F82B1, 0x0D526304, 0x7AD5D2A3,
+    0x41147B04,  0x15C49D9F, 0x211E7FDC, 0xFE907E12,
+    0x9A1C7C55,  0x80F08095, 0x80370267, 0xA55F2B1C,
+    0xA5CC7763,  0x7FCD81A1, 0xAEE3EAE8, 0xEB2F8532,
+    0xC82186A5,  0x80317B31, 0xEA7E814B, 0x8F62A430,
+    0x388D883A,  0x776F801B, 0x87C0B7CA, 0x8E9A3CF5,
+    0x7FF6949E,  0x9F83010B, 0x782CF18C, 0x6CF54301,
+    0x32D168AD,  0xD09A908B, 0xD1E22C5C, 0x887593DE,
+    0xAC6AE864,  0x0F4F7FDE, 0x78B16A72, 0x601AD283,
+    0x489AE12D,  0x3BFAD96A, 0x7C8E8093, 0xCEF87E19,
+    0x348302B6,  0x0C5605A6, 0x92D57516, 0x71BF8056,
+    0xC24C8416,  0x234B4B0D, 0xABA84B4F, 0x7E827FFD,
+    0xE58F45E1,  0xB079B355, 0x1A0290CA, 0x82D37B40,
+    0x0E391B80,  0xCB0B241E, 0x1EE441A8, 0xAB03F56F,
+    0xBB438301,  0x838C1C43, 0x6FDCEF9D, 0x1862020D,
+    0xC4A98614,  0xF6F38710, 0x89ABF29B, 0x94B4FDD3,
+    0x6046800E,  0xCA1A7FA4, 0xA3B7D32F, 0x64EB43A6,
+    0x7CA9DDD3,  0x7EFBB705, 0x624A9E0D, 0x9708A1E0,
+    0x68DC7F9C,  0xDDCB5832, 0xC88E6D35, 0x7EF77599,
+    0x98B6D63B,  0x3724E3F0, 0x56AA85C9, 0x47DFA582,
+    0x0DDDF4F3,  0x74C5AB88, 0xC14F480C, 0x8E08A446,
+    0x538B545F,  0x56529770, 0xC2D9EA81, 0x805C883B,
+    0x8BA84F67,  0xF785E183, 0x7F441814, 0x7D09DB4D,
+    0x795C8330,  0x85D79A19, 0xC1242A1B, 0x7FD871E9,
+    0x409391EC,  0x3C5EE815, 0xB0885FFF, 0xC7D87FFE,
+    0x7E3EBB6A,  0xB1438D6B, 0xFB13A68A, 0xD976F62D,
+    0x359B02CD,  0x91BE7EA6, 0x560CEEB8, 0xA5739E04,
+    0x78600B8E,  0x968A0B6C, 0xD6F1402E, 0x49B88152,
+    0xD17F0986,  0x7FF8EDE8, 0x89C48295, 0xC6E6BA93,
+    0x389C5B4C,  0x04B3516A, 0x42C892B0, 0x86C7FDA8,
+    0x81956954,  0x6FEA726E, 0x886E34F5, 0x7AF57730,
+    0x7CD76E45,  0x7F8A59D7, 0x86C6DA22, 0x753F825E
+};
+
+
+#endif
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.h b/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.h
new file mode 100644
index 0000000..60e806d
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_envelope_calc_tbl.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_envelope_calc_tbl.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_ENVELOPE_CALC_TBL_H
+#define SBR_ENVELOPE_CALC_TBL_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+
+extern const Int32 limGains[5];
+
+extern const Int32 smoothLengths[2];
+
+extern const Int16 rP_LCx[512];
+
+#ifdef HQ_SBR
+
+
+extern const Int32 fir_table[5][5];
+
+extern const Int32 rPxx[512];
+
+#endif
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.cpp b/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.cpp
new file mode 100644
index 0000000..7fce46b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.cpp
@@ -0,0 +1,427 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_envelope_unmapping.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_envelope_unmapping.h"
+#include    "sbr_constants.h"
+
+#include "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+#define R_SHIFT     30
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+/*
+ *  1./(1+2.^-[0:10])
+ */
+const Int32 one_over_one_plus_two_to_n[11] =
+{
+    Qfmt(0.50000000000000F), Qfmt(0.66666666666667F), Qfmt(0.80000000000000F),
+    Qfmt(0.88888888888889F), Qfmt(0.94117647058824F), Qfmt(0.96969696969697F),
+    Qfmt(0.98461538461538F), Qfmt(0.99224806201550F), Qfmt(0.99610894941634F),
+    Qfmt(0.99805068226121F), Qfmt(0.99902439024390F)
+};
+
+/*
+ *  1./(1+2.^[0.5:-1:-10.5])
+ */
+const Int32 one_over_one_plus_sq_2_by_two_to_n[12] =
+{
+    Qfmt(0.41421356237310F), Qfmt(0.58578643762690F), Qfmt(0.73879612503626F),
+    Qfmt(0.84977889517767F), Qfmt(0.91878969685839F), Qfmt(0.95767628767521F),
+    Qfmt(0.97838063800882F), Qfmt(0.98907219289563F), Qfmt(0.99450607818892F),
+    Qfmt(0.99724547251514F), Qfmt(0.99862083678608F), Qfmt(0.99930994254211F)
+};
+
+/*----------------------------------------------------------------------------
+; 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 sbr_envelope_unmapping(SBR_FRAME_DATA * hFrameData1,
+                            SBR_FRAME_DATA * hFrameData2)
+
+{
+    Int32 i;
+    Int32 tempLeft;
+    Int32 tempRight;
+
+    Int32 tmp;
+    Int32 *iEnvelopeLeft_man    = hFrameData1->iEnvelope_man;
+    Int32 *iEnvelopeLeft_exp    = hFrameData1->iEnvelope_exp;
+    Int32 *noiseFloorLeft_man   = hFrameData1->sbrNoiseFloorLevel_man;
+    Int32 *noiseFloorLeft_exp   = hFrameData1->sbrNoiseFloorLevel_exp;
+
+    Int32 *iEnvelopeRight_man   = hFrameData2->iEnvelope_man;
+    Int32 *iEnvelopeRight_exp   = hFrameData2->iEnvelope_exp;
+    Int32 *noiseFloorRight_man  = hFrameData2->sbrNoiseFloorLevel_man;
+    Int32 *noiseFloorRight_exp  = hFrameData2->sbrNoiseFloorLevel_exp;
+
+
+    if (hFrameData2->ampRes)
+    {
+        for (i = 0; i < hFrameData1->nScaleFactors; i++)
+        {
+            tempRight = iEnvelopeRight_man[i];
+            tempLeft  = iEnvelopeLeft_man[i];
+            /*  iEnvelope[i] always positive  6 bits max */
+
+            iEnvelopeLeft_exp[i] = tempLeft + 7;
+
+            iEnvelopeRight_exp[i] = tempRight - 12;
+            iEnvelopeRight_man[i] = Qfmt(1.000F);
+
+            /*
+             *  iEnvelopeRight[i] = tempLeft / (1 + tempRight);
+             *  iEnvelopeLeft[i]  = tempRight * iEnvelopeRight[i];
+             *
+             *
+             *   iEnvelopeRight[i] = k*2^n/(1+2^m) =  k*2^(n-m)/(1 + 2^-m);
+             *   where k = 1 or sqrt(2)
+             */
+            if (iEnvelopeRight_exp[i] >= 0)
+            {
+                if (iEnvelopeRight_exp[i] < 11)
+                {
+                    iEnvelopeRight_man[i] = one_over_one_plus_two_to_n[ iEnvelopeRight_exp[i]];
+                }
+                else        /*  1/(1+2^-m) == 1 - 2^-m ;  for m >= 10  */
+                {
+                    iEnvelopeRight_man[i] -= (Qfmt(1.000F) >> iEnvelopeRight_exp[i]);
+                }
+                iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
+            }
+            else
+            {
+                if (iEnvelopeRight_exp[i] > -11)
+                {
+                    iEnvelopeRight_man[i] -= one_over_one_plus_two_to_n[ -iEnvelopeRight_exp[i]];
+                    iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
+
+                }
+                else        /*  1/(1+2^m) == 2^-m ;  for m >= 10  */
+                {
+                    iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i];
+                    iEnvelopeLeft_exp[i] = 0;
+                }
+            }
+
+            iEnvelopeLeft_man[i]  = iEnvelopeRight_man[i];
+        }
+    }
+    else
+    {
+        for (i = 0; i < hFrameData1->nScaleFactors; i++)
+        {
+            /*  iEnvelope[i] always positive  7 bits max */
+            tempRight = iEnvelopeRight_man[i];
+            tempLeft  = iEnvelopeLeft_man[i];
+
+            iEnvelopeLeft_exp[i] = (tempLeft >> 1) + 7;
+            if (tempLeft & 0x1)   /*  odd */
+            {
+                iEnvelopeLeft_man[i] = Qfmt(1.41421356237310F);
+            }
+            else
+            {
+                iEnvelopeLeft_man[i] = Qfmt(1.000F);
+            }
+
+            iEnvelopeRight_exp[i] = (tempRight >> 1) - 12;
+            if (tempRight & 0x1)   /*  odd */
+            {
+                if (iEnvelopeRight_exp[i] > 0)
+                {
+                    iEnvelopeRight_man[i] = Qfmt(1.41421356237310F);
+                }
+                else
+                {
+                    iEnvelopeRight_man[i] = Qfmt(0.7071067811865F);
+                }
+            }
+            else
+            {
+                iEnvelopeRight_man[i] = Qfmt(1.000F);
+            }
+
+            if (iEnvelopeRight_man[i] == Qfmt(1.000F))
+            {
+
+                /*
+                 *  iEnvelopeRight[i] = tempLeft / (1 + tempRight);
+                 *  iEnvelopeLeft[i]  = tempRight * iEnvelopeRight[i];
+                 *
+                 *
+                 *   iEnvelopeRight[i] = k*2^n/(1+2^m) =  k*2^(n-m)/(1 + 2^-m);
+                 *   where k = 1 or sqrt(2)
+                 */
+                if (iEnvelopeRight_exp[i] >= 0)
+                {
+                    if (iEnvelopeRight_exp[i] < 11)
+                    {
+                        iEnvelopeRight_man[i] = one_over_one_plus_two_to_n[ iEnvelopeRight_exp[i]];
+                    }
+                    else        /*  1/(1+2^-m) == 1 - 2^-m ;  for m >= 10  */
+                    {
+                        iEnvelopeRight_man[i] -= (Qfmt(1.000F) >> iEnvelopeRight_exp[i]);
+                    }
+                    iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
+
+                }
+                else
+                {
+                    if (iEnvelopeRight_exp[i] > -11)
+                    {
+                        iEnvelopeRight_man[i] -= one_over_one_plus_two_to_n[ -iEnvelopeRight_exp[i]];
+                        iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
+                    }
+                    else        /*  1/(1+2^m) == 2^-m ;  for m >= 10  */
+                    {
+                        iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i];
+                        iEnvelopeLeft_exp[i]  = 0;
+                    }
+                }
+
+                /*
+                 *  apply "k" factor 1 or sqrt(2)
+                 *
+                 *   (2^m)*2*k*2^n/(1+2^m) =  k*2^(n+1)/(1 + 2^-m);
+                 *
+                 */
+                if (iEnvelopeLeft_man[i] != Qfmt(1.000F))
+                {
+                    iEnvelopeRight_man[i] = fxp_mul32_Q30(iEnvelopeLeft_man[i], iEnvelopeRight_man[i]);
+                }
+
+                iEnvelopeLeft_man[i]  = iEnvelopeRight_man[i];
+
+            }
+            else
+            {
+
+                /*
+                *  iEnvelopeRight[i] = tempLeft / (1 + tempRight);
+                *  iEnvelopeLeft[i]  = tempRight * iEnvelopeRight[i];
+                *
+                *
+                *   iEnvelopeRight[i] = k*2^n/(1+q2^m) =  k*2^(n-m)/(1 + q2^-m);
+                *   where k = 1 or sqrt(2)
+                *   and q = sqrt(2)
+                    */
+                if (iEnvelopeRight_exp[i] >= 0)
+                {
+                    if (iEnvelopeRight_exp[i] < 12)
+                    {
+                        iEnvelopeRight_man[i] = one_over_one_plus_sq_2_by_two_to_n[ iEnvelopeRight_exp[i]];
+                    }
+                    else        /*  1/(1+2^-m) == 1 - 2^-m ;  for m >= 11  */
+                    {
+                        iEnvelopeRight_man[i] = Qfmt(1.000F) - (Qfmt(1.000F) >> iEnvelopeRight_exp[i]);
+                    }
+                }
+                else
+                {
+                    if (iEnvelopeRight_exp[i] > -12)
+                    {
+                        iEnvelopeRight_man[i] = Qfmt(1.000F) - one_over_one_plus_sq_2_by_two_to_n[ -iEnvelopeRight_exp[i]];
+                    }
+                    else        /*  1/(1+2^m) == 2^-m ;  for m >= 11  */
+                    {
+                        iEnvelopeRight_man[i] = Qfmt(1.000F);
+                        iEnvelopeRight_exp[i] = 0;
+                    }
+                }
+
+                iEnvelopeRight_exp[i] = iEnvelopeLeft_exp[i] - iEnvelopeRight_exp[i];
+
+                /*
+                *  apply "k" factor 1 or sqrt(2)
+                *
+                *   Right ==    k*2^(n-m)/(1 + q2^-m)
+                *   Left  == (q2^m)*k*2^n/(1 + q2^m) =  qk*2^n/(1 + q2^-m);
+                */
+                if (iEnvelopeLeft_man[i] != Qfmt(1.000F))
+                {
+                    /*
+                    *   k/(1 + q2^-m);
+                        */
+                    tmp = iEnvelopeRight_man[i];
+                    iEnvelopeRight_man[i] = fxp_mul32_Q30(iEnvelopeLeft_man[i], iEnvelopeRight_man[i]);
+                    iEnvelopeLeft_man[i] = tmp;
+                    iEnvelopeLeft_exp[i] += 1;      /* extra one due to sqrt(2)^2 */
+                }
+                else
+                {
+                    iEnvelopeLeft_man[i]  = fxp_mul32_Q30(iEnvelopeRight_man[i], Qfmt(1.41421356237310F));
+                }
+
+            }       /*  end of     if (iEnvelopeRight_man[i] == Qfmt( 1.000F) )  */
+        }      /* end of for loop */
+    }     /*  end  if (hFrameData2->ampRes) */
+
+
+    for (i = 0; i < hFrameData1->nNoiseFactors; i++)
+    {
+
+        noiseFloorLeft_exp[i]  = NOISE_FLOOR_OFFSET_PLUS_1 - noiseFloorLeft_man[i];
+        noiseFloorRight_exp[i] = noiseFloorRight_man[i] - SBR_ENERGY_PAN_OFFSET_INT;
+
+
+        /*
+         *  noiseFloorRight[i] = tempLeft / (1.0f + tempRight);
+         *  noiseFloorLeft[i]  = tempRight*noiseFloorRight[i];
+         *
+         *
+         *   noiseFloorRight[i] = 2^n/(1+2^m) =  2^(n-m)/(1 + 2^-m);
+         */
+        if (noiseFloorRight_exp[i] >= 0)
+        {
+            if (noiseFloorRight_exp[i] < 11)
+            {
+                noiseFloorRight_man[i] = one_over_one_plus_two_to_n[ noiseFloorRight_exp[i]];
+            }
+            else        /*  1/(1+2^-m) == 1 - 2^-m ;  for m >= 10  */
+            {
+                noiseFloorRight_man[i] = Qfmt(1.000F) - (Qfmt(1.000F) >> noiseFloorRight_exp[i]);
+            }
+        }
+        else
+        {
+            if (noiseFloorRight_exp[i] > -11)
+            {
+                noiseFloorRight_man[i] = Qfmt(1.000F) - one_over_one_plus_two_to_n[ -noiseFloorRight_exp[i]];
+            }
+            else        /*  1/(1+2^m) == 2^-m ;  for m >= 10  */
+            {
+                noiseFloorRight_man[i] = Qfmt(1.000F);
+                noiseFloorRight_exp[i] = 0;
+            }
+        }
+
+        noiseFloorRight_exp[i] = noiseFloorLeft_exp[i] - noiseFloorRight_exp[i];
+
+        /*
+         *   (2^m)*2^n/(1+2^m) =  2^n/(1 + 2^-m);
+         */
+
+        noiseFloorLeft_man[i] = noiseFloorRight_man[i];
+        noiseFloorLeft_exp[i] = noiseFloorLeft_exp[i];
+
+    }
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.h b/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.h
new file mode 100644
index 0000000..b949830
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_envelope_unmapping.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_envelope_unmapping.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_ENVELOPE_UNMAPPING_H
+#define SBR_ENVELOPE_UNMAPPING_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sbr_frame_data.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+
+#define UNMAPPING_SCALE_INT         (-18)           /*  factor's 2-exponent */
+#define SBR_ENERGY_PAN_OFFSET_INT   12
+
+
+
+/*----------------------------------------------------------------------------
+; 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 sbr_envelope_unmapping(SBR_FRAME_DATA * hFrameData1,
+                            SBR_FRAME_DATA * hFrameData2);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.cpp b/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.cpp
new file mode 100644
index 0000000..92b22f7
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.cpp
@@ -0,0 +1,223 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_extract_extended_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    SBR_FRAME_DATA *hFrameData,     Destination for extracted data of left channel
+    SBR_FRAME_DATA *hFrameDataRight Destination for extracted data of right channel
+    BIT_BUFFER hBitBuf              pointer to bit buffer
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Reads extension data from the bitstream
+
+  The bitstream format allows up to 4 kinds of extended data element.
+  Extended data may contain several elements, each identified by a 2-bit-ID.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_extract_extended_data.h"
+#include    "buf_getbits.h"
+
+#ifdef PARAMETRICSTEREO
+#include    "ps_read_data.h"
+#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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void sbr_extract_extended_data(BIT_BUFFER * hBitBuf
+#ifdef PARAMETRICSTEREO         /* Parametric Stereo Decoder */
+                               , HANDLE_PS_DEC hParametricStereoDec
+#endif
+                              )
+{
+    Int32 extended_data;
+    Int32 i;
+    Int32 nBitsLeft;
+    Int32 extension_id;
+
+    extended_data = buf_get_1bit(hBitBuf);    /*  SI_SBR_EXTENDED_DATA_BITS  */
+
+    if (extended_data)
+    {
+        Int32 cnt;
+
+        cnt = buf_getbits(hBitBuf, SI_SBR_EXTENSION_SIZE_BITS);
+        if (cnt == (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1)
+        {
+            cnt += buf_getbits(hBitBuf, SI_SBR_EXTENSION_ESC_COUNT_BITS);
+        }
+
+        nBitsLeft = (cnt << 3);
+        while (nBitsLeft > 7)
+        {
+            extension_id = buf_getbits(hBitBuf, SI_SBR_EXTENSION_ID_BITS);
+            nBitsLeft -= SI_SBR_EXTENSION_ID_BITS;
+
+            switch (extension_id)
+            {
+#ifdef HQ_SBR
+#ifdef PARAMETRICSTEREO
+
+                    /*
+                     *  Parametric Coding supports the Transient, Sinusoidal, Noise, and
+                     *  Parametric Stereo tools (MPEG4).
+                     *  3GPP use aac+ hq along with ps for enhanced aac+
+                     *  The PS tool uses complex-value QMF data, therefore can not be used
+                     *  with low power version of aac+
+                     */
+                case EXTENSION_ID_PS_CODING:
+
+                    if (hParametricStereoDec != NULL)
+                    {
+                        if (!hParametricStereoDec->psDetected)
+                        {
+                            /* parametric stereo detected */
+                            hParametricStereoDec->psDetected = 1;
+                        }
+
+                        nBitsLeft -= ps_read_data(hParametricStereoDec,
+                                                  hBitBuf,
+                                                  nBitsLeft);
+
+                    }
+
+                    break;
+#endif
+#endif
+                case 0:
+
+                default:
+                    /*   An unknown extension id causes the remaining extension data
+                     *   to be skipped
+                     */
+                    cnt = nBitsLeft >> 3; /* number of remaining bytes */
+
+                    for (i = 0; i < cnt; i++)
+                    {
+                        buf_getbits(hBitBuf, 8);
+                    }
+
+                    nBitsLeft -= (cnt << 3);
+            }
+        }
+        /* read fill bits for byte alignment */
+        buf_getbits(hBitBuf, nBitsLeft);
+    }
+}
+
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.h b/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.h
new file mode 100644
index 0000000..bbca3b9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_extract_extended_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_extract_extended_data.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_EXTRACT_EXTENDED_DATA_H
+#define SBR_EXTRACT_EXTENDED_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.h"
+
+#ifdef PARAMETRICSTEREO
+#include    "s_ps_dec.h"
+#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 sbr_extract_extended_data(BIT_BUFFER * hBitBuf
+#ifdef PARAMETRICSTEREO         /* Parametric Stereo Decoder */
+                               , HANDLE_PS_DEC hParametricStereoDec
+#endif
+                              );
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.cpp b/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.cpp
new file mode 100644
index 0000000..fc3d38f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.cpp
@@ -0,0 +1,198 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_find_start_andstop_band.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_find_start_andstop_band.h"
+#include    "get_sbr_startfreq.h"
+#include    "get_sbr_stopfreq.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_find_start_andstop_band(const Int32 samplingFreq,
+                                      const Int32 startFreq,
+                                      const Int32 stopFreq,
+                                      Int   *lsbM,
+                                      Int   *usb)
+{
+    /* Update startFreq struct */
+    *lsbM = get_sbr_startfreq(samplingFreq, startFreq);
+
+    if (*lsbM == 0)
+    {
+        return(SBRDEC_ILLEGAL_SCFACTORS);
+    }
+
+    /*Update stopFreq struct */
+    if (stopFreq < 13)
+    {
+        *usb = get_sbr_stopfreq(samplingFreq, stopFreq);
+    }
+    else if (stopFreq == 13)
+    {
+        *usb = 64;
+    }
+    else if (stopFreq == 14)
+    {
+        *usb = (*lsbM) << 1;
+    }
+    else
+    {
+        *usb = 3 * *lsbM;
+    }
+
+    /* limit to Nyqvist */
+    if (*usb > 64)
+    {
+        *usb = 64;
+    }
+
+    /* test for invalid lsb, usb combinations */
+    if ((*usb - *lsbM) > 48)
+    {
+        /*
+         *  invalid SBR bitstream ?
+         */
+        return(SBRDEC_INVALID_BITSTREAM);
+    }
+
+    if ((samplingFreq == 44100) && ((*usb - *lsbM) > 35))
+    {
+        /*
+         *  invalid SBR bitstream ?
+         */
+        return(SBRDEC_INVALID_BITSTREAM);
+    }
+
+    if ((samplingFreq >= 48000) && ((*usb - *lsbM) > 32))
+    {
+        /*
+         *  invalid SBR bitstream ?
+         */
+        return(SBRDEC_INVALID_BITSTREAM);
+    }
+
+    return(SBRDEC_OK);
+
+}
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.h b/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.h
new file mode 100644
index 0000000..88283c6
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_find_start_andstop_band.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+ Filename: sbr_find_start_andstop_band.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_FIND_START_ANDSTOP_BAND_H
+#define SBR_FIND_START_ANDSTOP_BAND_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_sbr_error.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_find_start_andstop_band(const Int32 samplingFreq,
+                                      const Int32 startFreq,
+                                      const Int32 stopFreq,
+                                      Int *lsbM,
+                                      Int *usb);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.cpp b/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.cpp
new file mode 100644
index 0000000..2126e47
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.cpp
@@ -0,0 +1,1040 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_generate_high_freq.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    HF generator with built-in QMF bank inverse filtering function
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+
+
+#include    "sbr_generate_high_freq.h"
+#include    "calc_auto_corr.h"
+#include    "sbr_inv_filt_levelemphasis.h"
+#include    "pv_div.h"
+#include    "fxp_mul32.h"
+#include    "aac_mem_funcs.h"
+#include    "sbr_constants.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void high_freq_coeff_LC(Int32 sourceBufferReal[][32],
+    Int32 *alphar[2],
+    Int32 *degreeAlias,
+    Int32 *v_k_master,
+    Int32 *scratch_mem);
+
+
+    void high_freq_generation_LC(Int32 sourceBufferReal[][32],
+                                 Int32 *targetBufferReal,
+                                 Int32 *alphar[2],
+                                 Int32 *degreeAlias,
+                                 Int32 *invFiltBandTable,
+                                 Int32 targetStopBand,
+                                 Int32 patchDistance,
+                                 Int32 numBandsInPatch,
+                                 Int32 startSample,
+                                 Int32 slopeLength,
+                                 Int32 stopSample,
+                                 Int32 *BwVector,
+                                 Int32 sbrStartFreqOffset);
+
+
+#ifdef HQ_SBR
+
+    void high_freq_coeff(Int32 sourceBufferReal[][32],
+                         Int32 sourceBufferImag[][32],
+                         Int32 *alphar[2],
+                         Int32 *alphai[2],
+                         Int32 *v_k_master);
+
+    void high_freq_generation(Int32 sourceBufferReal[][32],
+                              Int32 sourceBufferImag[][32],
+                              Int32 *targetBufferReal,
+                              Int32 *targetBufferImag,
+                              Int32 *alphar[2],
+                              Int32 *alphai[2],
+                              Int32 *invFiltBandTable,
+                              Int32 targetStopBand,
+                              Int32 patchDistance,
+                              Int32 numBandsInPatch,
+                              Int32 startSample,
+                              Int32 slopeLength,
+                              Int32 stopSample,
+                              Int32 *BwVector,
+                              Int32 sbrStartFreqOffset);
+
+
+#endif
+
+#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 sbr_generate_high_freq(Int32 sourceBufferReal[][32],
+                            Int32 sourceBufferImag[][32],
+                            Int32 *targetBufferReal,
+                            Int32 *targetBufferImag,
+                            INVF_MODE *invFiltMode,
+                            INVF_MODE *prevInvFiltMode,
+                            Int32 *invFiltBandTable,
+                            Int32 noInvFiltBands,
+                            Int32 highBandStartSb,
+                            Int32  *v_k_master,
+                            Int32 numMaster,
+                            Int32 fs,
+                            Int32   *frameInfo,
+                            Int32 *degreeAlias,
+                            Int32  scratch_mem[][64],
+                            Int32  BwVector[MAX_NUM_PATCHES],
+                            Int32  BwVectorOld[MAX_NUM_PATCHES],
+                            struct PATCH *Patch,
+                            Int32 LC_flag,
+                            Int32 *highBandStopSb)
+{
+    Int32    i;
+    Int32    patch;
+    Int32    startSample;
+    Int32    stopSample;
+    Int32    goalSb;
+    Int32    targetStopBand;
+    Int32    sourceStartBand;
+    Int32    patchDistance;
+    Int32    numBandsInPatch;
+    Int32    sbrStartFreqOffset;
+
+    Int32  *alphar[2];
+    Int32  *alphai[2];
+
+    Int32    lsb = v_k_master[0];                           /* Lowest subband related to the synthesis filterbank */
+    Int32    usb = v_k_master[numMaster];                   /* Stop subband related to the synthesis filterbank */
+    Int32  xoverOffset = highBandStartSb - v_k_master[0]; /* Calculate distance in subbands between k0 and kx */
+
+
+
+    Int    slopeLength = 0;
+
+    Int32 firstSlotOffs = frameInfo[1];
+    Int32 lastSlotOffs  = frameInfo[frameInfo[0] + 1] - 16;
+
+
+    alphar[0] = scratch_mem[0];
+    alphar[1] = scratch_mem[1];
+    alphai[0] = scratch_mem[2];
+    alphai[1] = scratch_mem[3];
+
+
+    startSample = (firstSlotOffs << 1);
+    stopSample  = (lastSlotOffs << 1) + 32;
+
+
+    sbr_inv_filt_levelemphasis(invFiltMode,
+                               prevInvFiltMode,
+                               noInvFiltBands,
+                               BwVector,
+                               BwVectorOld);
+
+
+    if (LC_flag == ON)
+    {
+        /* Set subbands to zero  */
+
+        pv_memset((void *)&targetBufferReal[startSample*SBR_NUM_BANDS],
+                  0,
+                  (stopSample - startSample)*SBR_NUM_BANDS*sizeof(targetBufferReal[0]));
+
+        high_freq_coeff_LC(sourceBufferReal,
+                           alphar,
+                           degreeAlias,
+                           v_k_master,
+                           scratch_mem[4]);
+    }
+#ifdef HQ_SBR
+    else
+    {
+        /* Set subbands to zero  */
+
+        pv_memset((void *)&targetBufferReal[startSample*SBR_NUM_BANDS],
+                  0,
+                  (stopSample - startSample)*SBR_NUM_BANDS*sizeof(targetBufferReal[0]));
+        pv_memset((void *)&targetBufferImag[startSample*SBR_NUM_BANDS],
+                  0,
+                  (stopSample - startSample)*SBR_NUM_BANDS*sizeof(targetBufferImag[0]));
+
+        high_freq_coeff(sourceBufferReal,
+                        sourceBufferImag,
+                        alphar,
+                        alphai,
+                        v_k_master);
+
+    }
+#endif     /*  #ifdef HQ_SBR */
+
+
+
+
+    /*
+     * Initialize the patching parameter
+     */
+    switch (fs)
+
+    {
+            /*
+             *  goalSb = (int)( 2.048e6f / fs + 0.5f );
+             */
+        case 48000:
+            goalSb = 43;  /* 16 kHz band */
+            break;
+        case 32000:
+            goalSb = 64;  /* 16 kHz band */
+            break;
+        case 24000:
+            goalSb = 85;  /* 16 kHz band */
+            break;
+        case 22050:
+            goalSb = 93;  /* 16 kHz band */
+            break;
+        case 16000:
+            goalSb = 128;  /* 16 kHz band */
+            break;
+        case 44100:
+        default:
+            goalSb = 46;  /* 16 kHz band */
+            break;
+    }
+
+    i = 0;
+
+    if (goalSb > v_k_master[0])
+    {
+        if (goalSb < v_k_master[numMaster])
+        {
+            while (v_k_master[i] < goalSb)
+            {
+                i++;
+            }
+        }
+        else
+        {
+            i = numMaster;
+        }
+    }
+
+    goalSb =  v_k_master[i];
+
+    /* First patch */
+    sourceStartBand = xoverOffset + 1;
+    targetStopBand = lsb + xoverOffset;
+
+    /* even (odd) numbered channel must be patched to even (odd) numbered channel */
+    patch = 0;
+
+
+    sbrStartFreqOffset = targetStopBand;
+
+    while (targetStopBand < usb)
+    {
+        Patch->targetStartBand[patch] = targetStopBand;
+
+        numBandsInPatch = goalSb - targetStopBand;                   /* get the desired range of the patch */
+
+        if (numBandsInPatch >= lsb - sourceStartBand)
+        {
+            /* desired number bands are not available -> patch whole source range */
+            patchDistance   = targetStopBand - sourceStartBand;        /* get the targetOffset */
+            patchDistance   = patchDistance & ~1;                      /* rounding off odd numbers and make all even */
+            numBandsInPatch = lsb - (targetStopBand - patchDistance);
+
+            if (targetStopBand + numBandsInPatch > v_k_master[0])
+            {
+                i = numMaster;
+                if (targetStopBand + numBandsInPatch < v_k_master[numMaster])
+                {
+                    while (v_k_master[i] > targetStopBand + numBandsInPatch)
+                    {
+                        i--;
+                    }
+                }
+            }
+            else
+            {
+                i = 0;
+            }
+            numBandsInPatch =  v_k_master[i] - targetStopBand;
+        }
+
+        /* desired number bands are available -> get the minimal even patching distance */
+        patchDistance   = numBandsInPatch + targetStopBand - lsb;  /* get minimal distance */
+        patchDistance   = (patchDistance + 1) & ~1;                /* rounding up odd numbers and make all even */
+
+        /* All patches but first */
+        sourceStartBand = 1;
+
+        /* Check if we are close to goalSb */
+        if (goalSb - (targetStopBand + numBandsInPatch) < 3)
+        { /* MPEG doc */
+            goalSb = usb;
+        }
+
+
+        if ((numBandsInPatch < 3) && (patch > 0))
+        {
+            if (LC_flag == ON)
+            {
+
+                pv_memset((void *) &degreeAlias[targetStopBand], 0, numBandsInPatch*sizeof(*degreeAlias));
+            }
+            break;
+        }
+
+        if (numBandsInPatch <= 0)
+        {
+            continue;
+        }
+
+
+        /*
+         *  High Frequency generation
+         */
+
+        if (LC_flag == ON)
+        {
+
+            high_freq_generation_LC(sourceBufferReal,
+                                    (Int32 *)targetBufferReal,
+                                    alphar,
+                                    degreeAlias,
+                                    invFiltBandTable,
+                                    targetStopBand,
+                                    patchDistance,
+                                    numBandsInPatch,
+                                    startSample,
+                                    slopeLength,
+                                    stopSample,
+                                    BwVector,
+                                    sbrStartFreqOffset);
+
+        }
+#ifdef HQ_SBR
+        else
+        {
+
+            high_freq_generation(sourceBufferReal,
+                                 sourceBufferImag,
+                                 (Int32 *)targetBufferReal,
+                                 (Int32 *)targetBufferImag,
+                                 alphar,
+                                 alphai,
+                                 invFiltBandTable,
+                                 targetStopBand,
+                                 patchDistance,
+                                 numBandsInPatch,
+                                 startSample,
+                                 slopeLength,
+                                 stopSample,
+                                 BwVector,
+                                 sbrStartFreqOffset);
+
+        }
+#endif
+
+        targetStopBand += numBandsInPatch;
+
+        patch++;
+
+    }  /* targetStopBand */
+
+    Patch->noOfPatches = patch;
+
+    pv_memmove(BwVectorOld, BwVector, noInvFiltBands*sizeof(BwVector[0]));
+
+    *highBandStopSb = goalSb;
+
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void high_freq_coeff_LC(Int32 sourceBufferReal[][32],
+                        Int32 *alphar[2],
+                        Int32 *degreeAlias,
+                        Int32 *v_k_master,
+                        Int32 *scratch_mem)
+{
+
+    Int32  fac;
+    Int32 *k1;
+    struct ACORR_COEFS ac;
+    struct intg_div  quotient;
+
+    Int32 temp1;
+    Int32 temp2;
+    Int32 temp3;
+    Int32 autoCorrLength;
+    Int32 loBand;
+
+    k1 = scratch_mem;
+
+
+    autoCorrLength = 38;
+
+    for (loBand = 1; loBand < v_k_master[0]; loBand++)
+    {
+
+        calc_auto_corr_LC(&ac,
+                          sourceBufferReal,
+                          loBand,
+                          autoCorrLength);
+
+        if (ac.r11r && ac.det)
+        {
+
+            pv_div(ac.r01r, ac.r11r, &quotient);
+
+            fac = -(quotient.quotient >> 2);   /*  Q28 */
+
+            if (quotient.shift_factor > 0)
+            {
+                fac >>= quotient.shift_factor;    /* Q28 */
+            }
+            else if (quotient.shift_factor < 0)
+            {
+                if (quotient.shift_factor > -4)     /* |fac| < 8 */
+                {
+                    fac <<= (-quotient.shift_factor); /* Q28 */
+                }
+                else
+                {
+                    fac = 0x80000000;     /* overshoot possible fac = -8 */
+                }
+            }
+
+            /*
+             *  prevent for overflow of reflection coefficients
+             */
+            if (quotient.shift_factor > 0)
+            {
+                k1[loBand] = - quotient.quotient >> quotient.shift_factor;
+            }
+            else if (quotient.shift_factor == 0)
+            {
+                if (quotient.quotient >= 0x40000000)
+                {
+                    k1[loBand] = (Int32)0xC0000000;   /* -1.0 in Q30  */
+                }
+                else if (quotient.quotient <= (Int32)0xC0000000)
+                {
+                    k1[loBand] = 0x40000000;   /*  1.0 in Q30  */
+                }
+                else
+                {
+                    k1[loBand] = -quotient.quotient;
+                }
+            }
+            else
+            {
+                if (quotient.quotient > 0)
+                {
+                    k1[loBand] = (Int32)0xC0000000;   /* -1.0 in Q30  */
+                }
+                else
+                {
+                    k1[loBand] = 0x40000000;   /*  1.0 in Q30  */
+                }
+            }
+            /*
+             *   alphar[1][loBand] = ( ac.r01r * ac.r12r - ac.r02r * ac.r11r ) / ac.det;
+             */
+
+            temp1  = -fxp_mul32_Q30(ac.r02r, ac.r11r);
+            temp1  =  fxp_mac32_Q30(ac.r01r, ac.r12r, temp1);
+
+            temp2 = ac.det;
+            temp3 = temp1 > 0 ? temp1 : -temp1;
+            temp2 = temp2 > 0 ? temp2 : -temp2;
+
+            /* prevent for shootovers */
+            if ((temp3 >> 2) >= temp2 || fac == (Int32)0x80000000)
+            {
+                alphar[0][loBand] = 0;
+                alphar[1][loBand] = 0;
+            }
+            else
+            {
+                pv_div(temp1, ac.det, &quotient);
+                /*
+                 *  alphar[1][loBand] is lesser than 4.0
+                 */
+                alphar[1][loBand] = quotient.quotient;
+                quotient.shift_factor += 2;             /* Q28 */
+
+                if (quotient.shift_factor > 0)
+                {
+                    alphar[1][loBand] >>= quotient.shift_factor;    /* Q28 */
+                }
+                else if (quotient.shift_factor < 0)     /* at this point can only be -1 */
+                {
+                    alphar[1][loBand] <<= (-quotient.shift_factor); /* Q28 */
+                }
+
+                /*
+                 *  alphar[0][loBand] = - ( ac.r01r + alphar[1][loBand] * ac.r12r ) / ac.r11r;
+                 */
+
+                pv_div(ac.r12r, ac.r11r, &quotient);
+
+                temp3 = (quotient.quotient >> 2);       /*  Q28 */
+
+                if (quotient.shift_factor > 0)
+                {
+                    temp3 >>= quotient.shift_factor;    /* Q28 */
+                }
+                else if (quotient.shift_factor < 0)
+                {
+                    temp3 <<= (-quotient.shift_factor); /* Q28 */
+                }
+
+                alphar[0][loBand] = fac - fxp_mul32_Q28(alphar[1][loBand], temp3) ;    /* Q28 */
+
+                if ((alphar[0][loBand] >= 0x40000000) || (alphar[0][loBand] <= (Int32)0xC0000000))
+                {
+                    alphar[0][loBand] = 0;
+                    alphar[1][loBand] = 0;
+                }
+
+            }
+
+        }
+        else
+        {
+            alphar[0][loBand] = 0;
+            alphar[1][loBand] = 0;
+
+            k1[loBand] = 0;
+        }
+
+    }
+
+    k1[0] = 0;
+    degreeAlias[1] = 0;
+    for (loBand = 2; loBand < v_k_master[0]; loBand++)
+    {
+        degreeAlias[loBand] = 0;
+        if ((!(loBand & 1)) && (k1[loBand] < 0))
+        {
+            if (k1[loBand-1] < 0)
+            { // 2-CH Aliasing Detection
+                degreeAlias[loBand]   = 0x40000000;
+                if (k1[loBand-2] > 0)
+                { // 3-CH Aliasing Detection
+                    degreeAlias[loBand-1] = 0x40000000 - fxp_mul32_Q30(k1[loBand-1], k1[loBand-1]);
+
+                }
+            }
+            else if (k1[loBand-2] > 0)
+            { // 3-CH Aliasing Detection
+                degreeAlias[loBand] = 0x40000000 - fxp_mul32_Q30(k1[loBand-1], k1[loBand-1]);
+            }
+        }
+        if ((loBand & 1) && (k1[loBand] > 0))
+        {
+            if (k1[loBand-1] > 0)
+            { // 2-CH Aliasing Detection
+                degreeAlias[loBand]   = 0x40000000;
+                if (k1[loBand-2] < 0)
+                { // 3-CH Aliasing Detection
+                    degreeAlias[loBand-1] = 0x40000000 - fxp_mul32_Q30(k1[loBand-1], k1[loBand-1]);
+                }
+            }
+            else if (k1[loBand-2] < 0)
+            { // 3-CH Aliasing Detection
+                degreeAlias[loBand] = 0x40000000 - fxp_mul32_Q30(k1[loBand-1], k1[loBand-1]);
+            }
+        }
+    }
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void high_freq_generation_LC(Int32 sourceBufferReal[][32],
+                             Int32 *targetBufferReal,
+                             Int32 *alphar[2],
+                             Int32 *degreeAlias,
+                             Int32 *invFiltBandTable,
+                             Int32 targetStopBand,
+                             Int32 patchDistance,
+                             Int32 numBandsInPatch,
+                             Int32 startSample,
+                             Int32 slopeLength,
+                             Int32 stopSample,
+                             Int32 *BwVector,
+                             Int32 sbrStartFreqOffset)
+{
+
+    Int32  temp1;
+    Int32  temp2;
+    Int32  temp3;
+
+
+    Int32  a0r;
+    Int32  a1r;
+    Int32  i;
+    Int32  bw;
+    Int32  hiBand;
+    Int32  bwIndex;
+    Int32  loBand;
+    Int32  j;
+
+    bwIndex = 0;
+
+    for (hiBand = targetStopBand; hiBand < targetStopBand + numBandsInPatch; hiBand++)
+    {
+        loBand = hiBand - patchDistance;
+
+        if (hiBand != targetStopBand)
+        {
+            degreeAlias[hiBand] = degreeAlias[loBand];
+        }
+        else
+        {
+            degreeAlias[hiBand] = 0;
+        }
+
+        while (hiBand >= invFiltBandTable[bwIndex])
+        {
+            bwIndex++;
+        }
+
+        bw = BwVector[bwIndex];
+
+        /*
+         *  Inverse Filtering
+         */
+
+
+        j = hiBand - sbrStartFreqOffset;
+
+        if (bw > 0 && (alphar[0][loBand] | alphar[1][loBand]))
+        {
+            /* Apply current bandwidth expansion factor */
+            a0r = fxp_mul32_Q29(bw, alphar[0][loBand]);
+
+            bw  = fxp_mul32_Q31(bw, bw) << 2;
+
+            a1r = fxp_mul32_Q28(bw, alphar[1][loBand]);
+
+            i = startSample + slopeLength;
+
+            temp1 = sourceBufferReal[i    ][loBand];
+            temp2 = sourceBufferReal[i - 1][loBand];
+            temp3 = sourceBufferReal[i - 2][loBand];
+
+            for (; i < stopSample + slopeLength - 1; i++)
+            {
+
+
+                targetBufferReal[i*SBR_NUM_BANDS + j] = temp1 + fxp_mul32_Q28(a0r, temp2)  +
+                                                        fxp_mul32_Q28(a1r, temp3);
+
+
+                temp3 = temp2;
+                temp2 = temp1;
+                temp1 = sourceBufferReal[i + 1][loBand];
+            }
+            targetBufferReal[i*SBR_NUM_BANDS + j] = temp1 + fxp_mul32_Q28(a0r, temp2)  +
+                                                    fxp_mul32_Q28(a1r, temp3);
+
+        }
+        else
+        {
+
+            for (i = startSample + slopeLength; i < stopSample + slopeLength; i++)
+            {
+                targetBufferReal[i*SBR_NUM_BANDS + j] = sourceBufferReal[i][loBand];
+            }
+        }
+
+
+    }  /* hiBand */
+
+}
+
+
+#ifdef HQ_SBR
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void high_freq_coeff(Int32 sourceBufferReal[][32],
+                     Int32 sourceBufferImag[][32],
+                     Int32 *alphar[2],
+                     Int32 *alphai[2],
+                     Int32 *v_k_master)
+{
+
+    Int32  overflow_flag;
+
+    Int32  temp1r;
+    Int32  temp1i;
+    Int32  temp0r;
+    Int32  temp0i;
+    Int32  loBand;
+
+    struct ACORR_COEFS ac;
+    struct intg_div  quotient;
+
+    Int32 autoCorrLength;
+
+    autoCorrLength = 38;
+
+    for (loBand = 1; loBand < v_k_master[0]; loBand++)
+    {
+
+        calc_auto_corr(&ac,
+                       sourceBufferReal,
+                       sourceBufferImag,
+                       loBand,
+                       autoCorrLength);
+
+
+        overflow_flag = 0;
+
+        if (ac.det < 1)
+        {
+            /* ---  */
+            temp1r = 0;
+            temp1i = 0;
+            alphar[1][loBand] = 0;
+            alphai[1][loBand] = 0;
+
+        }
+        else
+        {
+
+            temp1r =  fxp_mul32_Q29(ac.r01r, ac.r12r);
+            temp1r =  fxp_msu32_Q29(ac.r01i, ac.r12i, temp1r);
+            temp1r =  fxp_msu32_Q29(ac.r02r, ac.r11r, temp1r);
+
+            temp1i =  fxp_mul32_Q29(ac.r01r, ac.r12i);
+            temp1i =  fxp_msu32_Q29(ac.r02i, ac.r11r, temp1i);
+            temp1i =  fxp_mac32_Q29(ac.r01i, ac.r12r, temp1i);
+
+            pv_div(temp1r, ac.det, &quotient);
+            overflow_flag = (quotient.shift_factor < -2) ? 1 : 0;
+            temp1r = quotient.quotient >> (2 + quotient.shift_factor);   /*  Q28 */
+            pv_div(temp1i, ac.det, &quotient);
+            overflow_flag = (quotient.shift_factor < -2) ? 1 : 0;
+            temp1i = quotient.quotient >> (2 + quotient.shift_factor);   /*  Q28 */
+
+            alphar[1][loBand] = temp1r;
+            alphai[1][loBand] = temp1i;
+
+        }
+
+        if (ac.r11r == 0)
+        {
+            temp0r = 0;
+            temp0i = 0;
+            alphar[0][loBand] = 0;
+            alphai[0][loBand] = 0;
+
+        }
+        else
+        {
+            temp0r = - (ac.r01r + fxp_mul32_Q28(temp1r, ac.r12r) + fxp_mul32_Q28(temp1i, ac.r12i));
+            temp0i = - (ac.r01i + fxp_mul32_Q28(temp1i, ac.r12r) - fxp_mul32_Q28(temp1r, ac.r12i));
+
+            pv_div(temp0r, ac.r11r, &quotient);
+            overflow_flag = (quotient.shift_factor < -2) ? 1 : 0;
+            temp0r = quotient.quotient >> (2 + quotient.shift_factor);   /*  Q28 */
+            pv_div(temp0i, ac.r11r, &quotient);
+            overflow_flag = (quotient.shift_factor < -2) ? 1 : 0;
+            temp0i = quotient.quotient >> (2 + quotient.shift_factor);   /*  Q28 */
+
+            alphar[0][loBand] = temp0r;
+            alphai[0][loBand] = temp0i;
+
+        }
+
+        /* prevent for shootovers */
+
+        if (fxp_mul32_Q28((temp0r >> 2), (temp0r >> 2)) + fxp_mul32_Q28((temp0i >> 2), (temp0i >> 2)) >= 0x10000000 ||
+                fxp_mul32_Q28((temp1r >> 2), (temp1r >> 2)) + fxp_mul32_Q28((temp1i >> 2), (temp1i >> 2)) >= 0x10000000 ||
+                overflow_flag)     /*  0x10000000 == 1 in Q28 */
+
+        {
+            alphar[0][loBand] = 0;
+            alphar[1][loBand] = 0;
+            alphai[0][loBand] = 0;
+            alphai[1][loBand] = 0;
+
+        }
+    }
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+void high_freq_generation(Int32 sourceBufferReal[][32],
+                          Int32 sourceBufferImag[][32],
+                          Int32 *targetBufferReal,
+                          Int32 *targetBufferImag,
+                          Int32 *alphar[2],
+                          Int32 *alphai[2],
+                          Int32 *invFiltBandTable,
+                          Int32 targetStopBand,
+                          Int32 patchDistance,
+                          Int32 numBandsInPatch,
+                          Int32 startSample,
+                          Int32 slopeLength,
+                          Int32 stopSample,
+                          Int32 *BwVector,
+                          Int32 sbrStartFreqOffset)
+{
+    Int32  temp1_r;
+    Int32  temp2_r;
+    Int32  temp3_r;
+    Int32  temp1_i;
+    Int32  temp2_i;
+    Int32  temp3_i;
+
+
+    Int32  a0i;
+    Int32  a1i;
+    Int32  a0r;
+    Int32  a1r;
+    Int32  i;
+    Int32  bw;
+    Int32  hiBand;
+    Int32  bwIndex;
+    Int32  loBand;
+    Int32  j;
+
+
+
+    int64_t tmp;
+
+    bwIndex = 0;
+
+    for (hiBand = targetStopBand; hiBand < targetStopBand + numBandsInPatch; hiBand++)
+    {
+
+        loBand = hiBand - patchDistance;
+
+        while (hiBand >= invFiltBandTable[bwIndex])
+        {
+            bwIndex++;
+        }
+
+        bw = BwVector[bwIndex];
+
+        /*
+         *  Inverse Filtering
+         */
+
+
+        j = hiBand - sbrStartFreqOffset;
+
+        if (bw >= 0 && (alphar[0][loBand] | alphar[1][loBand] |
+                        alphai[0][loBand] | alphai[1][loBand]))
+        {
+            /* Apply current bandwidth expansion factor */
+            a0r = fxp_mul32_Q29(bw, alphar[0][loBand]);
+            a0i = fxp_mul32_Q29(bw, alphai[0][loBand]);
+
+
+            bw  = fxp_mul32_Q30(bw, bw);
+
+
+            a1r = fxp_mul32_Q28(bw, alphar[1][loBand]);
+            a1i = fxp_mul32_Q28(bw, alphai[1][loBand]);
+
+
+            i  = startSample + slopeLength;
+            j += i * SBR_NUM_BANDS;
+
+            temp1_r = sourceBufferReal[i    ][loBand];
+            temp2_r = sourceBufferReal[i - 1][loBand];
+            temp3_r = sourceBufferReal[i - 2][loBand];
+
+            temp1_i = sourceBufferImag[i    ][loBand];
+            temp2_i = sourceBufferImag[i - 1][loBand];
+            temp3_i = sourceBufferImag[i - 2][loBand];
+
+            while (i < stopSample + slopeLength)
+            {
+                tmp =  fxp_mac64_Q31(((int64_t)temp1_r << 28),  a0r, temp2_r);
+                tmp =  fxp_mac64_Q31(tmp, -a0i, temp2_i);
+                tmp =  fxp_mac64_Q31(tmp,  a1r, temp3_r);
+                targetBufferReal[j] = (Int32)(fxp_mac64_Q31(tmp, -a1i, temp3_i) >> 28);
+
+                tmp =  fxp_mac64_Q31(((int64_t)temp1_i << 28),  a0i, temp2_r);
+                tmp =  fxp_mac64_Q31(tmp,  a0r, temp2_i);
+                tmp =  fxp_mac64_Q31(tmp,  a1i, temp3_r);
+                targetBufferImag[j] = (Int32)(fxp_mac64_Q31(tmp,  a1r, temp3_i) >> 28);
+
+                i++;
+                j += SBR_NUM_BANDS;
+
+                temp3_r  = temp2_r;
+                temp2_r  = temp1_r;
+                temp1_r  = sourceBufferReal[i ][loBand];
+
+                temp3_i  = temp2_i;
+                temp2_i  = temp1_i;
+                temp1_i  = sourceBufferImag[i ][loBand];
+
+            }
+
+        }
+
+
+
+        else
+        {
+            i = startSample + slopeLength;
+            j += i * SBR_NUM_BANDS;
+
+            for (; i < stopSample + slopeLength; i++)
+            {
+                targetBufferReal[j] = sourceBufferReal[i][loBand];
+                targetBufferImag[j] = sourceBufferImag[i][loBand];
+                j += SBR_NUM_BANDS;
+            }
+        }
+    }
+}
+
+#endif
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.h b/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.h
new file mode 100644
index 0000000..0e9c928
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_generate_high_freq.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_generate_high_freq.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GENERATE_HIGH_FREQ_H
+#define SBR_GENERATE_HIGH_FREQ_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "e_invf_mode.h"
+#include    "s_patch.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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 sbr_generate_high_freq(
+        Int32 sourceBufferReal[][32],
+        Int32 sourceBufferImag[][32],
+        Int32 *targetBufferReal,
+        Int32 *targetBufferImag,
+        INVF_MODE *invFiltMode,
+        INVF_MODE *prevInvFiltMode,
+        Int32 *invFiltBandTable,
+        Int32 noInvFiltBands,
+        Int32 highBandStartSb,
+        Int32 *v_k_master,
+        Int32 numMaster,
+        Int32 fs,
+        Int32 *frameInfo,
+        Int32 *degreeAlias,
+        Int32 scratch_mem[][64],
+        Int32 BwVector[MAX_NUM_PATCHES],
+        Int32 BwVectorOld[MAX_NUM_PATCHES],
+        struct PATCH * Patch,
+        Int32 LC_flag,
+        Int32 *highBandStopSb);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_additional_data.cpp b/media/libstagefright/codecs/aacdec/sbr_get_additional_data.cpp
new file mode 100644
index 0000000..60072dd
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_additional_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_additional_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_additional_data.h"
+#include    "buf_getbits.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 sbr_get_additional_data(SBR_FRAME_DATA * hFrameData,
+                             BIT_BUFFER     * hBitBuf)
+{
+    Int32 i;
+
+    Int32 flag = buf_getbits(hBitBuf, 1);
+
+    if (flag)
+    {
+        for (i = 0; i < hFrameData->nSfb[HI]; i++)
+        {
+            hFrameData->addHarmonics[i] = buf_getbits(hBitBuf, 1);
+        }
+    }
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_additional_data.h b/media/libstagefright/codecs/aacdec/sbr_get_additional_data.h
new file mode 100644
index 0000000..51285c5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_additional_data.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_additional_data.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_ADDITIONAL_DATA_H
+#define SBR_GET_ADDITIONAL_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_header_data.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+void sbr_get_additional_data(SBR_FRAME_DATA * hFrameData,
+                             BIT_BUFFER     * hBitBuf);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_cpe.cpp b/media/libstagefright/codecs/aacdec/sbr_get_cpe.cpp
new file mode 100644
index 0000000..657d032
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_cpe.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_cpe.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     hFrameDataLeft  - handle to struct SBR_FRAME_DATA for first channel
+                hFrameDataRight - handle to struct SBR_FRAME_DATA for first channel
+                hBitBuf         - handle to struct BIT_BUF
+
+ Return:        SbrFrameOK
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_cpe.h"
+#include    "buf_getbits.h"
+#include    "extractframeinfo.h"
+#include    "sbr_get_dir_control_data.h"
+#include    "sbr_get_envelope.h"
+#include    "sbr_get_noise_floor_data.h"
+#include    "sbr_get_additional_data.h"
+#include    "sbr_extract_extended_data.h"
+#include    "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+
+SBR_ERROR sbr_get_cpe(SBR_FRAME_DATA * hFrameDataLeft,
+                      SBR_FRAME_DATA * hFrameDataRight,
+                      BIT_BUFFER  * hBitBuf)
+{
+    Int32 i;
+    Int32 bits;
+    SBR_ERROR err =  SBRDEC_OK;
+
+    /* reserved bits */
+    bits = buf_getbits(hBitBuf, SI_SBR_RESERVED_PRESENT);
+
+    if (bits)
+    {
+        buf_getbits(hBitBuf, SI_SBR_RESERVED_BITS_DATA);
+        buf_getbits(hBitBuf, SI_SBR_RESERVED_BITS_DATA);
+    }
+
+    /* Read coupling flag */
+    bits = buf_getbits(hBitBuf, SI_SBR_COUPLING_BITS);
+
+    if (bits)
+    {
+        hFrameDataLeft->coupling = COUPLING_LEVEL;
+        hFrameDataRight->coupling = COUPLING_BAL;
+    }
+    else
+    {
+        hFrameDataLeft->coupling = COUPLING_OFF;
+        hFrameDataRight->coupling = COUPLING_OFF;
+    }
+
+
+    err = extractFrameInfo(hBitBuf, hFrameDataLeft);
+
+    if (err != SBRDEC_OK)
+    {
+        return err;
+    }
+
+    if (hFrameDataLeft->coupling)
+    {
+
+        pv_memcpy(hFrameDataRight->frameInfo,
+                  hFrameDataLeft->frameInfo,
+                  LENGTH_FRAME_INFO * sizeof(Int32));
+
+        hFrameDataRight->nNoiseFloorEnvelopes = hFrameDataLeft->nNoiseFloorEnvelopes;
+        hFrameDataRight->frameClass = hFrameDataLeft->frameClass;
+
+
+        sbr_get_dir_control_data(hFrameDataLeft, hBitBuf);
+        sbr_get_dir_control_data(hFrameDataRight, hBitBuf);
+
+        for (i = 0; i < hFrameDataLeft->nNfb; i++)
+        {
+            hFrameDataLeft->sbr_invf_mode_prev[i]  = hFrameDataLeft->sbr_invf_mode[i];
+            hFrameDataRight->sbr_invf_mode_prev[i] = hFrameDataRight->sbr_invf_mode[i];
+
+            hFrameDataLeft->sbr_invf_mode[i]  = (INVF_MODE) buf_getbits(hBitBuf, SI_SBR_INVF_MODE_BITS);
+            hFrameDataRight->sbr_invf_mode[i] = hFrameDataLeft->sbr_invf_mode[i];
+        }
+
+        sbr_get_envelope(hFrameDataLeft, hBitBuf);
+        sbr_get_noise_floor_data(hFrameDataLeft, hBitBuf);
+        sbr_get_envelope(hFrameDataRight, hBitBuf);
+
+    }
+    else
+    {
+        err = extractFrameInfo(hBitBuf, hFrameDataRight);
+
+        if (err != SBRDEC_OK)
+        {
+            return err;
+        }
+
+
+        sbr_get_dir_control_data(hFrameDataLeft,  hBitBuf);
+        sbr_get_dir_control_data(hFrameDataRight, hBitBuf);
+
+        for (i = 0; i <  hFrameDataLeft->nNfb; i++)
+        {
+            hFrameDataLeft->sbr_invf_mode_prev[i]  = hFrameDataLeft->sbr_invf_mode[i];
+            hFrameDataLeft->sbr_invf_mode[i]  =
+                (INVF_MODE) buf_getbits(hBitBuf, SI_SBR_INVF_MODE_BITS);
+        }
+
+        for (i = 0; i <  hFrameDataRight->nNfb; i++)
+        {
+            hFrameDataRight->sbr_invf_mode_prev[i] = hFrameDataRight->sbr_invf_mode[i];
+
+            hFrameDataRight->sbr_invf_mode[i] =
+                (INVF_MODE) buf_getbits(hBitBuf, SI_SBR_INVF_MODE_BITS);
+        }
+        sbr_get_envelope(hFrameDataLeft,  hBitBuf);
+        sbr_get_envelope(hFrameDataRight, hBitBuf);
+
+        sbr_get_noise_floor_data(hFrameDataLeft,  hBitBuf);
+
+    }
+
+    sbr_get_noise_floor_data(hFrameDataRight, hBitBuf);
+
+    pv_memset((void *)hFrameDataLeft->addHarmonics,
+              0,
+              hFrameDataLeft->nSfb[HI]*sizeof(Int32));
+
+    pv_memset((void *)hFrameDataRight->addHarmonics,
+              0,
+              hFrameDataRight->nSfb[HI]*sizeof(Int32));
+
+    sbr_get_additional_data(hFrameDataLeft, hBitBuf);
+    sbr_get_additional_data(hFrameDataRight, hBitBuf);
+
+    sbr_extract_extended_data(hBitBuf
+#ifdef PARAMETRICSTEREO
+                              , NULL
+#endif
+                             );
+
+    return SBRDEC_OK;
+
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_cpe.h b/media/libstagefright/codecs/aacdec/sbr_get_cpe.h
new file mode 100644
index 0000000..b6f99f8
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_cpe.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_cpe.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_CPE_H
+#define SBR_GET_CPE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.h"
+#include    "e_sbr_error.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_get_cpe(SBR_FRAME_DATA * hFrameDataLeft,
+                      SBR_FRAME_DATA * hFrameDataRight,
+                      BIT_BUFFER * hBitBuf);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.cpp b/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.cpp
new file mode 100644
index 0000000..3d7ad8c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_dir_control_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     h_frame_data - handle to struct SBR_FRAME_DATA
+                hBitBuf      - handle to struct BIT_BUF
+
+ Return:        void
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+  Reads direction control data from bitstream
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_dir_control_data.h"
+#include    "buf_getbits.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 sbr_get_dir_control_data(SBR_FRAME_DATA * h_frame_data,
+                              BIT_BUFFER     * hBitBuf)
+{
+    Int32 i;
+
+    h_frame_data->nNoiseFloorEnvelopes = h_frame_data->frameInfo[0] > 1 ? 2 : 1;
+
+
+    for (i = 0; i < h_frame_data->frameInfo[0]; i++)
+    {
+        h_frame_data->domain_vec1[i] = buf_getbits(hBitBuf, SI_SBR_DOMAIN_BITS);
+    }
+
+    for (i = 0; i < h_frame_data->nNoiseFloorEnvelopes; i++)
+    {
+        h_frame_data->domain_vec2[i] = buf_getbits(hBitBuf, SI_SBR_DOMAIN_BITS);
+    }
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.h b/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.h
new file mode 100644
index 0000000..3b587dc
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_dir_control_data.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_dir_control_data.h
+ Funtions:
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_DIR_CONTROL_DATA_H
+#define SBR_GET_DIR_CONTROL_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+void sbr_get_dir_control_data(SBR_FRAME_DATA * h_frame_data,
+                              BIT_BUFFER * hBitBuf);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_envelope.cpp b/media/libstagefright/codecs/aacdec/sbr_get_envelope.cpp
new file mode 100644
index 0000000..e92abb1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_envelope.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_envelope.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     h_frame_data - handle to struct SBR_FRAME_DATA
+                hBitBuf      - handle to struct BIT_BUF
+                channel      - channel number
+
+ Return:        void
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+          Reads envelope data from bitstream
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_envelope.h"
+#include    "s_huffman.h"
+#include    "e_coupling_mode.h"
+#include    "sbr_code_book_envlevel.h"
+#include    "buf_getbits.h"
+#include    "sbr_decode_huff_cw.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 sbr_get_envelope(SBR_FRAME_DATA * h_frame_data,
+                      BIT_BUFFER * hBitBuf)
+{
+    Int32   i;
+    Int32   j;
+    Int32   tmp;
+    Int32   no_band[MAX_ENVELOPES];
+    Int32   delta = 0;
+    Int32   offset = 0;
+    Int32   ampRes;
+    Int32   envDataTableCompFactor;
+    Int32   start_bits;
+    Int32   start_bits_balance;
+    SbrHuffman    hcb_t;
+    SbrHuffman    hcb_f;
+    COUPLING_MODE coupling = h_frame_data->coupling;
+
+    h_frame_data->nScaleFactors = 0;
+
+    if ((h_frame_data->frameClass   == FIXFIX) &&
+            (h_frame_data->frameInfo[0] == 1))
+    {
+        h_frame_data->ampRes = SBR_AMP_RES_1_5;
+    }
+    else
+    {
+        h_frame_data->ampRes = h_frame_data->sbr_header.ampResolution;
+    }
+
+    ampRes = h_frame_data->ampRes;
+
+    /*
+     *    Set number of bits for first value depending on amplitude resolution
+     */
+    if (ampRes == SBR_AMP_RES_3_0)
+    {
+        start_bits         = SI_SBR_START_ENV_BITS_AMP_RES_3_0;
+        start_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_3_0;
+    }
+    else
+    {
+        start_bits         = SI_SBR_START_ENV_BITS_AMP_RES_1_5;
+        start_bits_balance = SI_SBR_START_ENV_BITS_BALANCE_AMP_RES_1_5;
+    }
+
+    /*
+     *    Calculate number of values for each envelope and alltogether
+     */
+    for (i = 0; i < h_frame_data->frameInfo[0]; i++)
+    {
+        no_band[i] =
+            h_frame_data->nSfb[h_frame_data->frameInfo[h_frame_data->frameInfo[0] + 2 + i]];
+        h_frame_data->nScaleFactors += no_band[i];
+    }
+
+
+    /*
+     *    Select huffman codebook depending on coupling mode and amplitude resolution
+     */
+    if (coupling == COUPLING_BAL)
+    {
+        envDataTableCompFactor = 1;
+        if (ampRes == SBR_AMP_RES_1_5)
+        {
+            hcb_t = bookSbrEnvBalance10T;
+            hcb_f = bookSbrEnvBalance10F;
+        }
+        else
+        {
+            hcb_t = bookSbrEnvBalance11T;
+            hcb_f = bookSbrEnvBalance11F;
+        }
+    }
+    else
+    {
+        envDataTableCompFactor = 0;
+        if (ampRes == SBR_AMP_RES_1_5)
+        {
+            hcb_t = bookSbrEnvLevel10T;
+            hcb_f = bookSbrEnvLevel10F;
+        }
+        else
+        {
+            hcb_t = bookSbrEnvLevel11T;
+            hcb_f = bookSbrEnvLevel11F;
+        }
+    }
+
+    /*
+     *    Now read raw envelope data
+     */
+    for (j = 0; j < h_frame_data->frameInfo[0]; j++)
+    {
+        if (h_frame_data->domain_vec1[j] == FREQ)
+        {
+            if (coupling == COUPLING_BAL)
+            {
+                tmp = buf_getbits(hBitBuf, start_bits_balance);
+                h_frame_data->iEnvelope_man[offset] = tmp << envDataTableCompFactor;
+            }
+            else
+            {
+                tmp = buf_getbits(hBitBuf, start_bits);
+                h_frame_data->iEnvelope_man[offset] = tmp;
+            }
+        }
+
+        for (i = (1 - h_frame_data->domain_vec1[j]); i < no_band[j]; i++)
+        {
+
+            if (h_frame_data->domain_vec1[j] == FREQ)
+            {
+                delta = sbr_decode_huff_cw(hcb_f, hBitBuf);
+            }
+            else
+            {
+                delta = sbr_decode_huff_cw(hcb_t, hBitBuf);
+            }
+
+            h_frame_data->iEnvelope_man[offset + i] = delta << envDataTableCompFactor;
+        }
+        offset += no_band[j];
+    }
+
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_envelope.h b/media/libstagefright/codecs/aacdec/sbr_get_envelope.h
new file mode 100644
index 0000000..b7a266a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_envelope.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_envelope.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_ENVELOPE_H
+#define SBR_GET_ENVELOPE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void sbr_get_envelope(SBR_FRAME_DATA * h_frame_data,
+    BIT_BUFFER  * hBitBuf);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_header_data.cpp b/media/libstagefright/codecs/aacdec/sbr_get_header_data.cpp
new file mode 100644
index 0000000..42789ae
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_header_data.cpp
@@ -0,0 +1,221 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_header_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     h_sbr_header - handle to struct SBR_HEADER_DATA
+                hBitBuf      - handle to struct BIT_BUFFER
+                id_sbr       - SBR_ELEMENT_ID
+
+ Return:        error status - 0 if ok
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Reads header data from bitstream
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_header_data.h"
+#include    "sbr_constants.h"
+#include    "buf_getbits.h"
+#include    "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+SBR_HEADER_STATUS sbr_get_header_data(SBR_HEADER_DATA   * h_sbr_header,
+                                      BIT_BUFFER          * hBitBuf,
+                                      SBR_SYNC_STATE     syncState)
+{
+    SBR_HEADER_DATA lastHeader;
+    Int32 headerExtra1, headerExtra2;
+
+
+    /* Copy header to temporary header */
+    if (syncState == SBR_ACTIVE)
+    {
+        pv_memcpy(&lastHeader, h_sbr_header, sizeof(SBR_HEADER_DATA));
+    }
+    else
+    {
+        pv_memset((void *)&lastHeader, 0, sizeof(SBR_HEADER_DATA));
+    }
+
+
+    /* Read new header from bitstream */
+    h_sbr_header->ampResolution   = buf_getbits(hBitBuf, SI_SBR_AMP_RES_BITS);
+    h_sbr_header->startFreq       = buf_getbits(hBitBuf, SI_SBR_START_FREQ_BITS);
+    h_sbr_header->stopFreq        = buf_getbits(hBitBuf, SI_SBR_STOP_FREQ_BITS);
+    h_sbr_header->xover_band      = buf_getbits(hBitBuf, SI_SBR_XOVER_BAND_BITS);
+
+    buf_getbits(hBitBuf, SI_SBR_RESERVED_BITS_HDR);
+
+    headerExtra1    = buf_getbits(hBitBuf, SI_SBR_HEADER_EXTRA_1_BITS);
+    headerExtra2    = buf_getbits(hBitBuf, SI_SBR_HEADER_EXTRA_2_BITS);
+
+    /* handle extra header information */
+    if (headerExtra1)
+    {
+        h_sbr_header->freqScale   = buf_getbits(hBitBuf, SI_SBR_FREQ_SCALE_BITS);
+        h_sbr_header->alterScale  = buf_getbits(hBitBuf, SI_SBR_ALTER_SCALE_BITS);
+        h_sbr_header->noise_bands = buf_getbits(hBitBuf, SI_SBR_NOISE_BANDS_BITS);
+    }
+    else
+    { /* Set default values.*/
+        h_sbr_header->freqScale   = SBR_FREQ_SCALE_DEFAULT;
+        h_sbr_header->alterScale  = SBR_ALTER_SCALE_DEFAULT;
+        h_sbr_header->noise_bands = SBR_NOISE_BANDS_DEFAULT;
+    }
+
+
+    if (headerExtra2)
+    {
+        h_sbr_header->limiterBands    = buf_getbits(hBitBuf, SI_SBR_LIMITER_BANDS_BITS);
+        h_sbr_header->limiterGains    = buf_getbits(hBitBuf, SI_SBR_LIMITER_GAINS_BITS);
+        h_sbr_header->interpolFreq    = buf_getbits(hBitBuf, SI_SBR_INTERPOL_FREQ_BITS);
+        h_sbr_header->smoothingLength = buf_getbits(hBitBuf, SI_SBR_SMOOTHING_LENGTH_BITS);
+    }
+    else
+    { /* Set default values.*/
+        h_sbr_header->limiterBands    = SBR_LIMITER_BANDS_DEFAULT;
+        h_sbr_header->limiterGains    = SBR_LIMITER_GAINS_DEFAULT;
+        h_sbr_header->interpolFreq    = SBR_INTERPOL_FREQ_DEFAULT;
+        h_sbr_header->smoothingLength = SBR_SMOOTHING_LENGTH_DEFAULT;
+    }
+
+    if (syncState == SBR_ACTIVE)
+    {
+        h_sbr_header->status = HEADER_OK;
+
+        /* look for new settings */
+        if (lastHeader.startFreq   != h_sbr_header->startFreq   ||
+                lastHeader.stopFreq    != h_sbr_header->stopFreq    ||
+                lastHeader.xover_band  != h_sbr_header->xover_band  ||
+                lastHeader.freqScale   != h_sbr_header->freqScale   ||
+                lastHeader.alterScale  != h_sbr_header->alterScale  ||
+                lastHeader.noise_bands != h_sbr_header->noise_bands)
+        {
+            h_sbr_header->status = HEADER_RESET;
+        }
+    }
+    else
+    {
+        h_sbr_header->status = HEADER_RESET;
+    }
+
+    return h_sbr_header->status;
+}
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_header_data.h b/media/libstagefright/codecs/aacdec/sbr_get_header_data.h
new file mode 100644
index 0000000..7bfb272
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_header_data.h
@@ -0,0 +1,89 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_header_data.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_HEADER_DATA_H
+#define SBR_GET_HEADER_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_header_data.h"
+#include    "e_sbr_element_id.h"
+#include    "e_sbr_sync_state.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
+----------------------------------------------------------------------------*/
+
+SBR_HEADER_STATUS sbr_get_header_data(SBR_HEADER_DATA   *h_sbr_header,
+                                      BIT_BUFFER  * hBitBuf,
+                                      SBR_SYNC_STATE     syncState);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.cpp b/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.cpp
new file mode 100644
index 0000000..8d86158
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_noise_floor_data.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     h_frame_data - handle to struct SBR_FRAME_DATA
+                hBitBuf      - handle to struct BIT_BUF
+
+ Return:        void
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Reads noise-floor-level data from bitstream
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_get_noise_floor_data.h"
+#include    "e_coupling_mode.h"
+#include    "buf_getbits.h"
+#include    "sbr_code_book_envlevel.h"
+#include    "s_huffman.h"
+#include    "sbr_decode_huff_cw.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 sbr_get_noise_floor_data(SBR_FRAME_DATA * h_frame_data,
+                              BIT_BUFFER * hBitBuf)
+{
+    Int32 i;
+    Int32 j;
+    Int32 k;
+    Int32 tmp;
+    Int32 delta;
+    Int32 noNoiseBands = h_frame_data->nNfb;
+    Int32 envDataTableCompFactor;
+
+    COUPLING_MODE coupling = h_frame_data->coupling;
+
+    SbrHuffman hcb_noiseF;
+    SbrHuffman hcb_noise;
+
+
+    if (coupling == COUPLING_BAL)
+    {
+        hcb_noise  = bookSbrNoiseBalance11T;
+        hcb_noiseF = bookSbrEnvBalance11F;  /* "bookSbrNoiseBalance11F" */
+        envDataTableCompFactor = 1;
+    }
+    else
+    {
+        hcb_noise  = bookSbrNoiseLevel11T;
+        hcb_noiseF = bookSbrEnvLevel11F;  /* "bookSbrNoiseLevel11F" */
+        envDataTableCompFactor = 0;
+    }
+
+    /*
+     *  Calculate number of values alltogether
+     */
+    h_frame_data->nNoiseFactors = h_frame_data->frameInfo[((h_frame_data->frameInfo[0]) << 1) + 3] * noNoiseBands;
+
+
+    for (i = 0; i < h_frame_data->nNoiseFloorEnvelopes; i++)
+    {
+        k = i * noNoiseBands;
+        if (h_frame_data->domain_vec2[i] == FREQ)
+        {
+            if (coupling == COUPLING_BAL)
+            {
+                tmp = buf_getbits(hBitBuf, SI_SBR_START_NOISE_BITS_BALANCE_AMP_RES_3_0) << 1;  /*  max. 62  */
+                h_frame_data->sbrNoiseFloorLevel_man[k] = tmp;
+                h_frame_data->sbrNoiseFloorLevel_exp[k] =   0;
+            }
+            else
+            {
+                tmp = buf_getbits(hBitBuf, SI_SBR_START_NOISE_BITS_AMP_RES_3_0);  /*  max. 31  */
+                h_frame_data->sbrNoiseFloorLevel_man[k] = tmp;
+                h_frame_data->sbrNoiseFloorLevel_exp[k] =   0;
+            }
+
+            for (j = 1; j < noNoiseBands; j++)
+            {
+                delta = sbr_decode_huff_cw(hcb_noiseF, hBitBuf); /*
+                                                                  *  -31 < delta < 31
+                                                                  *  -24 < delta < 24   COUPLING_BAL (incl. <<1)
+                                                                  */
+                h_frame_data->sbrNoiseFloorLevel_man[k+j] = delta << envDataTableCompFactor;
+                h_frame_data->sbrNoiseFloorLevel_exp[k+j] =   0;
+            }
+        }
+        else
+        {
+            for (j = 0; j < noNoiseBands; j++)
+            {
+                delta = sbr_decode_huff_cw(hcb_noise, hBitBuf);  /*
+                                                                  *  -31 < delta < 31
+                                                                  *  -24 < delta < 24   COUPLING_BAL (incl. <<1)
+                                                                  */
+                h_frame_data->sbrNoiseFloorLevel_man[k+j] = delta << envDataTableCompFactor;
+                h_frame_data->sbrNoiseFloorLevel_exp[k+j] =   0;
+            }
+        }
+    }
+}
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.h b/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.h
new file mode 100644
index 0000000..e61abda
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_noise_floor_data.h
@@ -0,0 +1,94 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_noise_floor_data.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_NOISE_FLOOR_DATA_H
+#define SBR_GET_NOISE_FLOOR_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void sbr_get_noise_floor_data(SBR_FRAME_DATA * h_frame_data,
+    BIT_BUFFER * hBitBuf);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_sce.cpp b/media/libstagefright/codecs/aacdec/sbr_get_sce.cpp
new file mode 100644
index 0000000..ba514f4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_sce.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_sce.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Arguments:     hFrameData - handle to struct SBR_FRAME_DATA
+                hBitBuf    - handle to struct BIT_BUF
+
+ Return:        SbrFrameOK
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+
+#include    "sbr_get_sce.h"
+#include    "sbr_get_additional_data.h"
+#include    "sbr_extract_extended_data.h"
+#include    "buf_getbits.h"
+#include    "sbr_get_envelope.h"
+#include    "sbr_get_noise_floor_data.h"
+#include    "extractframeinfo.h"
+#include    "sbr_get_dir_control_data.h"
+#include    "e_invf_mode.h"
+#include    "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_get_sce(SBR_FRAME_DATA * hFrameData,
+                      BIT_BUFFER * hBitBuf
+#ifdef PARAMETRICSTEREO
+                      , HANDLE_PS_DEC hParametricStereoDec
+#endif
+                     )
+{
+    Int32 i;
+    Int32 bits;
+    SBR_ERROR err =  SBRDEC_OK;
+
+    /* reserved bits */
+    bits = buf_getbits(hBitBuf, SI_SBR_RESERVED_PRESENT);
+
+    if (bits)
+    {
+        buf_getbits(hBitBuf, SI_SBR_RESERVED_BITS_DATA);
+    }
+
+    /* side info */
+    err = extractFrameInfo(hBitBuf, hFrameData);
+
+    if (err != SBRDEC_OK)
+    {
+        return err;
+    }
+
+
+    sbr_get_dir_control_data(hFrameData, hBitBuf);
+
+    for (i = 0; i < hFrameData->nNfb; i++)
+    {
+        hFrameData->sbr_invf_mode_prev[i] = hFrameData->sbr_invf_mode[i];
+        hFrameData->sbr_invf_mode[i] =
+            (INVF_MODE) buf_getbits(hBitBuf, SI_SBR_INVF_MODE_BITS);
+    }
+
+
+    /* raw data */
+    sbr_get_envelope(hFrameData, hBitBuf);
+
+    sbr_get_noise_floor_data(hFrameData, hBitBuf);
+
+    pv_memset((void *)hFrameData->addHarmonics,
+              0,
+              hFrameData->nSfb[HI]*sizeof(Int32));
+
+    sbr_get_additional_data(hFrameData, hBitBuf);
+
+    sbr_extract_extended_data(hBitBuf
+#ifdef PARAMETRICSTEREO
+                              , hParametricStereoDec
+#endif
+                             );
+
+    hFrameData->coupling = COUPLING_OFF;
+
+    return SBRDEC_OK;
+
+}
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/sbr_get_sce.h b/media/libstagefright/codecs/aacdec/sbr_get_sce.h
new file mode 100644
index 0000000..36adb04
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_get_sce.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_get_sce.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_GET_SCE_H
+#define SBR_GET_SCE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_bit_buffer.h"
+#include    "s_sbr_frame_data.h"
+#include    "e_sbr_error.h"
+
+#ifdef PARAMETRICSTEREO
+#include    "s_ps_dec.h"
+#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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    SBR_ERROR sbr_get_sce(SBR_FRAME_DATA * hFrameData,
+    BIT_BUFFER * hBitBuf
+#ifdef PARAMETRICSTEREO
+    , HANDLE_PS_DEC hParametricStereoDec
+#endif
+                         );
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.cpp b/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.cpp
new file mode 100644
index 0000000..833ace3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_inv_filt_levelemphasis.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_inv_filt_levelemphasis.h"
+#include    "sbr_generate_high_freq.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
+----------------------------------------------------------------------------*/
+
+
+#include "pv_audio_type_defs.h"
+#include "fxp_mul32.h"
+
+#define R_SHIFT     29
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+
+const Int32 InvFiltFactors[5] = {Qfmt(0.00f),    /* OFF_LEVEL */
+                                 Qfmt(0.60f),     /* TRANSITION_LEVEL */
+                                 Qfmt(0.75f),     /* LOW_LEVEL */
+                                 Qfmt(0.90f),     /* MID_LEVEL */
+                                 Qfmt(0.98f)
+                                };    /* HIGH_LEVEL */
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void sbr_inv_filt_levelemphasis(INVF_MODE *invFiltMode,
+                                INVF_MODE *prevInvFiltMode,
+                                Int32 nNfb,
+                                Int32  BwVector[MAX_NUM_PATCHES],
+                                Int32  BwVectorOld[MAX_NUM_PATCHES])
+{
+    Int32 i;
+    Int32 j;
+    Int32 tmp;
+
+    for (i = 0; i < nNfb; i++)
+    {
+        switch (invFiltMode[i])
+        {
+            case INVF_LOW_LEVEL:
+                if (prevInvFiltMode[i] == INVF_OFF)
+                {
+                    j = 1;
+                }
+                else
+                {
+                    j = 2;
+                }
+                break;
+
+            case INVF_MID_LEVEL:
+                j = 3;
+                break;
+
+            case INVF_HIGH_LEVEL:
+                j = 4;
+                break;
+
+            default:
+                if (prevInvFiltMode[i] == INVF_LOW_LEVEL)
+                {
+                    j = 1;
+                }
+                else
+                {
+                    j = 0;
+                }
+        }
+
+        tmp  =  InvFiltFactors[j];
+
+        if (tmp < BwVectorOld[i])
+        {
+            tmp = ((tmp << 1) + tmp + BwVectorOld[i]) >> 2;
+        }
+        else
+        {
+            tmp =  fxp_mul32_Q29(Qfmt(0.90625f), tmp);
+            tmp =  fxp_mac32_Q29(Qfmt(0.09375f), BwVectorOld[i], tmp);
+        }
+
+        if (tmp < Qfmt(0.015625F))
+        {
+            tmp = 0;
+        }
+
+        if (tmp >= Qfmt(0.99609375f))
+        {
+            tmp = Qfmt(0.99609375f);
+        }
+
+        BwVector[i] = tmp;
+    }
+}
+
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.h b/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.h
new file mode 100644
index 0000000..586214c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_inv_filt_levelemphasis.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_inv_filt_levelemphasis.h
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_INV_FILT_LEVELEMPHASIS_H
+#define SBR_INV_FILT_LEVELEMPHASIS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "e_invf_mode.h"
+#include    "sbr_generate_high_freq.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
+----------------------------------------------------------------------------*/
+
+
+void sbr_inv_filt_levelemphasis(INVF_MODE *invFiltMode,
+                                INVF_MODE *prevInvFiltMode,
+                                Int32  nNfb,
+                                Int32  BwVector[MAX_NUM_PATCHES],
+                                Int32  BwVectorOld[MAX_NUM_PATCHES]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_open.cpp b/media/libstagefright/codecs/aacdec/sbr_open.cpp
new file mode 100644
index 0000000..868819a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_open.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_open.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_open.h"
+#include    "s_sbr_header_data.h"
+#include    "init_sbr_dec.h"
+#include    "e_sbr_error.h"
+#include    "aac_mem_funcs.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
+----------------------------------------------------------------------------*/
+const SBR_HEADER_DATA defaultHeader =
+{
+    HEADER_NOT_INITIALIZED,   /* status */
+    MASTER_RESET,             /* masterStatus */
+    0,                        /* crcEnable */
+    UP_BY_2,                  /* sampleRateMode */
+    SBR_AMP_RES_3_0,          /* ampResolution */
+    5,                        /* startFreq */
+    0,                        /* stopFreq */
+    0,                        /* xover_band */
+    SBR_FREQ_SCALE_DEFAULT,   /* freqScale */
+    SBR_ALTER_SCALE_DEFAULT,  /* alterScale */
+    SBR_NOISE_BANDS_DEFAULT,  /* noise_bands */
+    0,                        /* noNoiseBands */
+    SBR_LIMITER_BANDS_DEFAULT,
+    SBR_LIMITER_GAINS_DEFAULT,
+    SBR_INTERPOL_FREQ_DEFAULT,
+    SBR_SMOOTHING_LENGTH_DEFAULT
+};
+
+/*----------------------------------------------------------------------------
+; 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 sbr_open(Int32 sampleRate,
+              SBR_DEC *sbrDec,
+              SBRDECODER_DATA * self,
+              bool bDownSampledSbr)
+
+{
+    Int16 i ;
+
+    SBR_CHANNEL *SbrChannel;
+
+
+    SbrChannel = self->SbrChannel;
+
+    for (i = 0; i < MAX_NUM_CHANNELS; i++)
+    {
+        pv_memset((void *)&(SbrChannel[i]),
+                  0,
+                  sizeof(SBR_CHANNEL));
+
+        /* init a default header such that we can at least do upsampling later */
+
+        pv_memcpy(&(SbrChannel[i].frameData.sbr_header),
+                  &defaultHeader,
+                  sizeof(SBR_HEADER_DATA));
+
+        /* should be handled by sample rate mode bit */
+        if (sampleRate > 24000 || bDownSampledSbr)
+        {
+            SbrChannel[i].frameData.sbr_header.sampleRateMode = SINGLE_RATE;
+        }
+
+
+        SbrChannel[i].outFrameSize =
+            init_sbr_dec(sampleRate,
+                         self->SbrChannel[0].frameData.sbr_header.sampleRateMode,
+                         sbrDec,
+                         &(SbrChannel[i].frameData));
+
+        SbrChannel[i].syncState     = UPSAMPLING;
+
+        SbrChannel[i].frameData.sUp = 1;        /* reset mode */
+    }
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_open.h b/media/libstagefright/codecs/aacdec/sbr_open.h
new file mode 100644
index 0000000..8d17ffa
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_open.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_open.h
+ Funtions:
+    get_dse
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_OPEN_H
+#define SBR_OPEN_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_sbr_channel.h"
+#include "sbr_dec.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
+----------------------------------------------------------------------------*/
+void sbr_open(Int32 sampleRate,
+              SBR_DEC *sbrDec,
+              SBRDECODER_DATA * self,
+              bool bDownSampledSbr);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_read_data.cpp b/media/libstagefright/codecs/aacdec/sbr_read_data.cpp
new file mode 100644
index 0000000..2220fce
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_read_data.cpp
@@ -0,0 +1,324 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_read_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    INPUT
+
+    SBRDECODER self,
+    SBRBITSTREAM * stream,
+    float *timeData,
+    int numChannels
+
+    OUTPUT
+
+    errorCode, noError if successful
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        sbr decoder processing, set up SBR decoder phase 2 in case of
+        different cotrol data
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_read_data.h"
+#include    "s_bit_buffer.h"
+#include    "buf_getbits.h"
+#include    "sbr_get_sce.h"
+#include    "sbr_get_cpe.h"
+#include    "sbr_reset_dec.h"
+#include    "sbr_get_header_data.h"
+#include    "sbr_crc_check.h"
+#include    "aac_mem_funcs.h"
+
+
+#include    "init_sbr_dec.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_read_data(SBRDECODER_DATA * self,
+                        SBR_DEC * sbrDec,
+                        SBRBITSTREAM *stream)
+{
+    SBR_ERROR sbr_err =  SBRDEC_OK;
+    int32_t SbrFrameOK = 1;
+    int32_t sbrCRCAlwaysOn = 0;
+
+    UInt32 bs_header_flag = 0;
+
+    SBR_HEADER_STATUS headerStatus = HEADER_OK;
+
+    SBR_CHANNEL *SbrChannel = self->SbrChannel;
+
+    int32_t zeropadding_bits;
+
+    BIT_BUFFER bitBuf ;
+
+    /*
+     *  evaluate Bitstream
+     */
+
+    bitBuf.buffer_word    = 0;
+    bitBuf.buffered_bits  = 0;
+    bitBuf.nrBitsRead     = 0;
+
+    bitBuf.char_ptr  =  stream->sbrElement[0].Data;
+    bitBuf.bufferLen = (stream->sbrElement[0].Payload) << 3;
+
+
+    /*
+     *  we have to skip a nibble because the first element of Data only
+     *  contains a nibble of data !
+     */
+    buf_getbits(&bitBuf, LEN_NIBBLE);
+
+    if ((stream->sbrElement[0].ExtensionType == SBR_EXTENSION_CRC) ||
+            sbrCRCAlwaysOn)
+    {
+        int32_t CRCLen = ((stream->sbrElement[0].Payload - 1) << 3) + 4 - SI_SBR_CRC_BITS;
+        SbrFrameOK = sbr_crc_check(&bitBuf, CRCLen);
+    }
+
+
+    if (SbrFrameOK)
+    {
+        /*
+         *  The sbr data seems ok, if the header flag is set we read the header
+         *  and check if vital parameters have changed since the previous frame.
+         *  If the syncState equals UPSAMPLING, the SBR Tool has not been
+         *  initialised by SBR header data, and can only do upsampling
+         */
+
+        bs_header_flag = buf_getbits(&bitBuf, 1);  /* read Header flag */
+
+        if (bs_header_flag)
+        {
+            /*
+             *  If syncState == SBR_ACTIVE, it means that we've had a SBR header
+             *  before, and we will compare with the previous header to see if a
+             *  reset is required. If the syncState equals UPSAMPLING this means
+             *  that the SBR-Tool so far is only initialised to do upsampling
+             *  and hence we need to do a reset, and initialise the system
+             *  according to the present header.
+             */
+
+            headerStatus = sbr_get_header_data(&(SbrChannel[0].frameData.sbr_header),
+                                               &bitBuf,
+                                               SbrChannel[0].syncState);
+        }     /* if (bs_header_flag) */
+
+
+        switch (stream->sbrElement[0].ElementID)
+        {
+            case SBR_ID_SCE :
+
+                /* change of control data, reset decoder */
+                if (headerStatus == HEADER_RESET)
+                {
+                    sbr_err = sbr_reset_dec(&(SbrChannel[0].frameData),
+                                            sbrDec,
+                                            self->SbrChannel[0].frameData.sbr_header.sampleRateMode);
+
+                    if (sbr_err != SBRDEC_OK)
+                    {
+                        break;
+                    }
+                    /*
+                     * At this point we have a header and the system has been reset,
+                     * hence syncState from now on will be SBR_ACTIVE.
+                     */
+                    SbrChannel[0].syncState     = SBR_ACTIVE;
+                }
+
+                if ((SbrChannel[0].syncState == SBR_ACTIVE))
+                {
+                    sbr_err = sbr_get_sce(&(SbrChannel[0].frameData),
+                                          &bitBuf
+#ifdef PARAMETRICSTEREO
+                                          , self->hParametricStereoDec
+#endif
+                                         );
+
+                    if (sbr_err != SBRDEC_OK)
+                    {
+                        break;
+                    }
+                }
+
+                break;
+
+            case SBR_ID_CPE :
+
+                if (bs_header_flag)
+                {
+                    pv_memcpy(&(SbrChannel[1].frameData.sbr_header),
+                              &(SbrChannel[0].frameData.sbr_header),
+                              sizeof(SBR_HEADER_DATA));
+                }
+
+                /* change of control data, reset decoder */
+                if (headerStatus == HEADER_RESET)
+                {
+                    for (int32_t lr = 0 ; lr < 2 ; lr++)
+                    {
+                        sbr_err = sbr_reset_dec(&(SbrChannel[lr].frameData),
+                                                sbrDec,
+                                                self->SbrChannel[0].frameData.sbr_header.sampleRateMode);
+
+                        if (sbr_err != SBRDEC_OK)
+                        {
+                            break;
+                        }
+
+                        SbrChannel[lr].syncState = SBR_ACTIVE;
+                    }
+                }
+
+                if (SbrChannel[0].syncState == SBR_ACTIVE)
+                {
+                    sbr_err = sbr_get_cpe(&(SbrChannel[0].frameData),
+                                          &(SbrChannel[1].frameData),
+                                          &bitBuf);
+
+                    if (sbr_err != SBRDEC_OK)
+                    {
+                        break;
+                    }
+
+                }
+                break;
+
+            default:
+                sbr_err = SBRDEC_ILLEGAL_PLUS_ELE_ID;
+                break;
+        }
+
+    }           /* if (SbrFrameOK) */
+
+    /*
+     *  Check that the bits read did not go beyond SBR frame boundaries
+     */
+
+    zeropadding_bits = (8 - (bitBuf.nrBitsRead & 0x7)) & 0x7;
+
+    if ((bitBuf.nrBitsRead + zeropadding_bits)  > bitBuf.bufferLen)
+    {
+        sbr_err = SBRDEC_INVALID_BITSTREAM;
+    }
+
+    return sbr_err;
+}
+
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_read_data.h b/media/libstagefright/codecs/aacdec/sbr_read_data.h
new file mode 100644
index 0000000..74cf5b9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_read_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_read_data.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_READ_DATA
+#define SBR_READ_DATA
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "e_sbr_error.h"
+#include "s_sbr_channel.h"
+#include "s_sbrbitstream.h"
+#include "sbr_dec.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    SBR_ERROR sbr_read_data(SBRDECODER_DATA * self,
+    SBR_DEC * sbrDec,
+    SBRBITSTREAM *stream);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.cpp b/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.cpp
new file mode 100644
index 0000000..487496f
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_requantize_envelope_data.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_constants.h"
+#include    "sbr_requantize_envelope_data.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define R_SHIFT     30
+#define Qfmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+/*----------------------------------------------------------------------------
+; 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 sbr_requantize_envelope_data(SBR_FRAME_DATA * hFrameData)
+
+{
+    Int32 i;
+
+
+    Int32  nScaleFactors      =  hFrameData->nScaleFactors;
+    Int32  nNoiseFactors      =  hFrameData->nNoiseFactors;
+    Int32  ampRes             =  hFrameData->ampRes;
+    Int32 *iEnvelope_man      =  hFrameData->iEnvelope_man;
+    Int32 *iEnvelope_exp      =  hFrameData->iEnvelope_exp;
+    Int32 *sbrNoiseFloorLevel_man = hFrameData->sbrNoiseFloorLevel_man;
+    Int32 *sbrNoiseFloorLevel_exp = hFrameData->sbrNoiseFloorLevel_exp;
+
+    /*
+     *  ampRes could be 0 (resolution step = 1.5 dB) or
+     *                  1 (resolution step = 3 dB)
+     */
+    if (ampRes)
+    {
+        /*  iEnvelope[i] always positive  6 bits max */
+        for (i = 0; i < nScaleFactors; i++)
+        {
+
+            iEnvelope_exp[i] = iEnvelope_man[i] + 6;
+            iEnvelope_man[i] = Qfmt(1.000F);
+        }
+    }
+    else
+    {
+        /*  iEnvelope[i] always positive  7 bits max */
+        for (i = 0; i < nScaleFactors; i++)
+        {
+            iEnvelope_exp[i] = (iEnvelope_man[i] >> 1) + 6;
+            if (iEnvelope_man[i] & 0x1)   /*  odd */
+            {
+                iEnvelope_man[i] = Qfmt(1.41421356237310F);
+            }
+            else
+            {
+                iEnvelope_man[i] = Qfmt(1.000F);
+            }
+        }
+
+    }
+    for (i = 0; i < nNoiseFactors; i++)
+    {
+        /*  sbrNoiseFloorLevel[i] varies from -31 to 31 if no coupling is used */
+
+        sbrNoiseFloorLevel_exp[i] = NOISE_FLOOR_OFFSET - sbrNoiseFloorLevel_man[i];
+        sbrNoiseFloorLevel_man[i] = 0x40000000;
+    }
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.h b/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.h
new file mode 100644
index 0000000..2113586
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_requantize_envelope_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_requantize_envelope_data.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_REQUANTIZE_ENVELOPE_DATA_H
+#define SBR_REQUANTIZE_ENVELOPE_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sbr_frame_data.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
+----------------------------------------------------------------------------*/
+
+void sbr_requantize_envelope_data(SBR_FRAME_DATA * hFrameData);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_reset_dec.cpp b/media/libstagefright/codecs/aacdec/sbr_reset_dec.cpp
new file mode 100644
index 0000000..810a34a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_reset_dec.cpp
@@ -0,0 +1,269 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_reset_dec.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    resets sbr decoder structure
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#ifdef AAC_PLUS
+
+#include    "sbr_dec.h"
+
+#include    "pv_log2.h"
+#include    "fxp_mul32.h"
+
+
+#include    "sbr_reset_dec.h"
+#include    "sbr_find_start_andstop_band.h"
+#include    "sbr_update_freq_scale.h"
+#include    "sbr_downsample_lo_res.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
+----------------------------------------------------------------------------*/
+
+SBR_ERROR sbr_reset_dec(SBR_FRAME_DATA * hFrameData,
+                        SBR_DEC * sbrDec,
+                        Int32 upsampleFac)
+{
+
+    SBR_ERROR err = SBRDEC_OK;
+    Int lsbM;
+    Int lsb;
+    Int usb;
+    Int32 i;
+    Int32 tmp_q1;
+
+    SBR_HEADER_DATA *headerData  = &(hFrameData->sbr_header);
+    Int32           samplingFreq = sbrDec->outSampleRate;
+
+    hFrameData->reset_flag = 1;
+
+    /*Calculate master frequency function */
+    err = sbr_find_start_andstop_band(samplingFreq,
+                                      headerData->startFreq,
+                                      headerData->stopFreq,
+                                      &lsbM,
+                                      &usb);
+
+    if (err != SBRDEC_OK)
+    {
+        return err;
+    }
+
+    /* Calculate new v_k_master if needed */
+    if (headerData->masterStatus == MASTER_RESET)
+    {
+        sbr_update_freq_scale(sbrDec->V_k_master,
+                              &(sbrDec->Num_Master),
+                              lsbM,
+                              usb,
+                              headerData->freqScale,
+                              headerData->alterScale,
+                              0);
+
+    }
+
+    /*Derive Hiresolution from master frequency function*/
+
+    sbrDec->NSfb[HI] = sbrDec->Num_Master - headerData->xover_band;
+
+    for (i = headerData->xover_band; i <= sbrDec->Num_Master; i++)
+    {
+        sbrDec->FreqBandTable[HI][i-headerData->xover_band] = (Int)sbrDec->V_k_master[i];
+    }
+
+
+    if ((sbrDec->NSfb[HI] & 0x01) == 0) /* if even number of hires bands */
+    {
+
+        sbrDec->NSfb[LO] = sbrDec->NSfb[HI] >> 1;
+        /* Use every second lo-res=hi-res[0,2,4...] */
+        for (i = 0; i <= sbrDec->NSfb[LO]; i++)
+        {
+            sbrDec->FreqBandTable[LO][i] = sbrDec->FreqBandTable[HI][(i<<1)];
+        }
+    }
+    else
+    {            /* odd number of hi-res which means xover is odd */
+
+        sbrDec->NSfb[LO] = (sbrDec->NSfb[HI] + 1) >> 1;
+        /* Use lo-res=hi-res[0,1,3,5 ...] */
+        sbrDec->FreqBandTable[LO][0] = sbrDec->FreqBandTable[HI][0];
+        for (i = 1; i <= sbrDec->NSfb[LO]; i++)
+        {
+            sbrDec->FreqBandTable[LO][i] = sbrDec->FreqBandTable[HI][(i<<1)-1];
+        }
+
+    }
+
+    lsb = sbrDec->FreqBandTable[LOW_RES][0];
+    usb = sbrDec->FreqBandTable[LOW_RES][sbrDec->NSfb[LOW_RES]];
+
+    sbrDec->lowSubband  = lsb;
+    sbrDec->highSubband = usb;
+    sbrDec->noSubbands  = usb - lsb;
+
+    if ((lsb > 32) || (sbrDec->noSubbands <= 0))
+    {
+        return SBRDEC_ILLEGAL_SCFACTORS;   /* invalid bands */
+    }
+
+    /* Calculate number of noise bands */
+    if (headerData->noise_bands == 0)
+    {
+        sbrDec->NoNoiseBands = 1;
+    }
+    else /* Calculate number of noise bands 1,2 or 3 bands/octave */
+    {
+
+        if (! lsb)
+        {
+            return SBRDEC_ILLEGAL_SCFACTORS;   /* avoid div by 0 */
+        }
+
+        tmp_q1 = pv_log2((usb << 20) / lsb);
+
+        tmp_q1 = fxp_mul32_Q15(headerData->noise_bands, tmp_q1);
+
+        sbrDec->NoNoiseBands = (tmp_q1 + 16) >> 5;
+
+        if (sbrDec->NoNoiseBands == 0)
+        {
+            sbrDec->NoNoiseBands = 1;
+        }
+    }
+
+    headerData->noNoiseBands = sbrDec->NoNoiseBands;
+
+    /* Get noise bands */
+    sbr_downsample_lo_res(sbrDec->FreqBandTableNoise,
+                          sbrDec->NoNoiseBands,
+                          sbrDec->FreqBandTable[LO],
+                          sbrDec->NSfb[LO]);
+
+    sbrDec->sbStopCodec = sbrDec->lowSubband;
+
+    if (sbrDec->sbStopCodec > (upsampleFac << 5))
+    {
+        sbrDec->sbStopCodec = (upsampleFac << 5);
+    }
+
+    hFrameData->nSfb[LO] = sbrDec->NSfb[LO];
+    hFrameData->nSfb[HI] = sbrDec->NSfb[HI];
+    hFrameData->nNfb     = hFrameData->sbr_header.noNoiseBands;
+    hFrameData->offset   = ((hFrameData->nSfb[LO]) << 1) - hFrameData->nSfb[HI];
+
+    return (SBRDEC_OK);
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_reset_dec.h b/media/libstagefright/codecs/aacdec/sbr_reset_dec.h
new file mode 100644
index 0000000..0ff94a5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_reset_dec.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_reset_dec.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+ $Id: ct_envcalc.h,v 1.3 2002/11/29 16:11:49 kaehleof Exp $
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_RESET_DEC_H
+#define SBR_RESET_DEC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include    "s_sbr_frame_data.h"
+#include    "sbr_dec.h"
+#include    "e_sbr_error.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
+----------------------------------------------------------------------------*/
+SBR_ERROR sbr_reset_dec(SBR_FRAME_DATA * hFrameData,
+                        SBR_DEC * sbrDec,
+                        Int32 upsampleFac);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.cpp b/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.cpp
new file mode 100644
index 0000000..18bd5d9
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_update_freq_scale.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+SC 29 Software Copyright Licencing Disclaimer:
+
+This software module was originally developed by
+  Coding Technologies
+
+and edited by
+  -
+
+in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
+standards for reference purposes and its performance may not have been
+optimized. This software module is an implementation of one or more tools as
+specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
+ISO/IEC gives users free license to this software module or modifications
+thereof for use in products claiming conformance to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International
+Standards. ISO/IEC gives users the same free license to this software module or
+modifications thereof for research purposes and further ISO/IEC standardisation.
+Those intending to use this software module in products are advised that its
+use may infringe existing patents. ISO/IEC have no liability for use of this
+software module or modifications thereof. Copyright is not released for
+products that do not conform to audiovisual and image-coding related ITU
+Recommendations and/or ISO/IEC International Standards.
+The original developer retains full right to modify and use the code for its
+own purpose, assign or donate the code to a third party and to inhibit third
+parties from using the code for products that do not conform to audiovisual and
+image-coding related ITU Recommendations and/or ISO/IEC International Standards.
+This copyright notice must be included in all copies or derivative works.
+Copyright (c) ISO/IEC 2002.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include    "sbr_update_freq_scale.h"
+#include    "shellsort.h"
+
+#include    "pv_pow2.h"
+#include    "pv_log2.h"
+
+#include "fxp_mul32.h"
+#define R_SHIFT     30
+#define Q_fmt(x)    (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
+#define Q28fmt(x)   (Int32)(x*((Int32)1<<28) + (x>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; 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 sbr_update_freq_scale(Int32 * v_k_master,
+                           Int32 *h_num_bands,
+                           const Int32 lsbM,
+                           const Int32 usb,
+                           const Int32 freqScale,
+                           const Int32 alterScale,
+                           const Int32 channelOffset)
+{
+    Int32 i;
+    Int32 numBands = 0;
+    Int32 numBands2;
+    Int32 tmp_q1;
+
+    if (freqScale > 0) /*Bark mode*/
+    {
+        Int32 reg;
+        Int32 regions;
+        Int32 b_p_o;
+        Int32 k[3];
+        Int32 d[MAX_SECOND_REGION];
+        Int32 d2[MAX_SECOND_REGION];
+        Int32 w[2] = {Q_fmt(1.0F), Q_fmt(1.0F)};
+
+
+        k[0] = lsbM;
+        k[1] = usb;
+        k[2] = usb;
+
+        b_p_o = (freqScale == 1)  ? 12 : 8;
+        b_p_o = (freqScale == 2)  ? 10 : b_p_o;
+
+        w[1]  = (alterScale == 0) ? Q_fmt(0.5f) : Q_fmt(0.384615384615386f);
+
+        if (usb > fxp_mul32_Q28(lsbM, Q28fmt(2.2449)))
+        {
+            regions = 2;
+            k[1] = (lsbM << 1);
+        }
+        else
+        {
+            regions = 1;
+        }
+
+        *h_num_bands = 0;
+        for (reg = 0; reg < regions; reg++)
+        {
+            if (reg == 0)
+            {
+
+                tmp_q1 = pv_log2((k[1] << 20) / k[0]);
+
+                tmp_q1 = fxp_mul32_Q15(tmp_q1, b_p_o);
+                tmp_q1 = (tmp_q1 + 32) >> 6;
+
+                numBands = tmp_q1 << 1;
+
+
+                CalcBands(d, k[0], k[1], numBands);                                    /* CalcBands => d   */
+                shellsort(d, numBands);                                              /* SortBands sort d */
+                cumSum(k[0] - channelOffset,
+                       d,
+                       numBands,
+                       (v_k_master + *h_num_bands));   /* cumsum */
+
+                *h_num_bands += numBands;                                            /* Output nr of bands */
+            }
+            else
+            {
+                tmp_q1 = pv_log2((k[reg + 1] << 20) / k[reg]);
+
+                tmp_q1 = fxp_mul32_Q30(tmp_q1, w[reg]);
+                tmp_q1 = fxp_mul32_Q15(tmp_q1, b_p_o);
+                tmp_q1 = (tmp_q1 + 16) >> 5;
+
+                numBands2 = tmp_q1 << 1;
+
+                CalcBands(d2, k[reg], k[reg+1], numBands2);                            /* CalcBands => d   */
+                shellsort(d2, numBands2);                                              /* SortBands sort d */
+                if (d[numBands-1] > d2[0])
+                {
+
+                    Int32   change = d[numBands-1] - d2[0];
+                    /* Limit the change so that the last band cannot get narrower than the first one */
+                    if (change > (d2[numBands2-1] - d2[0]) >> 1)
+                    {
+                        change = (d2[numBands2-1] - d2[0]) >> 1;
+                    }
+
+                    d2[0] += change;
+                    d2[numBands2-1] -= change;
+                    shellsort(d2, numBands2);
+
+                }
+                cumSum(k[reg] - channelOffset,
+                       d2,
+                       numBands2,
+                       v_k_master + *h_num_bands);   /* cumsum */
+
+                *h_num_bands += numBands2;                                           /* Output nr of bands */
+            }
+        }
+    }
+    else
+    {                         /* Linear mode */
+        Int32     k2_achived;
+        Int32     k2_diff;
+        Int32     diff_tot[MAX_OCTAVE + MAX_SECOND_REGION];
+        Int32     dk;
+        Int32     incr = 0;
+
+
+        if (alterScale)
+        {
+            numBands = (usb - lsbM) >> 1;
+            dk = 1;
+            k2_achived = lsbM + numBands;
+        }
+        else
+        {
+            numBands = usb - lsbM;
+            if (numBands & 0x1) /* equivalent rounding */
+            {
+                numBands--;
+            }
+            dk = 2;
+            k2_achived = lsbM + (numBands << 1);
+        }
+
+        k2_diff = usb - k2_achived;
+
+        for (i = 0; i < numBands; i++)
+        {
+            diff_tot[i] = dk;
+        }
+
+        if (k2_diff < 0)        /* If linear scale wasn't achived */
+        {
+            incr = 1;           /* and we got too large SBR area */
+            i = 0;
+        }
+
+        if (k2_diff > 0)        /* If linear scale wasn't achived */
+        {
+            incr = -1;            /* and we got too small SBR area */
+            i = numBands - 1;
+        }
+
+        /* Adjust diff vector to get spec. SBR range */
+        while (k2_diff != 0)
+        {
+            diff_tot[i] -=  incr;
+            i += incr;
+            k2_diff += incr;
+        }
+
+        cumSum(lsbM,
+               diff_tot,
+               numBands,
+               v_k_master); /* cumsum */
+
+        *h_num_bands = numBands;                      /* Output nr of bands */
+    }
+}
+
+
+void CalcBands(Int32 * diff,
+               Int32 start,
+               Int32 stop,
+               Int32 num_bands)
+{
+    Int32 i;
+    Int32 previous;
+    Int32 current;
+    Int32 tmp_q1;
+
+
+    previous = start;
+
+    for (i = 1; i <= num_bands; i++)
+    {
+        /*              float temp=(start * pow( (float)stop/start, (float)i/num_bands)); */
+
+        tmp_q1 = pv_log2((stop << 20) / start);
+
+        tmp_q1 = fxp_mul32_Q20(tmp_q1, (i << 27) / num_bands);
+        tmp_q1 = pv_pow2(tmp_q1);
+
+        tmp_q1 = fxp_mul32_Q20(tmp_q1, start);
+
+        current = (tmp_q1 + 16) >> 5;
+
+        diff[i-1] = current - previous;
+        previous  = current;
+    }
+
+}  /* End CalcBands */
+
+
+void cumSum(Int32 start_value,
+            Int32 * diff,
+            Int32 length,
+            Int32 * start_adress)
+{
+    Int32 i;
+    Int32 *pt_start_adress   = start_adress;
+    Int32 *pt_start_adress_1 = start_adress;
+    Int32 *pt_diff           = diff;
+
+    if (length > 0)  /*  avoid possible error on loop */
+    {
+        *(pt_start_adress_1++) = start_value;
+
+        for (i = (length >> 1); i != 0; i--)
+        {
+            *(pt_start_adress_1++) = *(pt_start_adress++) + *(pt_diff++);
+            *(pt_start_adress_1++) = *(pt_start_adress++) + *(pt_diff++);
+        }
+
+        if (length&1)
+        {
+            *(pt_start_adress_1) = *(pt_start_adress) + *(pt_diff);
+        }
+    }
+
+}   /* End cumSum */
+
+
+#endif
diff --git a/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.h b/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.h
new file mode 100644
index 0000000..4acf3aa
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sbr_update_freq_scale.h
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: sbr_update_freq_scale.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SBR_UPDATE_FREQ_SCALE_H
+#define SBR_UPDATE_FREQ_SCALE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define MAX_OCTAVE        29
+#define MAX_SECOND_REGION 50
+
+/*----------------------------------------------------------------------------
+; 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 sbr_update_freq_scale(Int32 * v_k_master,
+                           Int32 *h_num_bands,
+                           const Int32 lsbM,
+                           const Int32 usb,
+                           const Int32 freqScale,
+                           const Int32 alterScale,
+                           const Int32 channelOffset);
+
+
+void CalcBands(Int32 * diff,
+               Int32 start,
+               Int32 stop,
+               Int32 num_bands);
+
+void cumSum(Int32 start_value,
+            Int32 * diff,
+            Int32 length,
+            Int32 * start_adress);
+
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/set_mc_info.cpp b/media/libstagefright/codecs/aacdec/set_mc_info.cpp
new file mode 100644
index 0000000..5a11941
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/set_mc_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/set_mc_info.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified per review comments
+
+ Description: Change audioObjectType from Int to enum types
+
+ Who:                               Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    pMC_Info    = pointer to structure MC_Info that holds information of
+                  multiple channels' configurations
+                  Data type pointer to MC_Info
+
+    objectType  = variable that holds the Audio Object Type of current
+                  file/bitstream.
+                  Data type Int
+
+    sampling_rate_idx = variable that indicates the sampling rate of the
+                        source file being encoded
+                        Data Type Int
+
+    tag         = variable that stores the element instance tag of the
+                  first (front) channel element.
+                  Data type Int
+
+    is_cpe      = variable that indicates if a Channel Pair Element (CPE)
+                  or a Single Channel Element (SCE) is used.
+                  Data type Int (maybe Boolean)
+
+    pWinSeqInfo = array of pointers that points to structures holding
+                  frame information of long and short window sequences.
+                  Data type FrameInfo
+
+    pSfbwidth128 = array that will store the scalefactor bandwidth of
+                   short window sequence frame.
+                   Data type Int array
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    return SUCCESS
+
+ Pointers and Buffers Modified:
+    pMC_Info->nch           contains the number of channels depending
+                            upon if CPE or SCE is used
+    pMC_Info->objectType    contents updated with the decoded Audio
+                            Object Type
+
+    pMC_Info->ch_info.tag   contents updated with the value of decoded
+                            channel element tag
+
+    PMC_Info->ch_info.cpe   contents updated depending upon if CPE or
+                            SCE is used
+
+    pWinSeqInfo             contents updated by calling infoinit if
+                            sampling_rate_idx is different from
+                            previous value
+
+    pSfbWidth128            contents updated by calling infoinit if
+                            sampling_rate_idx is different from
+                            previous value
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function initializes the channel configuration information. The
+ structure MC_Info stores the number of channels, channel element tag.
+ If sampling rate index is different from the previous value,
+ The frame information will be updated by calling infoinit.c
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall update the relevant information on channel configs
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+  (2) ISO/IEC 14496-3: 1999(E)
+    Subpart 1   p20 Table 1.6.3
+    Subpart 4   p30 5.1.2.1
+    Subpart 4   p31 4.5.2.1.1
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    pMC_Info->nch   = 0;
+
+    pMC_Info->profile = objectType;
+
+    IF (pMC_Info->sampling_rate_idx != sampling_rate_idx)
+    THEN
+        pMC_Info->sampling_rate_idx = sampling_rate_idx;
+
+        CALL infoinit(
+                samp_rate_idx = sampling_rate_idx
+                ppWin_seq_info= pWinSeqInfo
+                pSfbwidth128  = pSfbwidth128)
+        MODIFYING(pWinSeqInfo, pSfbwidth128)
+        RETURNING(None)
+    ENDIF
+
+    pCh_Info = &pMC_Info->ch_info[0];
+    pCh_Info->tag = tag;
+
+    IF (is_cpe == FALSE)
+    THEN
+        pCh_Info->cpe = FALSE;
+
+        pMC_Info->nch = 1;
+
+    ELSE
+        pCh_Info->cpe = TRUE;
+        pCh_Info = &pMC_Info->ch_info[1];
+        pCh_Info->tag = tag;
+        pCh_Info->cpe = TRUE;
+
+        pMC_Info->nch = 2;
+
+    ENDIF
+
+    RETURN(SUCCESS)
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "set_mc_info.h"
+#include    "huffman.h"
+#include    "s_ch_info.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
+----------------------------------------------------------------------------*/
+Int set_mc_info(
+    MC_Info     *pMC_Info,
+    const tMP4AudioObjectType audioObjectType, /* used to be profile */
+    const Int    sampling_rate_idx,
+    const Int    tag,   /* always pass-in last element's value */
+    const Int    is_cpe,
+    FrameInfo   *pWinSeqInfo[],
+    Int          sfbwidth128[]
+)
+{
+    Ch_Info *pCh_Info; /*optional task: eliminate this structure */
+
+    /*
+     *   audioObjectType and sampling rate
+     *   re-configure if new sampling rate
+     *
+     */
+    pMC_Info->audioObjectType = audioObjectType;
+
+    if (pMC_Info->sampling_rate_idx != sampling_rate_idx)
+    {
+        pMC_Info->sampling_rate_idx = sampling_rate_idx;
+
+        Int status;
+        status = infoinit(sampling_rate_idx,
+                          pWinSeqInfo,
+                          sfbwidth128);
+        if (SUCCESS != status)
+        {
+            return 1;
+        }
+    }
+
+    /*
+     * first setup values for mono config, Single Channel Element (SCE)
+     * then if stereo, go inside if(is_cpe != FALSE) branch to setup
+     * values for stereo.
+     * set the channel counts
+     * save tag for left channel
+     */
+    pMC_Info->nch   = 1 + is_cpe;
+
+    pCh_Info = &pMC_Info->ch_info[0];
+    pCh_Info->tag = tag;
+    pCh_Info->cpe = is_cpe;
+
+    /* This if branch maybe deleted in the future */
+    if (is_cpe != FALSE)
+    {
+        /* Channel Pair Element (CPE) */
+        /* right channel*/
+        pCh_Info = &pMC_Info->ch_info[1];
+        pCh_Info->cpe = TRUE;
+
+    }
+
+    return(SUCCESS); /* possible future error checkings */
+}
diff --git a/media/libstagefright/codecs/aacdec/set_mc_info.h b/media/libstagefright/codecs/aacdec/set_mc_info.h
new file mode 100644
index 0000000..8043b3b
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/set_mc_info.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/set_mc_info.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: (1) use enum type for audioObjectType (2) update revision history
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file includes function declaration for set_mc_info.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SET_MC_INFO_H
+#define SET_MC_INFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_mc_info.h"
+#include    "s_frameinfo.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
+----------------------------------------------------------------------------*/
+Int set_mc_info(
+    MC_Info     *pMC_Info,
+    const tMP4AudioObjectType objectType, /* used to be profile */
+    const Int    sampling_rate_idx,
+    const Int    tag,   /* always pass-in last element's value */
+    const Int    is_cpe,
+    FrameInfo   *pWinSeqInfo[],
+    Int          pSfbwidth128[]
+);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/sfb.cpp b/media/libstagefright/codecs/aacdec/sfb.cpp
new file mode 100644
index 0000000..f2d3a3e
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sfb.cpp
@@ -0,0 +1,275 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/sfb.c
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: created to define the scalefactor bands for all sampling rates
+
+ Description: Change short to Int16
+
+ Description: Modified structure to avoid assigning addresses to constant
+              tables. This solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers
+              - Eliminated redundant vector sfb_96_128.
+              - Eliminated references to contant vector addresses in
+                samp_rate_info
+
+ Who:                              Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+ Local Stores/Buffers/Pointers Needed:
+
+ Global Stores/Buffers/Pointers Needed:
+
+ Outputs:
+
+ Pointers and Buffers Modified:
+
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function defines the scalefactor bands for all sampling rates
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3: 1999(E)
+    Subpart 4       p66     (sfb tables)
+                    p111    (4.6.10)
+                    p200    (Annex 4.B.5)
+
+------------------------------------------------------------------------------
+ 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    "pv_audio_type_defs.h"
+#include    "sfb.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
+----------------------------------------------------------------------------*/
+const Int16 sfb_96_1024[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    32, 36, 40, 44, 48, 52, 56,
+    64, 72, 80, 88, 96, 108, 120,
+    132, 144, 156, 172, 188, 212, 240,
+    276, 320, 384, 448, 512, 576, 640,
+    704, 768, 832, 896, 960, 1024
+};         /* 41 scfbands */
+
+const Int16 sfb_64_1024[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    32, 36, 40, 44, 48, 52, 56,
+    64, 72, 80, 88, 100, 112, 124,
+    140, 156, 172, 192, 216, 240, 268,
+    304, 344, 384, 424, 464, 504, 544,
+    584, 624, 664, 704, 744, 784, 824,
+    864, 904, 944, 984, 1024
+};               /* 41 scfbands 47 */
+
+const Int16 sfb_64_128[] =
+{
+    4, 8, 12, 16, 20, 24, 32,
+    40, 48, 64, 92, 128
+};                   /* 12 scfbands */
+
+
+const Int16 sfb_48_1024[] =
+{
+    4,  8,  12, 16, 20, 24, 28,
+    32, 36, 40, 48, 56, 64, 72,
+    80, 88, 96, 108,    120,    132,    144,
+    160,    176,    196,    216,    240,    264,    292,
+    320,    352,    384,    416,    448,    480,    512,
+    544,    576,    608,    640,    672,    704,    736,
+    768,    800,    832,    864,    896,    928,    1024
+};
+/* 49  scfbands*/
+
+const Int16 sfb_48_128[] =
+{
+    4,  8,  12, 16, 20, 28, 36,
+    44, 56, 68, 80, 96, 112, 128
+};         /* 14 scfbands */
+
+const Int16 sfb_32_1024[] =
+{
+    4,  8,  12, 16, 20, 24, 28,
+    32, 36, 40, 48, 56, 64, 72,
+    80, 88, 96, 108,    120,    132,    144,
+    160,    176,    196,    216,    240,    264,    292,
+    320,    352,    384,    416,    448,    480,    512,
+    544,    576,    608,    640,    672,    704,    736,
+    768,    800,    832,    864,    896,    928,    960,
+    992,    1024
+};                         /* 51 scfbands */
+
+const Int16 sfb_24_1024[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    32, 36, 40, 44, 52, 60, 68,
+    76, 84, 92, 100, 108, 116, 124,
+    136, 148, 160, 172, 188, 204, 220,
+    240, 260, 284, 308, 336, 364, 396,
+    432, 468, 508, 552, 600, 652, 704,
+    768, 832, 896, 960, 1024
+};              /* 47 scfbands */
+
+const Int16 sfb_24_128[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    36, 44, 52, 64, 76, 92, 108,
+    128
+};                                   /* 15 scfbands */
+
+const Int16 sfb_16_1024[] =
+{
+    8, 16, 24, 32, 40, 48, 56,
+    64, 72, 80, 88, 100, 112, 124,
+    136, 148, 160, 172, 184, 196, 212,
+    228, 244, 260, 280, 300, 320, 344,
+    368, 396, 424, 456, 492, 532, 572,
+    616, 664, 716, 772, 832, 896, 960,
+    1024
+};                                  /* 43 scfbands */
+
+const Int16 sfb_16_128[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    32, 40, 48, 60, 72, 88, 108,
+    128
+};                                   /* 15 scfbands */
+
+const Int16 sfb_8_1024[] =
+{
+    12, 24, 36, 48, 60, 72, 84,
+    96, 108, 120, 132, 144, 156, 172,
+    188, 204, 220, 236, 252, 268, 288,
+    308, 328, 348, 372, 396, 420, 448,
+    476, 508, 544, 580, 620, 664, 712,
+    764, 820, 880, 944, 1024
+};               /* 40 scfbands */
+
+const Int16 sfb_8_128[] =
+{
+    4, 8, 12, 16, 20, 24, 28,
+    36, 44, 52, 60, 72, 88, 108,
+    128
+};                                   /* 15 scfbands */
+
+const SR_Info samp_rate_info[12] =
+{
+    /* sampling_frequency, #long sfb, #short sfb */
+    /* samp_rate, nsfb1024, nsfb128 */
+    {96000, 41, 12},       /* 96000 */
+    {88200, 41, 12},       /* 88200 */
+    {64000, 47, 12},       /* 64000 */
+    {48000, 49, 14},       /* 48000 */
+    {44100, 49, 14},       /* 44100 */
+    {32000, 51, 14},       /* 32000 */
+    {24000, 47, 15},       /* 24000 */
+    {22050, 47, 15},       /* 22050 */
+    {16000, 43, 15},       /* 16000 */
+    {12000, 43, 15},       /* 12000 */
+    {11025, 43, 15},       /* 11025 */
+    { 8000, 40, 15},       /* 8000  */
+};
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
diff --git a/media/libstagefright/codecs/aacdec/sfb.h b/media/libstagefright/codecs/aacdec/sfb.h
new file mode 100644
index 0000000..0cc1707
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/sfb.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: sfb.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: created to declare scalefactor bands for all sampling rates
+
+ Description: Change short to Int16
+
+ Description: Eliminated declaration of sfb_96_128 array, values are equal
+              to array sfb_64_128
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ this file declares the scalefactor bands for all sampling rates
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SFB_H
+#define SFB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_sr_info.h"
+#include    "e_progconfigconst.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
+----------------------------------------------------------------------------*/
+extern  const Int16 sfb_96_1024[];  /* 41 scfbands */
+
+extern const Int16 sfb_64_1024[];  /* 41 scfbands 47 */
+
+extern const Int16 sfb_64_128[];  /* 12 scfbands */
+
+
+extern const Int16 sfb_48_1024[]; /* 49 scfbands */
+
+extern const Int16 sfb_48_128[];  /* 14 scfbands */
+
+extern const Int16 sfb_32_1024[];  /* 51 scfbands */
+
+extern const Int16 sfb_24_1024[];  /* 47 scfbands */
+
+extern const Int16 sfb_24_128[];  /* 15 scfbands */
+
+extern const Int16 sfb_16_1024[];  /* 43 scfbands */
+
+extern const Int16 sfb_16_128[];  /* 15 scfbands */
+
+extern const Int16 sfb_8_1024[];  /* 40 scfbands */
+
+extern const Int16 sfb_8_128[];  /* 15 scfbands */
+
+extern const SR_Info samp_rate_info[12];
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/shellsort.cpp b/media/libstagefright/codecs/aacdec/shellsort.cpp
new file mode 100644
index 0000000..5feb803
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/shellsort.cpp
@@ -0,0 +1,138 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: shellsort.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+        Sorting routine
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "shellsort.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 shellsort(Int32 in[], Int32 n)
+{
+
+    Int32     i;
+    Int32     j;
+    Int32     v;
+    Int32     inc = 1;
+
+    do
+    {
+        inc = 3 * inc + 1;
+    }
+    while (inc <= n);
+
+    do
+    {
+        inc = inc / 3;
+        for (i = inc + 1; i <= n; i++)
+        {
+            v = in[i-1];
+            j = i;
+            while (in[j-inc-1] > v)
+            {
+                in[j-1] = in[j-inc-1];
+                j -= inc;
+                if (j <= inc)
+                {
+                    break;
+                }
+            }
+            in[j-1] = v;
+        }
+    }
+    while (inc > 1);
+
+}
+
+#endif
+
diff --git a/media/libstagefright/codecs/aacdec/shellsort.h b/media/libstagefright/codecs/aacdec/shellsort.h
new file mode 100644
index 0000000..a4658e3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/shellsort.h
@@ -0,0 +1,84 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: shellsort.h
+ Funtions:
+    get_dse
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+------------------------------------------------------------------------------
+
+
+ ----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef SHELLSORT_H
+#define SHELLSORT_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+void shellsort(Int32 in[], Int32 n);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/stereo_2_mono.h b/media/libstagefright/codecs/aacdec/stereo_2_mono.h
new file mode 100644
index 0000000..3e27c70
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/stereo_2_mono.h
@@ -0,0 +1,97 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: stereo_2_mono.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for the declaration of the function stereo_2_mono()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef STEREO_2_MONO_H
+#define STEREO_2_MONO_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+    ----------------------------------------------------------------------------*/
+    void stereo_2_mono(
+        const Int16   sourceLeft[],
+        const Int16   sourceRight[],
+        Int16   outputBuffer[],
+        const Int     sourcePointsPerChannel);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* STEREO_2_MONO_H */
+
diff --git a/media/libstagefright/codecs/aacdec/synthesis_sub_band.cpp b/media/libstagefright/codecs/aacdec/synthesis_sub_band.cpp
new file mode 100644
index 0000000..c1418e3
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/synthesis_sub_band.cpp
@@ -0,0 +1,483 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Filename: synthesis_sub_band.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Who:                                   Date: MM/DD/YYYY
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    Int32 vec[],            Input vector, 32-bit
+    const Int32 *cosTerms,  Cosine Terms
+    Int32 *scratch_mem      Scratch memory
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Implement root squared of a number
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+#include "pv_audio_type_defs.h"
+#include "fxp_mul32.h"
+#include "dct64.h"
+#include "synthesis_sub_band.h"
+#include "mdst.h"
+#include "dct16.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Qfmt_30(x)   (Int32)(x*((Int32)(1<<30)) + (x>=0?0.5F:-0.5F))
+#define Qfmt_25(x)   (Int32)(x*((Int32)(1<<25))*(1.5625F) + (x>=0?0.5F:-0.5F))
+
+#define SCALE_DOWN_LP   Qfmt_30(0.075000F)  /* 3/40 */
+#define SCALE_DOWN_HQ     Qfmt_30(0.009375F*0.64F)  /* 3/40 * 1/8 */
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+const Int32 CosTable_64[64] =
+{
+    Qfmt_25(0.50003765191555F),   Qfmt_25(40.74468810335183F),   Qfmt_25(0.50033903744282F),   Qfmt_25(13.58429025728446F),
+    Qfmt_25(0.50094271763809F),   Qfmt_25(8.15384860246681F),   Qfmt_25(0.50185051748424F),   Qfmt_25(5.82768837784465F),
+    Qfmt_25(0.50306519130137F),   Qfmt_25(4.53629093696936F),   Qfmt_25(0.50459044322165F),   Qfmt_25(3.71524273832697F),
+    Qfmt_25(0.50643095492855F),   Qfmt_25(3.14746219178191F),   Qfmt_25(0.50859242104981F),   Qfmt_25(2.73164502877394F),
+    Qfmt_25(0.51108159270668F),   Qfmt_25(2.41416000025008F),   Qfmt_25(0.51390632984754F),   Qfmt_25(2.16395781875198F),
+    Qfmt_25(0.51707566313349F),   Qfmt_25(1.96181784857117F),   Qfmt_25(0.52059986630189F),   Qfmt_25(1.79520521907789F),
+    Qfmt_25(0.52449054011472F),   Qfmt_25(1.65559652426412F),   Qfmt_25(0.52876070920749F),   Qfmt_25(1.53699410085250F),
+    Qfmt_25(0.53342493339713F),   Qfmt_25(1.43505508844143F),   Qfmt_25(0.53849943529198F),   Qfmt_25(1.34655762820629F),
+    Qfmt_25(0.54400224638178F),   Qfmt_25(1.26906117169912F),   Qfmt_25(0.54995337418324F),   Qfmt_25(1.20068325572942F),
+    Qfmt_25(0.55637499348989F),   Qfmt_25(1.13994867510150F),   Qfmt_25(0.56329166534170F),   Qfmt_25(1.08568506425801F),
+    Qfmt_25(0.57073058801215F),   Qfmt_25(1.03694904091039F),   Qfmt_25(0.57872188513482F),   Qfmt_25(0.99297296126755F),
+    Qfmt_25(0.58729893709379F),   Qfmt_25(0.95312587439212F),   Qfmt_25(0.59649876302446F),   Qfmt_25(0.91688444618465F),
+    Qfmt_25(0.60636246227215F),   Qfmt_25(0.88381100455962F),   Qfmt_25(0.61693572600507F),   Qfmt_25(0.85353675100661F),
+    Qfmt_25(0.62826943197077F),   Qfmt_25(0.82574877386279F),   Qfmt_25(0.64042033824166F),   Qfmt_25(0.80017989562169F),
+    Qfmt_25(0.65345189537513F),   Qfmt_25(0.77660065823396F),   Qfmt_25(0.66743520092634F),   Qfmt_25(0.75481293911653F),
+    Qfmt_25(0.68245012597642F),   Qfmt_25(0.73464482364786F),   Qfmt_25(0.69858665064723F),   Qfmt_25(0.71594645497057F),
+};
+
+
+/*----------------------------------------------------------------------------
+; 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_sub_band_LC(Int32 Sr[], Int16 data[])
+{
+
+    Int32 *temp_o1 = (Int32 *) & data[0];
+
+    Int   i;
+    Int32 *pt_temp_e;
+    Int32 *pt_temp_o = temp_o1;
+    Int32 *pt_temp_x = &Sr[63];
+    Int32 temp1;
+    Int32 temp2;
+    Int32 temp3;
+    Int32 temp11;
+
+    Int16 *pt_data_1;
+    Int16 *pt_data_2;
+
+    Int32 *pt_Sr_1 = Sr;
+    Int16 tmp1;
+    Int16 tmp2;
+    Int16 tmp11;
+    Int16 tmp22;
+    const Int32 *pt_cosTerms = CosTable_48;
+
+
+    temp2 = *(pt_temp_x--);
+    for (i = 20; i != 0; i--)
+    {
+        temp1 = *(pt_Sr_1);
+        temp3 = *(pt_cosTerms++);
+        *(pt_Sr_1++) =   temp1  + temp2;
+        *(pt_temp_o++) = fxp_mul32_Q31((temp1 - temp2), temp3) << 1;
+        temp2 = *(pt_temp_x--);
+    }
+
+    for (i = 12; i != 0; i--)
+    {
+        temp1 = *(pt_Sr_1);
+        temp3 = *(pt_cosTerms++);
+        *(pt_Sr_1++) =   temp1  + temp2;
+        *(pt_temp_o++) = fxp_mul32_Q26((temp1 - temp2), temp3);
+        temp2 = *(pt_temp_x--);
+    }
+
+
+    pv_split_LC(temp_o1, &Sr[32]);
+
+    dct_16(temp_o1, 1);     // Even terms
+    dct_16(&Sr[32], 1);     // Odd  terms
+
+    /* merge */
+
+
+    pt_Sr_1 = &temp_o1[31];
+    pt_temp_e   =  &temp_o1[15];
+    pt_temp_o   =  &Sr[47];
+
+    temp1 = *(pt_temp_o--);
+    *(pt_Sr_1--) = temp1;
+    for (i = 5; i != 0; i--)
+    {
+        temp2 = *(pt_temp_o--);
+        *(pt_Sr_1--) = *(pt_temp_e--);
+        *(pt_Sr_1--) = temp1 + temp2;
+        temp3 = *(pt_temp_o--);
+        *(pt_Sr_1--) = *(pt_temp_e--);
+        *(pt_Sr_1--) = temp2 + temp3;
+        temp1 = *(pt_temp_o--);
+        *(pt_Sr_1--) = *(pt_temp_e--);
+        *(pt_Sr_1--) = temp1 + temp3;
+    }
+
+
+    pv_split_LC(Sr, &Sr[32]);
+
+    dct_16(Sr, 1);     // Even terms
+    dct_16(&Sr[32], 1);     // Odd  terms
+
+
+    pt_temp_x   =  &temp_o1[31];
+    pt_temp_e   =  &Sr[15];
+    pt_temp_o   =  &Sr[47];
+
+    pt_data_1 = &data[95];
+
+    temp2  = *(pt_temp_x--);
+    temp11 = *(pt_temp_x--);
+    temp1  = *(pt_temp_o--);
+
+    *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp2, SCALE_DOWN_LP);
+    *(pt_data_1--) = (Int16) fxp_mul32_Q31(temp1, SCALE_DOWN_LP);
+
+    for (i = 5; i != 0; i--)
+    {
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
+        temp3         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
+        temp2          = *(pt_temp_o--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP);
+        temp11         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp2), SCALE_DOWN_LP);
+
+
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp3), SCALE_DOWN_LP);
+        temp1         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
+        temp3          = *(pt_temp_o--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP);
+        temp11         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp2 + temp3), SCALE_DOWN_LP);
+
+
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp1), SCALE_DOWN_LP);
+        temp2         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e--), SCALE_DOWN_LP);
+        temp1          = *(pt_temp_o--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
+        temp11         = *(pt_temp_x--);
+        *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp1 + temp3), SCALE_DOWN_LP);
+    }
+
+    *(pt_data_1--) = (Int16) fxp_mul32_Q31((temp11 + temp2), SCALE_DOWN_LP);
+    *(pt_data_1--) = (Int16) fxp_mul32_Q31(*(pt_temp_e), SCALE_DOWN_LP);
+
+    /* ---- merge ends---- */
+
+
+    pt_data_1 = &data[95];
+    pt_data_2 = &data[96];
+
+    *(pt_data_2++) =   0;
+    tmp1  =  *(pt_data_1--);
+    tmp2  =  *(pt_data_1--);
+    tmp11 =  *(pt_data_1--);
+    tmp22 =  *(pt_data_1--);
+
+    for (i = 7; i != 0; i--)
+    {
+        *(pt_data_2++) = (-tmp1);
+        *(pt_data_2++) = (-tmp2);
+        *(pt_data_2++) = (-tmp11);
+        *(pt_data_2++) = (-tmp22);
+        tmp1  =  *(pt_data_1--);
+        tmp2  =  *(pt_data_1--);
+        tmp11 =  *(pt_data_1--);
+        tmp22 =  *(pt_data_1--);
+    }
+
+
+    *(pt_data_2++) = (-tmp1);
+    *(pt_data_2++) = (-tmp2);
+    *(pt_data_2++) = (-tmp11);
+
+    pt_data_2 = &data[0];
+
+    *(pt_data_2++) =  tmp22;
+    tmp1  =  *(pt_data_1--);
+    tmp2  =  *(pt_data_1--);
+    tmp11 =  *(pt_data_1--);
+    tmp22 =  *(pt_data_1--);
+
+    for (i = 7; i != 0; i--)
+    {
+        *(pt_data_2++) =  tmp1;
+        *(pt_data_2++) =  tmp2;
+        *(pt_data_2++) =  tmp11;
+        *(pt_data_2++) =  tmp22;
+        tmp1  =  *(pt_data_1--);
+        tmp2  =  *(pt_data_1--);
+        tmp11 =  *(pt_data_1--);
+        tmp22 =  *(pt_data_1--);
+    }
+
+    *(pt_data_2++) =  tmp1;
+    *(pt_data_2++) =  tmp2;
+    *(pt_data_2++) =  tmp11;
+    *(pt_data_2)   =  tmp22;
+
+}
+
+
+void synthesis_sub_band_LC_down_sampled(Int32 Sr[], Int16 data[])
+{
+
+    Int i ;
+    Int16 *pt_data_1;
+
+    pt_data_1 = &data[0];
+
+    dct_32(Sr);
+
+    for (i = 0; i < 16; i++)
+    {
+        pt_data_1[   i] = (Int16)(Sr[16-i] >> 5);
+        pt_data_1[16+i] = (Int16)(Sr[i] >> 5);
+        pt_data_1[32+i] = (Int16)(Sr[16+i] >> 5);
+    }
+    for (i = 0; i < 15; i++)
+    {
+        pt_data_1[49+i] = (Int16)(-Sr[31-i] >> 5);
+    }
+    pt_data_1[48] = 0;
+}
+
+
+#ifdef HQ_SBR
+
+void synthesis_sub_band(Int32 Sr[], Int32 Si[], Int16 data[])
+{
+
+
+    Int32 i ;
+    Int16 *pt_data_1;
+    Int16 *pt_data_2;
+    Int32 *pt_Sr_1;
+    Int32 *pt_Sr_2;
+    Int32 *pt_Si_1;
+    Int32 *pt_Si_2;
+
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 tmp3;
+    Int32 tmp4;
+
+    Int32 cosx;
+    const Int32 *pt_CosTable = CosTable_64;
+
+
+    pt_Sr_1 = &Sr[0];
+    pt_Sr_2 = &Sr[63];
+
+    pt_Si_1 = &Si[0];
+    pt_Si_2 = &Si[63];
+
+
+    tmp3 = *pt_Sr_1;
+
+    for (i = 32; i != 0; i--)
+    {
+        tmp4 = *pt_Si_2;
+        cosx = *(pt_CosTable++);
+        *(pt_Sr_1++) = fxp_mul32_Q31(tmp3, cosx);
+        tmp3 = *pt_Si_1;
+        *(pt_Si_1++) = fxp_mul32_Q31(tmp4, cosx);
+        tmp4 = *pt_Sr_2;
+        cosx = *(pt_CosTable++);
+        *(pt_Si_2--) = fxp_mul32_Q31(tmp3, cosx);
+        *(pt_Sr_2--) = fxp_mul32_Q31(tmp4, cosx);
+        tmp3 = *pt_Sr_1;
+    }
+
+
+    dct_64(Sr, (Int32 *)data);
+    dct_64(Si, (Int32 *)data);
+
+
+    pt_data_1 = &data[0];
+    pt_data_2 = &data[127];
+
+    pt_Sr_1 = &Sr[0];
+    pt_Si_1 = &Si[0];
+
+    tmp1 = *(pt_Sr_1++);
+    tmp3 = *(pt_Sr_1++);
+    tmp2 = *(pt_Si_1++);
+    tmp4 = *(pt_Si_1++);
+
+    for (i = 32; i != 0; i--)
+    {
+        *(pt_data_1++) = (Int16) fxp_mul32_Q31((tmp2 - tmp1), SCALE_DOWN_HQ);
+        *(pt_data_1++) = (Int16) fxp_mul32_Q31(-(tmp3 + tmp4), SCALE_DOWN_HQ);
+        *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp1 + tmp2), SCALE_DOWN_HQ);
+        *(pt_data_2--) = (Int16) fxp_mul32_Q31((tmp3 - tmp4), SCALE_DOWN_HQ);
+
+        tmp1 = *(pt_Sr_1++);
+        tmp3 = *(pt_Sr_1++);
+        tmp2 = *(pt_Si_1++);
+        tmp4 = *(pt_Si_1++);
+    }
+
+}
+
+
+const Int32 exp_m0_25_phi[32] =
+{
+
+    0x7FFEFE6E,  0x7FEAFB4A, 0x7FC2F827, 0x7F87F505,
+    0x7F38F1E4,  0x7ED6EEC6, 0x7E60EBAB, 0x7DD6E892,
+    0x7D3AE57D,  0x7C89E26D, 0x7BC6DF61, 0x7AEFDC59,
+    0x7A06D958,  0x790AD65C, 0x77FBD367, 0x76D9D079,
+    0x75A6CD92,  0x7460CAB2, 0x7308C7DB, 0x719EC50D,
+    0x7023C248,  0x6E97BF8C, 0x6CF9BCDA, 0x6B4BBA33,
+    0x698CB796,  0x67BDB505, 0x65DEB27F, 0x63EFB005,
+    0x61F1AD97,  0x5FE4AB36, 0x5DC8A8E2, 0x5B9DA69C
+};
+
+void synthesis_sub_band_down_sampled(Int32 Sr[], Int32 Si[], Int16 data[])
+{
+
+    Int16 k;
+    Int16 *pt_data_1;
+    Int32 exp_m0_25;
+    const Int32 *pt_exp = exp_m0_25_phi;
+
+    Int32 *XX = Sr;
+    Int32 *YY = (Int32 *)data;
+    Int32 tmp1;
+    Int32 tmp2;
+
+    for (k = 0; k < 32; k++)
+    {
+        exp_m0_25 = *(pt_exp++);
+        tmp1 = Sr[k];
+        tmp2 = Si[k];
+        XX[k]    = cmplx_mul32_by_16(-tmp1,  tmp2, exp_m0_25);
+        YY[31-k] = cmplx_mul32_by_16(tmp2,  tmp1, exp_m0_25);
+    }
+
+    mdct_32(XX);
+    mdct_32(YY);
+
+    for (k = 0; k < 32; k++)
+    {
+        Si[k] = YY[k];
+    }
+
+    pt_data_1 = data;
+
+    for (k = 0; k < 16; k++)
+    {
+        *(pt_data_1++)  = (Int16)((XX[2*k  ] + Si[2*k  ]) >> 14);
+        *(pt_data_1++)  = (Int16)((XX[2*k+1] - Si[2*k+1]) >> 14);
+    }
+
+    for (k = 15; k > -1; k--)
+    {
+        *(pt_data_1++)  = (Int16)(-(XX[2*k+1] + Si[2*k+1]) >> 14);
+        *(pt_data_1++)  = (Int16)(-(XX[2*k  ] - Si[2*k  ]) >> 14);
+    }
+
+}
+
+
+#endif      /* HQ_SBR */
+
+#endif      /*  AAC_PLUS */
+
+
diff --git a/media/libstagefright/codecs/aacdec/synthesis_sub_band.h b/media/libstagefright/codecs/aacdec/synthesis_sub_band.h
new file mode 100644
index 0000000..042c488
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/synthesis_sub_band.h
@@ -0,0 +1,78 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: synthesis_sub_band.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef SYNTHESIS_SUB_BAND_H
+#define SYNTHESIS_SUB_BAND_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES AND SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+    void synthesis_sub_band_LC(Int32 Sr[], Int16 data[]);
+    void synthesis_sub_band_LC_down_sampled(Int32 Sr[], Int16 data[]);
+
+
+#ifdef HQ_SBR
+
+    void synthesis_sub_band(Int32 Sr[], Int32 Si[], Int16 data[]);
+    void synthesis_sub_band_down_sampled(Int32 Sr[], Int32 Si[], Int16 data[]);
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* SYNTHESIS_SUB_BAND_H */
+
diff --git a/media/libstagefright/codecs/aacdec/tns_ar_filter.cpp b/media/libstagefright/codecs/aacdec/tns_ar_filter.cpp
new file mode 100644
index 0000000..db31a63
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_ar_filter.cpp
@@ -0,0 +1,474 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_ar_filter.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Implemented 24-bit fixed point version
+               Optimized C code
+
+ Description:
+            - Added OVERFLOW_SHIFT_DOWN to avoid overflow.
+            - Increased precision by using the Q format of the LPC coefficient.
+            - Modified interface to add LPC Q format and scratch memory
+              for the state variables.
+            - Added pv_memset to clear state filter
+            - Updated format for comments (to PV standard)
+            - Updated copyright notice
+
+ Description:
+            - Changed multiplication scheme to increase precision. This
+              works better than older version.
+
+ Description:
+            - Include log2(order) as a scaling down parameter.
+
+ Description:
+            Modified to reflect code review comments
+                - misspelled words, extra comments and explicit requirements
+
+ Description:
+            deleted comment about fix Q format (L 107)
+
+ Description:  Implemented a more efficient version, which eliminated the use
+ of "scratch memory" via introducing a pointer that references the actual
+ output.
+
+ Description: Removed the parameter "scratch_Int32_buffer" as this space
+ in memory is no longer needed by this function.
+
+ Description: Removed references to "scratch_Int32_buffer" in the Inputs
+ section.
+
+ Description:
+    Modified casting to ensure proper operations for different platforms
+
+ Description:
+    Per code review comment:
+    Eliminated casting to UInt and Int in b_low and b_high, they are
+    redundant and may add unncessary extra cycles in some platforms
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Description: Changed the order of the unsigned * signed multiply so the
+ casting to Int32 is performed on the unsigned operand.
+
+ Description:
+    Modified 32 by 16 bit multiplications to avoid unnecessary moves to
+    registers. Also split the code (based on flag direction) to simplify
+    pointer's updates
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    spec  = spectral input to be shaped by the filter.
+            Fixed point format
+            Int32[]
+            length = spec_length
+
+    spec_length  = length of spec array.
+            const Int
+
+    direction = direction for application of tns filter.
+                +1  filters spectrum from low to high frequencies
+                    (first input to filter is spec[0])
+                -1  filters spectrum from high to low frequencies
+                    (first input to filter is spec[spec_length-1])
+                const Int
+
+    lpc   = array of lpc coefficients, minus lpc[0] which is assumed to be "1"
+            Fixed point format
+            const Int[]
+            length = TNS_MAX_ORDER
+
+    Q_lpc = Q format for the lpc coeffcients (for max. precision, it assumes
+            that all 16 bits are used)
+            const Int
+
+    order = order of the TNS filter (Range of 1 - TNS_MAX_ORDER)
+            Int
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    spec = contains spectral data after application of TNS filter
+           Int32 array
+           length = spec_length
+
+
+ Local Stores Modified:
+
+ Global Stores Modified:
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    A block of spectral data (Int32 spec[]) of length (const Int spec_length)
+    is processed by a simple all-pole filter defined by
+    LPC coefficients passed via (const Int lpc[])
+
+    TNS filter equation
+        y(n) =  x(n) - lpc(2)*y(n-1) - ... - lpc(order+1)*y(n-order)
+
+    The filter calculation is performed in place, i.e. the output is passed
+    back to the calling function via (Int32 spec[])
+
+    The filter's order is defined by the variable (const Int order)
+    The direction of the filter's application is defined by (const Int inc)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This function should match the functionality of the ISO code.
+    The implementation does support filter orders bigger or equal to 1.
+    The size of the spectral coeffcients has to be bigger or equal than 1.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.8 (Temporal Noise Shaping)
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+    FOR (i=0; i<order; i++)
+        state[i] = 0;
+    ENDFOR
+
+    IF (inc == -1)
+    THEN
+        spec = spec + spec_length - 1;
+    ENDIF
+
+    FOR (i=0; i<spec_length; i++)
+
+        y = *spec;
+
+        FOR (j=0; j<order; j++)
+
+            y -= lpc[j] * state[j];
+
+        ENDFOR
+
+        FOR (j=order-1; j>0; j--)
+
+            state[j] = state[j-1];
+
+        ENDFOR
+
+        state[0] = y;
+
+        *spec = y;
+
+        spec = spec + inc;
+
+    ENDFOR
+
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+
+   When the code is written for a specific target processor
+     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 "pv_audio_type_defs.h"
+#include "e_tns_const.h"
+#include "tns_ar_filter.h"
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define MASK_LOW16               0xFFFF
+#define UPPER16                      16
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+Int tns_ar_filter(
+    Int32 spec[],
+    const Int spec_length,
+    const Int direction,
+    const Int32 lpc[],
+    const Int Q_lpc,
+    const Int order)
+{
+
+    Int i;
+    Int j;
+
+    /*
+     * Multiplication related variables
+     */
+
+    Int32 temp;
+
+    /*
+     *  Filter related variables
+     */
+    Int32 y0;
+
+    /*
+     *  Circular buffer to hold the filter's state
+     *  (y[n-1],y[n-2],y[n-3],etc.)
+     *
+     *  p_state and p_lpc should take advantage
+     *  of any special circular buffer instructions
+     *  if this code is hand-optimized in assembly.
+     */
+
+    Int32 *p_state = NULL;
+
+    const Int32 *p_lpc;
+
+
+    Int shift_up;
+    Int shift_down_amount;
+
+    /*
+     *  Pointer to the I/O memory space
+     */
+    Int32 *p_spec = spec;
+
+
+    i = 0;
+    j = order;
+
+    /*
+     *  get the power of 2 that is bigger than the order
+     *  i is the bit counter and j is modified until exceed
+     *  the power of 2 corresponding to TNS_MAX_ORDER
+     */
+
+    while (j < 0x010)
+    {
+        j <<= 1;
+        i++;
+    }
+
+    /*
+     *  5 is the number of bits needed to represent 0x010
+     *  TNS_MAX_ORDER = 20, power of 2 that include 20 is 5
+     */
+    shift_down_amount = 4 - i;
+
+    shift_up = UPPER16 - Q_lpc;
+
+    /*
+     *  shift_down_amount == power of 2 that is bigger than the order - 1
+     */
+
+    shift_down_amount += shift_up;
+
+    if (direction == -1)
+    {
+        p_spec += spec_length - 1;
+
+        for (i = order; i != 0; i--)
+        {
+
+            y0 = *p_spec >> shift_down_amount;
+
+            p_lpc = lpc;
+
+            /* 32 by 32 bit multiplication */
+            for (j = order; j > i; j--)
+            {
+                temp = *p_state++;
+                y0 -= fxp_mul32_Q31(temp, *(p_lpc++)) << shift_up;
+            }
+
+            /*
+            * Record the output in-place
+            */
+            p_state     = p_spec;
+            *(p_spec--) = y0;
+
+        }
+
+        if (spec_length > order)
+        {
+            for (i = (spec_length - order); i != 0; i--)
+            {
+                y0 = *p_spec >> shift_down_amount;
+
+                p_lpc = &(lpc[0]);
+
+                /* 32 by 32 bit multiplication */
+                for (j = order; j != 0; j--)
+                {
+                    temp = *p_state++;
+                    y0 -= fxp_mul32_Q31(temp, *(p_lpc++)) << shift_up;
+                }
+
+                /*
+                 * Record the output in-place
+                 */
+                p_state     = p_spec;
+                *(p_spec--) = y0;
+
+            } /* END for (i = (spec_length - order); i>0; i--) */
+        }
+
+    }
+    else
+    {
+        for (i = order; i != 0; i--)
+        {
+
+            p_lpc =  lpc;
+
+            y0 = 0;
+
+            /* 32 by 32 bit multiplication */
+            for (j = order; j > i; j--)
+            {
+                y0 -= fxp_mul32_Q31(*p_state--, *(p_lpc++));
+            }
+
+            p_state     = p_spec;
+            /*
+            * Record the output in-place
+            */
+            *(p_spec) = (*p_spec >> shift_down_amount) + (y0 << shift_up);
+            p_spec++;
+        }
+
+        if (spec_length > order)
+        {
+            for (i = (spec_length - order); i != 0; i--)
+            {
+                p_lpc =  lpc;
+
+                y0 = 0;
+
+                /* 32 by 32 bit multiplication */
+                for (j = order; j != 0; j--)
+                {
+                    y0 -= fxp_mul32_Q31(*p_state--, *(p_lpc++));
+                }
+
+                p_state     = p_spec;
+                /*
+                 * Record the output in-place
+                 */
+                *(p_spec) = (*p_spec >> shift_down_amount) + (y0 << shift_up);
+                p_spec++;
+
+            } /* END for (i = (spec_length - order); i>0; i--) */
+        }
+    }
+
+    return(shift_down_amount);
+
+
+} /* tns_ar_filter */
diff --git a/media/libstagefright/codecs/aacdec/tns_ar_filter.h b/media/libstagefright/codecs/aacdec/tns_ar_filter.h
new file mode 100644
index 0000000..2538b4d4
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_ar_filter.h
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_ar_filter.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Per request of JT, the lpc coefficients q-format will now
+ be transmitted to the function.
+
+ Description: Removed the parameter "scratch_Int32_buffer" as this space
+ in memory is no longer needed by this function.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This function includes the function declaration for tns_ar_filter()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef TNS_AR_FILTER_H
+#define TNS_AR_FILTER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "e_tns_const.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    Int tns_ar_filter(
+        Int32 spec[],
+        const Int spec_length,
+        const Int inc,
+        const Int32 lpc[],
+        const Int lpc_qformat,
+        const Int order);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
diff --git a/media/libstagefright/codecs/aacdec/tns_decode_coef.cpp b/media/libstagefright/codecs/aacdec/tns_decode_coef.cpp
new file mode 100644
index 0000000..366cce5
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_decode_coef.cpp
@@ -0,0 +1,500 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_decode_coef.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Implemented in 16-bit Fixed Point
+
+ Description:  Implemented in 24-bit Fixed Point
+
+ Description:  Modified to return the calculated LPC coefficients "in place"
+ This saves memory, cycles, etc. because it saves a large temporary
+ array being declared on the stack in another function (tns_setup_filter)
+
+ Description:  Modified to return the q-format of the lpc coefficients.
+
+ Description:  Modified for more reliable overflow protection.  tns_decode_coef
+ no longer relies on "reasonable" outputs.  This code should handle all
+ possible inputs.
+
+ Description:  Modified per review comments.
+
+ Description:  Added check condition to avoid numbers with a Q bigger than
+        15 from being passed, otherwise in a 16-bit number the sign is lost.
+
+ Description:  Modified to utilize scratch memory techniques, thereby
+ eliminating two arrays of size TNS_MAX_ORDER, which were previously declared
+ on the stack.
+
+ Description: Updated the SW template to include the full pathname to the
+ source file and a slightly modified copyright header.
+
+ Description:
+ (1) Changed the order of the unsigned * signed multiply so the
+     casting to Int32 is performed on the unsigned operand.
+
+ (2) Removed some unnecessary casting.
+ (3) Fixed a problem where a 16-bit value was casted to 32-bits AFTER
+     a shift.  It should have been cast to 32-bits BEFORE the shifting.
+
+
+ Description:  modified precision of coefficients
+
+ Who:                                   Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ The inputs and their range are defined in ISO/IEC 14496-3:1999(E)
+                                            Part 3 MPEG-4 Audio
+                                            Subpart 4
+
+ Inputs:       order    = RANGE = 1-20
+               const Int
+
+               coef_res = RANGE = 0-1
+               const Int
+
+               lpc_coef = RANGE = -8 to 7 if coef_res = 1   compression OFF
+                                  -4 to 3 if coef_res = 1   compression ON
+                                  -4 to 3 if coef_res = 0   compression OFF
+                                  -2 to 1 if coef_res = 0   compression ON
+
+               [Int *, length TNS_MAX_ORDER]
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    q_lpc     = q_format for the calculated LPC coefs.
+    Int
+
+ Pointers and Buffers Modified:
+    lpc_coef  = used to return the calculated LPC coefs in-place.
+    Int *
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+This function calculates the LPC coefs from the encoded coefs...
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+This function should match the functionality of the ISO source code within
+a reasonable tolerance for fixed point errors.
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.8 (Temporal Noise Shaping)
+ (2) Markel & Gray Page 95
+     As referenced in the ISO source code
+
+ (3) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+ PSEUDOCODE:  (ISO Reference Code)
+
+    int i, m;
+    Real iqfac, iqfac_m;
+    Real lpc_fp[TNS_MAX_ORDER+1];
+    Real sin_result_fp[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1];
+
+    Inverse quantization
+    iqfac   = (Real)(((1 << (coef_res-1)) - 0.5) / (PI/2.0));
+    iqfac_m = (Real)(((1 << (coef_res-1)) + 0.5) / (PI/2.0));
+
+    for (i=0; i<order; i++)
+    {
+        sin_result[i+1] =
+        (Real)sin( coef[i] / ((coef[i] >= 0) ? iqfac : iqfac_m) );
+    }
+
+    lpc[0] = 1;
+    for (m=1; m<=order; m++)
+    {
+
+        b[0] = lpc[0];
+        for (i=1; i<m; i++)
+        {
+            b[i] = sin_result[m] * lpc[m-i];
+            b[i] += lpc[i];
+        }
+
+        b[m] = sin_result[m];
+
+
+        for (i=0; i<=m; i++)
+        {
+            lpc[i] = b[i];
+        }
+
+    }
+
+    return;
+
+}
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_tns_const.h"
+#include "tns_decode_coef.h"
+#include "fxp_mul32.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define MASK_LOW16  0xffff
+#define UPPER16     16
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL VARIABLE DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/*
+ * Derivation of tns_tables and q_tns_tables
+ *
+ * As defined in the ISO source code
+ * (with the modification that our coef_res has a range[0,1]
+ * The ISO code has a range of [3,4])
+ *
+ *               pi / 2                              pi / 2
+ * iqfac =  --------------------      iqfac_m =  --------------------
+ *          (coef_res + 2) - 1/                  (coef_res + 2) + 1/
+ *         2                 /2                 2                 /2
+ *
+ *
+ * ... Move 1/2 into denominator
+ *
+ *              pi                                   pi
+ * iqfac =  --------------------      iqfac_m =  --------------------
+ *          (coef_res + 3)                        (coef_res + 3)
+ *         2               - 1                   2              + 1
+ *
+ *
+ * if a coef is negative, it is multiplied by iqfac_m
+ *           if positive, "   "     "         iqfac
+ *
+ * The range of coefs is limited to  -4:3 if coef_res = 0
+ *                                   -8:7 if coef_res = 1
+ *
+ *
+ *
+ */
+
+
+const Int32 tns_table[2][16] =
+{
+    {
+        -2114858546,  -1859775393,  -1380375881,  -734482665,
+        0,    931758235,   1678970324,  2093641749
+    },
+    {
+        -2138322861,  -2065504841,  -1922348530,  -1713728946,
+        -1446750378,  -1130504462,   -775760571,   -394599085,
+        0,    446486956,    873460290,   1262259218,
+        1595891361,   1859775393,   2042378317,   2135719508
+    }
+};
+
+
+const Int neg_offset[2] = {4, 8};
+/*----------------------------------------------------------------------------
+; 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: tns_decode_coef
+    Decoder transmitted coefficients for one TNS filter
+----------------------------------------------------------------------------*/
+
+Int tns_decode_coef(
+    const Int   order,
+    const Int   coef_res,
+    Int32 lpc_coef[TNS_MAX_ORDER],
+    Int32 scratchTnsDecCoefMem[2*TNS_MAX_ORDER])
+{
+
+    /* Simple loop counters */
+    Int i;
+    Int m;
+
+    /* Arrays for calculation of the LPC */
+    Int32 *pB = &(scratchTnsDecCoefMem[TNS_MAX_ORDER]);
+
+    Int32 *pA = scratchTnsDecCoefMem;
+
+    Int32 *temp_ptr = NULL;
+
+    /* Pointer for reading/storing the lpc_coef in place */
+    Int32 *pLPC;
+    Int q_lpc = Q_LPC;
+
+    /* TNS table related variables */
+    const Int32 *pTnsTable;
+    Int coef_offset;
+    Int32 table_index;
+    Int shift_amount;
+    Int32 sin_result;
+
+    Int32 tempInt32;
+
+    Int32 max;
+    Int32 mask;
+
+    Int32 mult_high;
+
+    /* Conversion to LPC coefficients Ref. (2) */
+    coef_offset = neg_offset[coef_res];
+    pTnsTable   = tns_table[coef_res];
+
+    m = 0;
+    pLPC = lpc_coef;
+
+
+    /*
+     *  Conversion to LPC coefficients
+     */
+
+    do
+    {
+        table_index = coef_offset + *(pLPC++);
+
+        /* Equiv. to sin_result  = tns_table[coef_res][table_index]; */
+        sin_result = *(pTnsTable + table_index);
+
+        /* sin_result has a range of -0.999 to +0.999 in Q-31 */
+
+        /*
+         * It is important that this for loop is not entered on the first
+         * iteration of the do-while( m < order ) loop.
+         */
+        for (i = m; i > 0; i--)
+        {
+
+            /*
+             * temp_ptr used to optimize index into pA
+             * mult = (Int32)( pA[m-i] * sin_result);
+             */
+
+            mult_high = fxp_mul32_Q31(*(temp_ptr--), sin_result);
+
+            /*
+             *  pB[i] = pA[i] + sin_result * pA[m-i]
+             *
+             *  (mult_high <<1)  eliminates extra sign bit
+             */
+
+            *(pB++) =  *(pA++) + (mult_high << 1);
+
+        } /* END for (i=m; i > 0; i--) */
+
+
+        /* Shift to place pB[m] in q_lpc format */
+
+        *pB =  sin_result >> 12;
+
+        /*
+         * Swapping the pointers here has the same effect
+         * as specifically copying the data from b to a
+         */
+
+        temp_ptr = pA;
+        pA       = pB;
+        pB       = temp_ptr;
+
+        /*
+         *  At this point, pA = pA[m]
+         *             and pB = pB[m]
+         */
+        temp_ptr = pA;
+
+        tempInt32 = *(pA);
+
+        mask = tempInt32 >> 31;
+        tempInt32 ^= mask;
+
+        max = tempInt32;
+
+        /*
+         * It is important that this for loop is not entered on the first
+         * iteration of the do-while( m < order ) loop.
+         */
+        for (i = m; i > 0; i--)
+        {
+            tempInt32 = *(--pA);
+
+            mask = tempInt32 >> 31;
+            tempInt32 ^= mask;
+
+            max |= tempInt32;
+        }
+
+        pB -= m;
+
+        /*
+         * Here, pA = &(pA[0])
+         * and   pB = &(pB[0])
+         */
+
+        if (max >= 0x40000000L)
+        {
+            max >>= 1;
+
+            for (i = m; i > 0; i--)
+            {
+                *(pA++) >>= 1;
+                *(pB++) >>= 1;
+            }
+
+            /* Shift the most recent entry down also */
+            *(pA) >>= 1;
+
+            q_lpc--;
+
+            pA -= m;
+            pB -= m;
+        }
+
+        m++;
+
+    }
+    while (m < order);
+
+
+    /*
+     * The following code compacts
+     * 32-bit LPC coefficients into 16-bit numbers,
+     * shifting by the minimum amount necessary.
+     */
+
+    shift_amount = 0;
+
+    while (max > 32767)
+    {
+        max >>= 1;
+        shift_amount++;
+    }
+
+    /*
+     * This while loop is for protective purposes only.
+     * I have not found data that causes it to be entered.
+     *
+     */
+    if (max != 0)
+    {
+        while (max < 16384)
+        {
+            max <<= 1;
+            shift_amount--;
+        }
+    }
+
+
+    pLPC = lpc_coef;
+
+    if (shift_amount >= 0)
+    {
+
+        for (m = order; m > 0; m--)
+        {
+            *(pLPC++) = *(pA++) << (16 - shift_amount);
+        }
+    }
+
+
+    q_lpc -= shift_amount;
+
+    /*
+     *  make sure that the numbers have some meaning, q_lpc can not be
+     *  bigger than 15 (15 bits + sign)
+     */
+
+    if (q_lpc > 15)
+    {
+        shift_amount = q_lpc - 15;
+        pLPC = lpc_coef;
+
+        for (m = order; m > 0; m--)
+        {
+            *(pLPC++) >>= shift_amount;
+        }
+
+        q_lpc -= shift_amount;
+    }
+
+    return (q_lpc);
+
+} /* tns_decode_coef */
diff --git a/media/libstagefright/codecs/aacdec/tns_decode_coef.h b/media/libstagefright/codecs/aacdec/tns_decode_coef.h
new file mode 100644
index 0000000..a6bac6c
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_decode_coef.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_decode_coef.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Modified to return the LPC coefficients in-place, so the
+ interface to tns_decode_coef is changed.
+
+ Description: Modified to return the q-format of the LPC coefficients.
+
+ Description: Modified so that only the function is declared here.  extern
+ references to constant tables removed.  Also, new copyright header included.
+
+ Description: Modified to include extra parameter, so tns_decode_coef can use
+ scratch memory techniques.
+
+ Description:
+ (1) Modified to include the lines...
+
+    #ifdef __cplusplus
+    extern "C" {
+    #endif
+
+    #ifdef __cplusplus
+    }
+    #endif
+
+ (2) Updated the copyright header.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This function includes the function declaration for tns_decode_coef()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef TNS_DECODE_COEF_H
+#define TNS_DECODE_COEF_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+    Int tns_decode_coef(
+        const Int   order,
+        const Int   coef_res,
+        Int32 lpc_coef[],
+        Int32 scratchTnsDecCoefMem[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TNS_DECODE_COEF */
diff --git a/media/libstagefright/codecs/aacdec/tns_inv_filter.cpp b/media/libstagefright/codecs/aacdec/tns_inv_filter.cpp
new file mode 100644
index 0000000..631f887
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_inv_filter.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_inv_filter.c
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Changes made per review comments.
+
+ Description: As requested by JT, the q-format for the LPC coefficients is
+ now passed via the parameter lpc_qformat.
+
+ Description: For speed, the calculation of the shift amount was pulled
+ outside of the loop.
+
+ Description:
+    Modified casting to ensure proper operations for different platforms
+
+ Description:
+    Simplified MAC operations for filter by eliminating extra variables
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    coef           = spectral input to be shaped by the filter.
+                     Fixed point format
+                     [Int32[], length = num_coef]
+
+    num_coef       = length of spec array.
+                     [const Int]
+
+    direction      = direction for application of tns filter.
+                     +1 applies forward filter
+                     (first input to filter is coef[0])
+                     -1 applies reversed filter
+                     (first input to filter is coef[num_coef-1])
+                     [const Int]
+
+    lpc            = array of lpc coefficients.
+                     Fixed point format Q-11
+                     [const Int[], length = TNS_MAX_ORDER]
+
+    lpc_qformat    = The q-format of the lpc coefficients.
+                     [const Int]
+
+    order          = order of the TNS filter (Range of 1 : TNS_MAX_ORDER)
+                     [const Int]
+
+    scratch_memory = scratch_memory needed for filter operation
+                     [Int[], length = TNS_MAX_ORDER]
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    coef = contains spectral data after application of TNS filter
+           q-format is not modified.
+           Int32 array
+           length = num_coef
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    A block of spectral data (Int32 coef[]) of length (const Int num_coef)
+    is processed by a simple all-zero filter defined by
+    LPC coefficients passed via (const Int lpc[])
+
+    TNS filter equation
+        y(n) =  x(n) + lpc(2)*x(n-1) + ... + lpc(order+1)*x(n-order)
+
+    The filter calculation is performed in place, i.e. the output is passed
+    back to the calling function via (Int32 coef[])
+
+    In order to avoid overflow, the filter input (Int32 coef[]) must utilize
+    only the lower 16-bits.  The upper 16-bits must be available.
+
+    The filter's order is defined by the variable (const Int order)
+
+    The direction of the filter's application is defined by
+    (const Int direction)
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    [Int32 coef] must store no more than 16 bits of data.
+
+    This is required to utilize methods that do not change the q-format of
+    the input data [Int32 coef], and to make use of a fast
+    16 x 16 bit multiply.
+
+    This function should not be called for order <= 0.
+
+    This function must not be called with lpc_qformat < 5
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.6.4.1 (LTP with TNS)
+        Subpart 4.6.8 (Temporal Noise Shaping)
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF (direction == -1)
+    THEN
+        pCoef = pCoef + (num_coef - 1);
+    END IF
+
+    FOR (i = order; i > 0; i--)
+
+        *(pFilterInput) = 0;
+        pFilterInput = pFilterInput + 1;
+
+    END FOR
+
+    wrap_point = 0;
+
+    shift_amt  = (lpc_qformat - 5);
+
+    FOR (i = num_coef; i > 0; i--)
+
+        pLPC = lpc;
+
+        mult = 0;
+
+        FOR (j = wrap_point; j>0; j--)
+
+           tempInt32 = (Int32)(*(pLPC) * *(pFilterInput));
+           tempInt32 = tempInt32 >> 5;
+
+           mult = mult + tempInt32;
+
+           pFilterInput = pFilterInput + 1;
+           pLPC = pLPC + 1;
+
+        ENDFOR
+
+        pFilterInput = scratch_memory;
+
+        FOR (j = (order - wrap_point); j>0; j--)
+
+           tempInt32 = (Int32)(*(pLPC) * *(pFilterInput));
+           tempInt32 = tempInt32 >> 5;
+
+           mult = mult + tempInt32;
+
+           pFilterInput = pFilterInput + 1;
+           pLPC = pLPC + 1;
+
+        ENDFOR
+
+        pFilterInput = pFilterInput - 1;
+        *(pFilterInput) = (Int)(*pCoef);
+
+        mult = mult >> shift_amt;
+
+        *(pCoef) = *(pCoef) + mult;
+
+        pCoef = pCoef + direction;
+
+        wrap_point = wrap_point + 1;
+
+        IF (wrap_point == order)
+        THEN
+            wrap_point = 0;
+        END IF
+
+    END FOR
+
+------------------------------------------------------------------------------
+ RESOURCES USED
+
+   When the code is written for a specific target processor
+     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 "pv_audio_type_defs.h"
+#include "tns_inv_filter.h"
+#include "fxp_mul32.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 tns_inv_filter(
+    Int32 coef[],
+    const Int num_coef,
+    const Int direction,
+    const Int32 lpc[],
+    const Int lpc_qformat,
+    const Int order,
+    Int32 scratch_memory[])
+{
+
+    Int i;
+    Int j;
+    Int shift_amt;
+    Int wrap_point;
+
+    Int32 mult;
+
+    /*
+     * Circular buffer to hold the filter's input
+     *
+     * (x[n-1],x[n-2],x[n-3],etc.)
+     *
+     * This scratch space is necessary, because
+     * the filter's output is returned in-place.
+     *
+     * pFilterInput and pLPC should take advantage
+     * of any special circular buffer instructions
+     * if this code is hand-optimized in assembly.
+     *
+     */
+    Int32 *pFilterInput = scratch_memory;
+
+    const Int32 *pLPC;
+
+    /*
+     * Pointer to the I/O memory space
+     */
+    Int32 *pCoef = coef;
+
+    if (direction == -1)
+    {
+        pCoef += (num_coef - 1);
+    }
+
+    /* Make sure the scratch memory is "clean" */
+    for (i = order; i != 0; i--)
+    {
+        *(pFilterInput++) = 0;
+    }
+
+    wrap_point = 0;
+
+    shift_amt  = (lpc_qformat - 5);
+
+    for (i = num_coef; i > 0; i--)
+    {
+        /*
+         * Copy spectral input into special
+         * filter input buffer.
+         */
+        pLPC = lpc;
+
+        mult = 0;
+
+        /*
+         * wrap_point = 0 when this code is
+         * entered for the first iteration of
+         * for(i=num_coef; i>0; i--)
+         *
+         * So, this first for-loop will be
+         * skipped when i == num_coef.
+         */
+
+        for (j = wrap_point; j > 0; j--)
+        {
+            mult += fxp_mul32_Q31(*(pLPC++), *(pFilterInput++)) >> 5;
+
+        } /* for (j = wrap_point; j>0; j--) */
+
+        /*
+         * pFilterInput has reached &scratch_memory[order-1]
+         * Reset pointer to beginning of filter's state memory
+         */
+        pFilterInput = scratch_memory;
+
+        for (j = (order - wrap_point); j > 0; j--)
+        {
+            mult += fxp_mul32_Q31(*(pLPC++), *(pFilterInput++)) >> 5;
+
+        } /* for (j = wrap_point; j>0; j--) */
+
+
+        /*
+         * Fill the filter's state buffer
+         * avoid obvious casting
+         */
+        *(--pFilterInput) = (*pCoef);
+
+
+        /* Scale the data down so the output q-format is not adjusted.
+         *
+         * Here is an equation, which shows how the spectral coefficients
+         * and lpc coefficients are multiplied and the spectral
+         * coefficient's q-format does not change.
+         *
+         * Q-(coef) * Q-(lpc_qformat) >> 5 = Q-(coef + lpc_q_format - 5)
+         *
+         * Q-(coef + lpc_q_format - 5) >> (lpc_qformat - 5) = Q-(coef)
+         */
+
+        /* Store output in place */
+        *(pCoef) += (mult >> shift_amt);
+
+        /* Adjust pointers and placeholders */
+        pCoef += direction;
+
+        wrap_point++;
+
+        if (wrap_point == order)
+        {
+            wrap_point = 0;
+        }
+
+    } /* for (i = num_coef; i > 0; i--) */
+
+} /* tns_inv_filter */
diff --git a/media/libstagefright/codecs/aacdec/tns_inv_filter.h b/media/libstagefright/codecs/aacdec/tns_inv_filter.h
new file mode 100644
index 0000000..1b57fc1
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/tns_inv_filter.h
@@ -0,0 +1,99 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: tns_inv_filter.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Per request of JT, the lpc coefficients q-format will now
+ be transmitted to the function.
+
+ Description: The scratch memory was mistakenly declared here as type "Int32"
+ It should have been "Int"
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file contains the function declaration for
+ tns_inv_filter.c
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef TNS_INV_FILTER_H
+#define TNS_INV_FILTER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.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
+----------------------------------------------------------------------------*/
+void tns_inv_filter(
+    Int32 coef[],
+    const Int   num_coef,
+    const Int   inc,
+    const Int32 lpc[],
+    const Int   lpc_qformat,
+    const Int   order,
+    Int32 scratch_memory[]);
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/trans4m_freq_2_time_fxp.cpp b/media/libstagefright/codecs/aacdec/trans4m_freq_2_time_fxp.cpp
new file mode 100644
index 0000000..6ccc023
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/trans4m_freq_2_time_fxp.cpp
@@ -0,0 +1,2604 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Pathname: trans4m_freq_2_time_fxp.c
+  Function: trans4m_freq_2_time_fxp
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+    changed to decrement loop
+    change wnd_shape from structure to passing parameters
+    modified window tables from UInt to UInt16 to assure proper operation
+    without dubious typecast
+    changed logic to hit most common states first.
+    modified Time_data from Int to Int32 to hold
+    possible overflow before saturation process.
+
+ Description:
+    Increase processing on some loop by using more pointers
+    changed interface to avoid passing a pointer for wnd_shape_prev_bk, this
+    element is not change in this function because of this function use
+    in the LTP module
+
+ Description:
+    Added rounding to multiplication
+
+ Description:
+    Update input description and eliminate unneeded comments
+
+ Description:
+    LONG_START_WINDOW was using SHORT_WINDOW instead of
+    HALF_SHORT_WINDOW, causing a for loop to exceed its count
+
+ Description:
+    Modified structure of code so exp is not tested before it
+    is initialized.  Also, new structure avoids double-testing
+    of exp_freq = ALL_ZEROS_BUFFER.
+
+ Description:
+    The result of a shift is undefined if the right operand is greater than
+    or equal to the number of bits in the left expression's type
+    To avoid undefined shift by 32, a check of the shift has been
+    added, so the function proceeds only when the exponent is less
+    than 32. By design the shift up is related to the global gain,
+    and controlled by the encoder, so saturation is not allowed.
+    In both short and long window, processing is skip if an all zero
+    input buffer or excessive down shift is detected.
+
+ Description:
+    Changes according to code review comments. Also, modified if-else
+    structure so the imdct_fxp is not called with an all zero input buffer
+
+ Description:
+    Replaced function buffer_normalization by buffer_adaptation, to ease
+    use of 16 bits. Function buffer_normalization becomes  obsolete.
+
+ Description:
+    Modified call to imdct_fxp to reflect extended precision use. Added
+    routine buffer_adaptation to extract 16 MSB and keep highest.
+    precision. Modify casting to ensure proper operations for different
+    platforms
+
+ Description:
+    Eliminate double access to memory by loading data directly to the
+    time array. Also reduced cycle count and added precision by combining
+    downshifting in only one operation. Added adaptive rounding factor.
+    Change exponent threshold when operations are waived. It is use to be 32
+    but by combining downshifting, this new threshold is now 16. This may
+    avoid unneeded calculations for extremely small numbers.
+
+ Description:
+    Per review comments:
+        - Added comments to clarify buffer_adaptation function
+        - Deleted  reference to include file "buffer_normalization.h"
+        - Modified IF-ELSE so long_windows case is considered first
+        - Eliminated extra IF when computing the rounding, so when exp ==0
+          less cycles are used shifting than in an extra if-else
+        - Corrected negative shift when computing rounding factor
+        - Added condition when exp > 16 (for long windows)
+
+ Description:
+    Modified IF-ELSE structure so now ALL_ZEROS_BUFFER condition is share
+    with exp > 16 condition. This avoid code duplication for both cases.
+
+ Description:
+        - Modified function interface to add output_buffer
+        - Eliminated the 32 bit version of the current output, calculations
+          are placed directly in output_buffer. In this way the buffer
+          Time_data needs only to be 1024 Int32, instead of 2048 (per channel).
+          Also, added the limit macro inside the function (this reduces access
+          to memory).
+        - Updated Pseudo - Code
+
+ Description:
+    Per review comments:
+          Corrected line sizes and mispelling,  added comments and swap
+          order or switch statement for ONLY_LONG_SEQUENCE.
+
+ Description:
+    Eliminated adaptive rounding due to potential saturation.
+
+ Description:
+    Eliminated use of buffer adaptation by shifting this functionality inside
+    the imdct_fxp() routine. Also modified the call to imdct_fxp to accomodate
+    new function interface.
+    Modified macro limit() to save cycles when testing the most common case:
+    no saturation.
+
+ Description:
+    Changed new function interface for imdct_fxp().
+
+ Description:
+    Replaced for-loop with memset and memcopy.
+
+ Who:                         Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Frequency_data    =  vector with spectral information, size 2048
+                         type Int32
+
+    Time_data         =  buffer with data from previous Frequency to Time
+                         conversion, used for overlap and add, size 1024
+                         type Int32
+
+    Output_buffer     =  place holder for current output,  size 1024
+                         type Int16
+
+    wnd_seq           =  window sequence
+                         type WINDOW_SEQUENCE
+
+    wnd_shape_prev_bk =  previous window shape type
+                         type Int
+
+    wnd_shape_this_bk =  current window shape type
+                         type Int
+
+    Q_format          =  Q format for the input frequency data
+                         type Int
+
+    freq_2_time_buffer[] =  scratch memory for computing FFT
+                         type Int32
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    Output_buffer
+    Time_data
+    Frequency_data
+    pWnd_shape_prev_bk
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+The time/frequency representation of the signal is mapped onto the time
+domain by feeding it into the filterbank module. This module consists of
+an inverse modified discrete cosine transform (IMDCT), and a window and an
+overlap-add function. In order to adapt the time/frequency resolution of the
+filterbank to the characteristics of the input signal, a block switching tool
+is also adopted. N represents the window length, where N is a function of the
+window_sequence. For each channel, the N/2 time-frequency values are
+transformed into the N time domain values via the IMDCT. After applying the
+window function, for each channel, the first half of the sequence is added to
+the second half of the previous block windowed sequence to reconstruct the
+output samples for each channel outi,n.
+
+The adaptation of the time-frequency resolution of the filterbank to the
+characteristics of the input signal is done by shifting between transforms
+whose input lengths are either 2048 or 256 samples. By enabling the block
+switching tool, the following transitions are meaningful:
+
+from ONLY_LONG_SEQUENCE to   { LONG_START_SEQUENCE
+                               ONLY_LONG_SEQUENCE
+
+from LONG_START_SEQUENCE to  { LONG_STOP_SEQUENCE
+                               EIGHT_SHORT_SEQUENCE
+
+from LONG_STOP_SEQUENCE to   { LONG_START_SEQUENCE
+                               ONLY_LONG_SEQUENCE
+
+from EIGHT_SHORT_SEQUENCE to { LONG_STOP_SEQUENCE
+                               EIGHT_SHORT_SEQUENCE
+
+Window shape decisions are made by the encoder on a frame-by-frame-basis.
+The window selected is applicable to the second half of the window function
+only, since the first half is constrained to use the appropriate window
+shape from the preceding frame.
+The 2048 time-domain values x'(i)(n), (i window, n sample) to be windowed are
+the last 1024 values of the previous window_sequence concatenated with 1024
+values of the current block. The formula below shows this fact:
+
+                     |  x(i-1)(n+1024)      for    0 < n < 1024
+            x'(i)(n) {
+                     |  x(i)(n)             for 1024 < n < 2048
+
+
+Buffer Time_data data from previous Frequency to Time conversion, used
+for overlap and add
+
+Once the window shape is selected, the window_shape syntax element is
+initialized. Together with the chosen window_sequence all information needed
+for windowing exist.
+With the window halves described below all window_sequences can be assembled.
+For window_shape == 1, the window coefficients are given by the Kaiser -
+Bessel derived (KBD) window.
+Otherwise, for window_shape == 0, a sine window is employed.
+
+The window length N can be 2048 or 256 for the KBD and the sine window.
+All four window_sequences explained below have a total length of 2048
+samples.
+For all kinds of window_sequences the window_shape of the left half of
+the first transform window is determined by the window shape of the previous
+block.
+
+In the case of EIGHT_SHORT_SEQUENCE the processing is done in-place and
+in descendent order to avoid using extra memory.
+The ordering is as follows:
+
+                                            Pn: Previous data for window n
+                                            Cn:  Current data for window n
+
+
+                                                128 freq.
+                                                 samples
+                  FREQ                          ++++++
+IN                         ===========================
+                                                    \
+                                                      \
+                                                        ->  256 time
+                                                             samples
+
+                                                           P8    C8
+           8                                            #######++++++
+                                                    P7     C7
+           7                                     #######++++++
+           :                                :
+           :                                :
+                            P2    C2
+           2             #######++++++
+                     P1    C1
+           1      #######++++++
+                                                                          TIME
+OUT          ==============================================================
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This module shall implement a scheme to switch between window types
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] ISO 14496-3:1999, pag 111
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+
+
+    IF ( wnd_seq == EIGHT_SHORT_SEQUENCE)
+    THEN
+
+        FOR ( i=0; i<LONG_WINDOW; i++)
+            Time_data[LONG_WINDOW + i] = 0;
+        ENDFOR
+
+        FOR ( wnd=NUM_SHORT_WINDOWS-1; wnd>=0; wnd--)
+
+            pFreqInfo = &Frequency_data[ wnd*SHORT_WINDOW];
+
+            CALL IMDCT( pFreqInfo, SHORT_BLOCK1);
+            MODIFYING(pFreqInfo)
+
+
+            IF (wnd == 0)
+            THEN
+                pShort_Window_1 = &Short_Window[wnd_shape_prev_bk][0];
+            ELSE
+                pShort_Window_1 = &Short_Window[wnd_shape_this_bk][0];
+            ENDIF
+
+            pShort_Window_2   =
+                    &Short_Window[wnd_shape->this_bk][SHORT_WINDOW_m_1];
+
+            FOR( i=0, j=SHORT_WINDOW; i<SHORT_WINDOW; i++, j--)
+                pFreqInfo[             i]  *= pShort_Window_1[i];
+                pFreqInfo[SHORT_WINDOW+i]  *= pShort_Window_2[j];
+            ENDFOR
+
+
+            FOR( i=0; i<SHORT_BLOCK1; i++)
+                Time_data[W_L_STOP_1 + SHORT_WINDOW*wnd + i] += pFreqInfo[i];
+            ENDFOR
+
+        ENDFOR
+
+        FOR ( i=0; i<LONG_WINDOW; i++)
+            temp              = Time_data[i];
+            Output_buffer[i]  = Time_data[i];
+            Time_data[i]      = temp;
+        ENDFOR
+    ELSE
+
+        CALL IMDCT( Frequency_data, LONG_BLOCK1)
+            MODIFYING(Frequency_data)
+
+        SWITCH ( wnd_seq)
+
+            CASE ( ONLY_LONG_SEQUENCE)
+
+                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0];
+                pLong_Window_2 =
+                        &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+                FOR (i=0; i<LONG_WINDOW; i++)
+                    Frequency_data[            i] *= *pLong_Window_1++;
+                    Frequency_data[LONG_WINDOW+i] *= *pLong_Window_2--;
+                ENDFOR
+
+                BREAK
+
+            CASE ( LONG_START_SEQUENCE)
+
+                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0];
+
+                FOR ( i=0; i<LONG_WINDOW; i++)
+                    Frequency_data[ i] *= *pLong_Window_1++;
+                ENDFOR
+
+                pShort_Window_1   =
+                        &Short_Window[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+                FOR ( i=0; i<SHORT_WINDOW; i++)
+                    Frequency_data[W_L_START_1 + i] *= *pShort_Window_1--;
+                ENDFOR
+
+                FOR ( i=W_L_START_2; i<LONG_BLOCK1; i++)
+                    Frequency_data[W_L_START_2 + i] = 0;
+                ENDFOR
+
+                BREAK
+
+
+            CASE ( LONG_STOP_SEQUENCE )
+
+                FOR ( i=0; i<W_L_STOP_1; i++)
+                    Frequency_data[ i] = 0;
+                ENDFOR
+
+                pShort_Window_1   = &Short_Window[wnd_shape_prev_bk][0];
+
+                FOR ( i=0; i<SHORT_WINDOW; i++)
+                    Frequency_data[W_L_STOP_1+ i] *= *pShort_Window_1++;
+                ENDFOR
+
+                pLong_Window_1 =
+                        &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+                FOR ( i=0; i<LONG_WINDOW; i++)
+                    Frequency_data[LONG_WINDOW + i]  *=  *pLong_Window_1--;
+                ENDFOR
+
+                BREAK
+
+        }
+
+
+        FOR ( i=0; i<LONG_WINDOW; i++)
+            Output_buffer[i]  = Frequency_data[i]  + Time_data[i];
+            Time_data[i] = Frequency_data[LONG_WINDOW+i];
+        ENDFOR
+
+    }
+
+    ENDIF
+
+
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "aac_mem_funcs.h"
+#include "window_block_fxp.h"
+#include "imdct_fxp.h"
+
+#include "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; limit(x) saturates any number that exceeds a 16-bit representation into a
+; 16 bit number.
+----------------------------------------------------------------------------*/
+
+#define  ROUNDING_SCALED     (ROUNDING<<(16 - SCALING))
+
+
+#if defined(PV_ARM_V5)
+
+
+__inline Int16 sat(Int32 y)
+{
+    Int32 x;
+    Int32 z;
+    __asm
+    {
+        mov x, ROUNDING_SCALED
+        mov y, y, lsl #(15-SCALING)
+        qdadd z, x, y
+        mov y, z, lsr #16
+    }
+    return((Int16)y);
+}
+
+#define  limiter( y, x)   y = sat(x);
+
+
+
+#elif defined(PV_ARM_GCC_V5)
+
+
+__inline Int16 sat(Int32 y)
+{
+    register Int32 x;
+    register Int32 ra = (Int32)y;
+    register Int32 z = ROUNDING_SCALED;
+
+
+    asm volatile(
+        "mov %0, %1, lsl #5\n\t"    // (15-SCALING) assembler does not take symbols
+        "qdadd %0, %2, %0\n\t"
+        "mov %0, %0, lsr #16"
+    : "=&r*i"(x)
+                : "r"(ra),
+                "r"(z));
+
+    return ((Int16)x);
+}
+
+#define  limiter( y, x)   y = sat(x);
+
+
+#elif defined(PV_ARM_MSC_EVC_V5)
+
+
+#define  limiter( y, x)       z = x<< (15-SCALING); \
+                              y = _DAddSatInt( ROUNDING_SCALED, z)>>16;
+
+
+#else
+
+#define  limiter( y, x)   z = ((x + ROUNDING )>>SCALING); \
+                          if ((z>>15) != (z>>31))         \
+                          {                                    \
+                              z = (z >> 31) ^ INT16_MAX;       \
+                          } \
+                          y = (Int16)(z);
+
+#endif
+
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+#ifdef AAC_PLUS
+
+
+void trans4m_freq_2_time_fxp_1(
+    Int32               Frequency_data[],
+    Int32               Time_data[],
+    Int16               Output_buffer[],
+    WINDOW_SEQUENCE     wnd_seq,
+    Int                 wnd_shape_prev_bk,
+    Int                 wnd_shape_this_bk,
+    Int                 Q_format,
+    Int32               abs_max_per_window[],
+    Int32               freq_2_time_buffer[])
+
+{
+    Int exp;
+    Int shift;
+
+    Int  i;
+    Int  wnd;
+#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5))
+    Int32 z;
+#endif
+
+    Int16 *pFreqInfo;
+    Int32 temp;
+    Int32 test;
+
+    Int16 *pFreq_2_Time_data_1;
+    Int16 *pFreq_2_Time_data_2;
+
+    const Int16 *pLong_Window_1;
+    const Int16 *pLong_Window_2;
+    const Int16 *pShort_Window_1;
+    const Int16 *pShort_Window_2;
+
+    Int32 *pOverlap_and_Add_Buffer_1;
+    Int32 *pOverlap_and_Add_Buffer_2;
+
+    Int16  *pOutput_buffer;
+    Int16  *pOutput_buffer_2;
+
+    const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES];
+    const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES];
+
+    Long_Window_fxp[0] = Long_Window_sine_fxp;
+    Long_Window_fxp[1] = Long_Window_KBD_fxp;
+    Short_Window_fxp[0] = Short_Window_sine_fxp;
+    Short_Window_fxp[1] = Short_Window_KBD_fxp;
+
+
+    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
+    {
+
+        pFreqInfo = (Int16 *)Frequency_data;
+
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  LONG_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[0]);
+
+
+
+        /*
+         *  The C Programming Language, Second Edition, Kernighan & Ritchie,
+         *  page 206.
+         *  "The result [of a shift] is undefined if the right operand is
+         *  negative, or greater than or equal to the number of bits in the
+         *  left expression's type"
+         *   => avoid shift by 32 or 16
+         */
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = pFreqInfo;
+
+            switch (wnd_seq)
+            {
+
+                case ONLY_LONG_SEQUENCE:
+                default:
+
+                    pOutput_buffer = Output_buffer;
+
+                    pOverlap_and_Add_Buffer_1 = Time_data;
+
+                    {
+                        const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+                        Int32 * pFreq2T = (Int32 *)pFreqInfo;
+                        Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0];
+                        Int shift = exp + 15 - SCALING;
+
+
+                        Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW];
+
+
+                        for (i = HALF_LONG_WINDOW; i != 0; i--)
+                        {
+                            Int16 win1, win2;
+                            Int32  temp2, test2;
+
+                            Int32  winx;
+
+                            temp2 = *(pFreq2T++);
+                            winx = *(win++);
+
+                            test  = *(pOverlap_and_Add_Buffer_1++);
+                            test2 = *(pOverlap_and_Add_Buffer_1--);
+                            temp  =   fxp_mul_16_by_16bb(temp2, winx) >> shift;
+                            temp2 =   fxp_mul_16_by_16tt(temp2, winx) >> shift;
+                            limiter(*(pOutput_buffer++), (temp + test));
+                            limiter(*(pOutput_buffer++), (temp2 + test2));
+
+                            temp2 = *(pFreq2T_2++);
+
+                            win1  = *(pLong_Window_2--);
+                            win2  = *(pLong_Window_2--);
+                            temp  = fxp_mul_16_by_16bb(temp2, win1) >> shift;
+                            test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp;
+                            *(pOverlap_and_Add_Buffer_1++) = test2;
+
+                        }
+                    }
+
+                    break;
+
+                case LONG_START_SEQUENCE:
+
+
+                    pFreq_2_Time_data_2 =
+                        &pFreq_2_Time_data_1[ HALF_LONG_WINDOW];
+
+                    pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
+                    pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
+                    pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW];
+
+                    pOutput_buffer   = Output_buffer;
+                    pOutput_buffer_2 = pOutput_buffer + HALF_LONG_WINDOW;
+
+
+                    shift = exp + 15 - SCALING;
+
+                    for (i = HALF_LONG_WINDOW; i != 0; i--)
+                    {
+
+                        Int16 win1, win2;
+                        Int16  dat1, dat2;
+                        Int32  test1, test2;
+
+                        dat1   = *(pFreq_2_Time_data_1++);
+                        win1   = *(pLong_Window_1++);
+                        test1  = *(pOverlap_and_Add_Buffer_1++);
+
+                        dat2  =  *(pFreq_2_Time_data_2++);
+                        win2  = *(pLong_Window_2++);
+                        test2 = *(pOverlap_and_Add_Buffer_2++);
+
+                        limiter(*(pOutput_buffer++), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift)));
+
+                        limiter(*(pOutput_buffer_2++), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift)));
+
+                    }
+
+                    /*
+                     *  data unchanged from  LONG_WINDOW to W_L_START_1
+                     *  only scaled accordingly
+                     */
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
+                    pFreq_2_Time_data_1       = &pFreqInfo[LONG_WINDOW];
+
+                    exp -= SCALING;
+
+                    if (exp >= 0)
+                    {
+
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
+                        {
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++) >> exp;
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++) >> exp;
+
+                        }
+
+                    }
+                    else if (exp < 0)
+                    {
+
+                        Int shift = -exp;
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--)
+                        {
+                            Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp2;
+                            temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp2;
+                        }
+
+                    }
+                    else
+                    {
+
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
+                        {
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++);
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++);
+
+                        }
+
+                    }
+
+
+                    pFreq_2_Time_data_1  = &pFreqInfo[W_L_START_1];
+                    pFreq_2_Time_data_2  =
+                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
+
+                    pShort_Window_1   =
+                        &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+                    pShort_Window_2   = pShort_Window_1 - HALF_SHORT_WINDOW;
+
+                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 +
+                                                HALF_SHORT_WINDOW;
+
+
+                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                    {
+                        Int16 win1, win2;
+                        Int16  dat1, dat2;
+                        Int32  temp2;
+                        dat1  = (*pFreq_2_Time_data_1++);
+                        dat2  = (*pFreq_2_Time_data_2++);
+                        win1  = *(pShort_Window_1--);
+                        win2  = *(pShort_Window_2--);
+
+                        temp   =   fxp_mul_16_by_16(dat1, win1) >> shift;
+                        *(pOverlap_and_Add_Buffer_1++) = temp;
+
+                        temp2 =   fxp_mul_16_by_16(dat2, win2) >> shift;
+                        *(pOverlap_and_Add_Buffer_2++) = temp2;
+
+
+                    }
+
+
+                    pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW;
+
+                    pv_memset(
+                        pOverlap_and_Add_Buffer_1,
+                        0,
+                        (LONG_BLOCK1 - W_L_START_2)
+                        *sizeof(*pOverlap_and_Add_Buffer_1));
+
+
+                    break;
+
+
+                case LONG_STOP_SEQUENCE:
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2];
+
+                    pOutput_buffer         = &Output_buffer[W_L_STOP_2];
+
+                    pFreq_2_Time_data_1      = &pFreqInfo[W_L_STOP_2];
+
+                    exp -= SCALING; /*  !!!! */
+
+                    if (exp > 0)
+                    {
+                        Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pOutput_buffer++), (temp + tmp1));
+
+                            tmp1 = *(pFreq_2_Time_data_1++) >> exp;
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        }
+                    }
+                    else if (exp < 0)
+                    {
+                        shift = -exp;
+                        Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pOutput_buffer++), (temp + temp1));
+
+                            temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        }
+                    }
+                    else
+                    {
+                        Int16 tmp1 = *(pFreq_2_Time_data_1++);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pOutput_buffer++), (temp + tmp1));
+
+                            tmp1 = *(pFreq_2_Time_data_1++);
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        }
+                    }
+
+
+                    pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0];
+                    pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW];
+
+                    pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1];
+                    pFreq_2_Time_data_2 =
+                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1];
+                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
+                                                + HALF_SHORT_WINDOW;
+
+                    pOutput_buffer   = &Output_buffer[W_L_STOP_1];
+                    pOutput_buffer_2 = pOutput_buffer + HALF_SHORT_WINDOW;
+
+                    exp += SCALING;  /* +8 back to what it was */
+
+                    shift = exp + 15 - SCALING;
+
+
+                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                    {
+                        Int16 win1;
+                        Int16  dat1;
+
+                        dat1 = *(pFreq_2_Time_data_1++);
+                        win1 = *(pShort_Window_1++);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        test  = fxp_mul_16_by_16(dat1, win1);
+
+                        limiter(*(pOutput_buffer++), (temp + (test >> shift)));
+
+                        dat1 = *(pFreq_2_Time_data_2++);
+                        win1 = *(pShort_Window_2++);
+                        temp = *(pOverlap_and_Add_Buffer_2++);
+                        test =  fxp_mul_16_by_16(dat1, win1);
+                        limiter(*(pOutput_buffer_2++), (temp + (test >> shift)));
+
+                    }
+
+
+                    pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = Time_data;
+
+                    pOutput_buffer = Output_buffer;
+
+                    pLong_Window_2   =
+                        &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+
+                    /*
+                     *  Copy previous time in current buffer, also copy overlap
+                     *  and add buffer
+                     */
+
+                    for (i = W_L_STOP_1; i != 0; i--)
+                    {
+                        Int16 win1;
+                        Int16 dat1;
+
+                        win1 = *(pLong_Window_2--);
+                        dat1 = *pFreq_2_Time_data_2++;
+
+                        limiter(*(pOutput_buffer++), *(pOverlap_and_Add_Buffer_1));
+
+
+                        temp = fxp_mul_16_by_16(dat1, win1) >> shift;
+                        *(pOverlap_and_Add_Buffer_1++) = temp ;
+
+                    }
+
+                    for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--)
+                    {
+                        temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift;
+                        *(pOverlap_and_Add_Buffer_1++) = temp ;
+                    }
+
+
+                    break;
+
+
+
+            } /* switch (wnd_seq) */
+
+        }   /*  if (exp < 16)  */
+
+        else
+        {
+            /* all zeros buffer or excessive down shift */
+
+            /* Overlap and add, setup buffer for next iteration */
+            pOverlap_and_Add_Buffer_1 = &Time_data[0];
+
+            pOutput_buffer = Output_buffer;
+
+            temp  = (*pOverlap_and_Add_Buffer_1++);
+
+            for (i = LONG_WINDOW; i != 0; i--)
+            {
+
+                limiter(*(pOutput_buffer++), temp);
+
+                temp = (*pOverlap_and_Add_Buffer_1++);
+
+            }
+
+            pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0]));
+
+
+        }
+
+    }
+    else
+    {
+
+        Int32 *pScrath_mem;
+        Int32 *pScrath_mem_entry;
+        Int32  *pFrequency_data = Frequency_data;
+
+        Int32 * pOverlap_and_Add_Buffer_1;
+        Int32 * pOverlap_and_Add_Buffer_2;
+        Int32 * pOverlap_and_Add_Buffer_1x;
+        Int32 * pOverlap_and_Add_Buffer_2x;
+
+        /*
+         *  Frequency_data is 2*LONG_WINDOW length but only
+         *  the first LONG_WINDOW elements are filled in,
+         *  then the second part can be used as scratch mem,
+         *  then grab data from one window at a time in
+         *  reverse order.
+         *  The upper LONG_WINDOW Int32 are used to hold the
+         *  computed overlap and add, used in the next call to
+         *  this function, and also as sctrach memory
+         */
+
+        /*
+         *  Frequency_data usage for the case EIGHT_SHORT_SEQUENCE
+
+          |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-|
+          |                              |  Store for next  |        |  memory |
+          |                              |  call            |        |         |
+          |                              |                  |        |         |
+          |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++|
+          |                              |                  |        |         |
+          0                         LONG_WINDOW        LONG_WINDOW   |   2*LONG_WINDOW
+                                                            +        |         |
+                                                       W_L_STOP_2    |         |
+                                                                     |<--   -->|
+                                                                      SHORT_WINDOW +
+                                                                    HALF_SHORT_WINDOW
+          *
+          */
+
+        pOverlap_and_Add_Buffer_1  = &pFrequency_data[
+                                         LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW];
+
+        /*
+         *  Initialize to zero, only the firt short window used in overlap
+         *  and add
+         */
+        pv_memset(
+            pOverlap_and_Add_Buffer_1,
+            0,
+            SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+
+        /*
+         *  Showt windows are evaluated in decresing order. Windows from 7
+         *  to 0 are break down in four cases: window numbers 7 to 5, 4, 3,
+         *  and 2 to 0.
+         *  The data from short windows 3 and 4 is situated at the boundary
+         *  between the 'overlap and add' buffer and the output buffer.
+         */
+        for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--)
+        {
+
+            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+            exp = imdct_fxp(
+                      (Int32 *)pFreqInfo,
+                      freq_2_time_buffer,
+                      SHORT_BLOCK1,
+                      Q_format,
+                      abs_max_per_window[wnd]);
+
+            pOverlap_and_Add_Buffer_1 =
+                &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd];
+
+
+            pOverlap_and_Add_Buffer_2 =
+                pOverlap_and_Add_Buffer_1 + SHORT_WINDOW;
+
+            /*
+             *  If all element are zero or if the exponent is bigger than
+             *  16 ( it becomes an undefined shift) ->  skip
+             */
+
+            if (exp < 16)
+            {
+
+
+                pFreq_2_Time_data_1 = &pFreqInfo[0];
+                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+                /*
+                 *  Each of the eight short blocks is windowed separately.
+                 *  Window shape decisions are made on a frame-by-frame
+                 *  basis.
+                 */
+
+                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+                pShort_Window_2   =
+                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+
+
+                /*
+                 * For short windows from 7 to 5
+                 *                                      |   =========================
+                 *                                      |   |     5     6     7
+                 *               _--_  _--_  _--_  _--_ | _-|-_  _--_  _--_  _--_
+                 *              /    \/    \/    \/    \|/  |  \/    \/    \/    \
+                 *             /     /\    /\    /\    /|\  |  /\    /\    /\     \
+                 *            /     /  \  /  \  /  \  / | \ | /  \  /  \  /  \     \
+                 *           /     /    \/    \/    \/  |  \|/    \/    \     \     \
+                 *      --------------------------------|---[///////////////////////]--------
+                 *
+                 */
+
+
+                shift = exp + 15 - SCALING;
+
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    Int16 win1, win2;
+                    Int16  dat1, dat2;
+
+                    dat2 = *(pFreq_2_Time_data_2++);
+                    win2 = *(pShort_Window_2--);
+                    temp = *pOverlap_and_Add_Buffer_2;
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+
+                    *(pOverlap_and_Add_Buffer_2++) =  temp + (fxp_mul_16_by_16(dat2, win2) >> shift);
+
+                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                }
+
+            }   /* if (exp < 16) */
+            else
+            {
+                pv_memset(
+                    pOverlap_and_Add_Buffer_1,
+                    0,
+                    SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+            }
+
+
+        }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */
+
+
+        wnd = NUM_SHORT_WINDOWS / 2;
+
+        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+        /*
+         *  scratch memory is allocated in an unused part of memory
+         */
+
+
+        pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW];
+
+        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
+
+        pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
+                                    + HALF_SHORT_WINDOW;
+
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  SHORT_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[wnd]);
+
+        /*
+         *  If all element are zero or if the exponent is bigger than
+         *  16 ( it becomes an undefined shift) ->  skip
+         */
+
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = &pFreqInfo[0];
+            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+            pShort_Window_2 =
+                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+            /*
+             * For short window 4
+             *                                    ====|===========
+             *                                        |   4
+             *                                    |   |   |      |
+             *                _--_  _--_  _--_  _-|-_ | _-|-_  _-|-_  _--_  _--_
+             *               /    \/    \/    \/  |  \|/  |  \/  |  \/    \/    \
+             *              /     /\    /\    /\  |  /|\  |  /\  |  /\    /\     \
+             *             /     /  \  /  \  /  \ | / | \ | /  \ | /  \  /  \     \
+             *            /     /    \/    \/    \|/  |  \|/    \|/    \/    \     \
+             *      ------------------------------[\\\|\\\|//////]-------------------
+             *           |                        | A | B |   C  |
+             *           |
+             *        W_L_STOP_1
+             */
+
+            shift = exp + 15 - SCALING;
+            {
+                Int16 win1;
+                Int16  dat1;
+                /* -------- segment A ---------------*/
+                dat1 = *(pFreq_2_Time_data_1++);
+                win1 = *(pShort_Window_1++);
+                for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> (shift);
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+                }
+
+                /* -------- segment B ---------------*/
+                for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+                }
+
+                /* -------- segment C ---------------*/
+                temp = *pOverlap_and_Add_Buffer_2;
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pOverlap_and_Add_Buffer_2++)  =  temp + (fxp_mul_16_by_16(dat1, win1) >> shift);
+
+                    temp = *pOverlap_and_Add_Buffer_2;
+                    dat1 = *(pFreq_2_Time_data_2++);
+                    win1 = *(pShort_Window_2--);
+                }
+            }
+
+        }   /* if (exp < 16) */
+        else
+        {
+            pv_memset(
+                pScrath_mem,
+                0,
+                HALF_SHORT_WINDOW*sizeof(*pScrath_mem));
+
+            pv_memset(
+                pOverlap_and_Add_Buffer_1,
+                0,
+                HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+        }
+
+
+        wnd = NUM_SHORT_WINDOWS / 2 - 1;
+
+        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+        pScrath_mem_entry =
+            &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW];
+        pScrath_mem = pScrath_mem_entry;
+
+        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
+
+        /* point to end of buffer less HALF_SHORT_WINDOW */
+
+        pOutput_buffer_2 = &Output_buffer[LONG_WINDOW - HALF_SHORT_WINDOW];
+        pOutput_buffer   = pOutput_buffer_2;
+
+        pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];  /* !!!! */
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  SHORT_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[wnd]);
+
+        /*
+         *  If all element are zero or if the exponent is bigger than
+         *  16 ( it becomes an undefined shift) ->  skip
+         */
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = &pFreqInfo[0];
+            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+            /*
+             * For short window 3
+             *                             ===========|====
+             *                                    3   |
+             *                             |      |   |   |
+             *               _--_  _--_  _-|-_  _-|-_ | _-|-_  _--_  _--_  _--_
+             *              /    \/    \/  |  \/  |  \|/  |  \/    \/    \/    \
+             *             /     /\    /\  |  /\  |  /|\  |  /\    /\    /\     \
+             *            /     /  \  /  \ | /  \ | / | \ | /  \  /  \  /  \     \
+             *           /     /    \/    \|/    \|/  |  \|/    \/    \     \     \
+             *     -----|------------------[\\\\\\|///|///]--------------------------
+             *          |                  |   A  | B | C |
+             *
+             *      W_L_STOP_1
+             */
+
+
+            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+            pShort_Window_2 =
+                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+            shift = exp + 15 - SCALING;
+
+
+            Int16 win1;
+            Int16  dat1;
+            /* -------- segment A ---------------*/
+            dat1 = *(pFreq_2_Time_data_1++);
+            win1 = *(pShort_Window_1++);
+            for (i = SHORT_WINDOW; i != 0; i--)
+            {
+                *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+                dat1 = *(pFreq_2_Time_data_1++);
+                win1 = *(pShort_Window_1++);
+            }
+
+            dat1 = *(pFreq_2_Time_data_2++);
+            win1 = *(pShort_Window_2--);
+
+            /* -------- segment B ---------------*/
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+                test = fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                temp =  *(pScrath_mem++) + test;
+
+
+                test = *(pOverlap_and_Add_Buffer_1x++);  /* !!!! */
+
+                limiter(*(pOutput_buffer++), (temp + test));
+
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+
+            }
+
+            /* -------- segment C ---------------*/
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+                temp = fxp_mul_16_by_16(dat1, win1) >> (shift);
+
+                *(pOverlap_and_Add_Buffer_1++) += temp;
+
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+            }
+
+        }   /* if (exp < 16) */
+        else
+        {
+
+            pv_memset(
+                pScrath_mem,
+                0,
+                SHORT_WINDOW*sizeof(*pScrath_mem));
+
+            pScrath_mem += SHORT_WINDOW;
+
+            temp = *(pScrath_mem++);
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+                limiter(*(pOutput_buffer++), temp);
+                temp = *(pScrath_mem++);
+
+
+            }
+        }
+
+
+        for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--)
+        {
+
+
+            pOutput_buffer_2 -= SHORT_WINDOW;
+            pOutput_buffer = pOutput_buffer_2;
+
+            /*
+             * The same memory is used as scratch in every iteration
+             */
+            pScrath_mem = pScrath_mem_entry;
+
+            pOverlap_and_Add_Buffer_2x =
+                &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
+
+            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+
+
+            exp = imdct_fxp(
+                      (Int32 *)pFreqInfo,
+                      freq_2_time_buffer,
+                      SHORT_BLOCK1,
+                      Q_format,
+                      abs_max_per_window[wnd]);
+
+            /*
+             *  If all element are zero or if the exponent is bigger than
+             *  16 ( it becomes an undefined shift) ->  skip
+             */
+
+            if (exp < 16)
+            {
+
+                pFreq_2_Time_data_1 = &pFreqInfo[0];
+                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+                /*
+                 *  Each of the eight short blocks is windowed separately.
+                 *  Window shape decisions are made on a frame-by-frame
+                 *  basis.
+                 */
+
+                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+                if (wnd == 0)
+                {
+                    pShort_Window_1 =
+                        &Short_Window_fxp[wnd_shape_prev_bk][0];
+                }
+
+                pShort_Window_2   =
+                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+                /*
+                 * For short windows from 2 to 0
+                 *
+                 *          =========================
+                 *                                       |
+                 *                0     1     2      |   |
+                 *               _--_  _--_  _--_  _-|-_ | _--_  _--_  _--_  _--_
+                 *              /    \/    \/    \/  |  \|/    \/    \/    \/    \
+                 *             /     /\    /\    /\  |  /|\    /\    /\    /\     \
+                 *            /     /  \  /  \  /  \ | / | \  /  \  /  \  /  \     \
+                 *           /     /    \/    \/    \|/  |  \/    \/    \     \     \
+                 *      ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|-----------------------------
+                 *          |
+                 *
+                 *      W_L_STOP_1
+                 */
+
+                shift = exp + 15 - SCALING;
+
+                Int16 dat1 = *(pFreq_2_Time_data_2++);
+                Int16 win1 = *(pShort_Window_2--);
+
+                temp  =  *(pScrath_mem);
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    test  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                    temp += test;
+
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+
+                    limiter(*(pOutput_buffer++), (temp + *(pOverlap_and_Add_Buffer_2x++)));
+
+
+                    *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift;
+                    dat1 = *(pFreq_2_Time_data_2++);
+                    win1 = *(pShort_Window_2--);
+                    temp  =  *(pScrath_mem);
+
+                }
+
+            }   /* if (exp < 16) */
+            else
+            {
+                test  = *(pScrath_mem);
+                temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    limiter(*(pOutput_buffer++), (temp + test));
+
+                    *(pScrath_mem++) = 0;
+                    test  =  *(pScrath_mem);
+                    temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+                }
+            }
+
+        }   /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */
+
+        pOverlap_and_Add_Buffer_2x =  &Time_data[W_L_STOP_1];
+
+        pScrath_mem = pScrath_mem_entry;
+
+        pOutput_buffer_2 -= SHORT_WINDOW;
+        pOutput_buffer = pOutput_buffer_2;
+
+        test  = *(pScrath_mem++);
+        temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+        for (i = SHORT_WINDOW; i != 0; i--)
+        {
+            limiter(*(pOutput_buffer++), (temp + test));
+
+            test  = *(pScrath_mem++);
+            temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+        }
+
+        pOverlap_and_Add_Buffer_1x = Time_data;
+
+        pOutput_buffer = Output_buffer;
+
+
+        temp = *(pOverlap_and_Add_Buffer_1x++);
+
+        for (i = W_L_STOP_1; i != 0; i--)
+        {
+            limiter(*(pOutput_buffer++), temp);
+
+            temp = *(pOverlap_and_Add_Buffer_1x++);
+        }
+
+        pOverlap_and_Add_Buffer_1x = &Time_data[0];
+
+        pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW];
+
+        /*
+         *  update overlap and add buffer,
+         *  so is ready for next iteration
+         */
+
+        for (int i = 0; i < W_L_STOP_2; i++)
+        {
+            temp = *(pOverlap_and_Add_Buffer_2++);
+            *(pOverlap_and_Add_Buffer_1x++) = temp;
+        }
+
+        pv_memset(
+            pOverlap_and_Add_Buffer_1x,
+            0,
+            W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x));
+
+    } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */
+
+}
+
+#endif
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+void trans4m_freq_2_time_fxp_2(
+    Int32               Frequency_data[],
+    Int32               Time_data[],
+    WINDOW_SEQUENCE     wnd_seq,
+    Int                 wnd_shape_prev_bk,
+    Int                 wnd_shape_this_bk,
+    Int                 Q_format,
+    Int32               abs_max_per_window[],
+    Int32               freq_2_time_buffer[],
+    Int16               *Interleaved_output)
+
+{
+
+    Int exp;
+    Int shift;
+
+    Int  i;
+    Int  wnd;
+#if !(defined( PV_ARM_GCC_V5)||(PV_ARM_V5))
+    Int32 z;
+#endif
+    Int16 *pFreqInfo;
+    Int32 temp;
+    Int32 test;
+
+    Int16 *pFreq_2_Time_data_1;
+    Int16 *pFreq_2_Time_data_2;
+
+    const Int16 *pLong_Window_1;
+    const Int16 *pLong_Window_2;
+    const Int16 *pShort_Window_1;
+    const Int16 *pShort_Window_2;
+
+    Int32 *pOverlap_and_Add_Buffer_1;
+    Int32 *pOverlap_and_Add_Buffer_2;
+
+    Int16  *pInterleaved_output;
+    Int16  *pInterleaved_output_2;
+
+
+    const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES];
+    const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES];
+
+    Long_Window_fxp[0] = Long_Window_sine_fxp;
+    Long_Window_fxp[1] = Long_Window_KBD_fxp;
+    Short_Window_fxp[0] = Short_Window_sine_fxp;
+    Short_Window_fxp[1] = Short_Window_KBD_fxp;
+
+    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
+    {
+
+        pFreqInfo = (Int16 *)Frequency_data;
+
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  LONG_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[0]);
+
+
+        /*
+         *  The C Programming Language, Second Edition, Kernighan & Ritchie,
+         *  page 206.
+         *  "The result [of a shift] is undefined if the right operand is
+         *  negative, or greater than or equal to the number of bits in the
+         *  left expression's type"
+         *   => avoid shift by 32 or 16
+         */
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = pFreqInfo;
+
+
+            switch (wnd_seq)
+            {
+
+                case ONLY_LONG_SEQUENCE:
+                default:
+
+                {
+                    pOverlap_and_Add_Buffer_1 = Time_data;
+
+                    pInterleaved_output = Interleaved_output;
+
+                    {
+
+                        const Int16 *pLong_Window_2 = &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+                        Int32 * pFreq2T   = (Int32 *)pFreqInfo;
+                        Int32 * pFreq2T_2 = &pFreq2T[HALF_LONG_WINDOW];
+                        Int32 * win = (Int32 *) & Long_Window_fxp[wnd_shape_prev_bk][0];
+
+                        Int shift = exp + 15 - SCALING;
+
+                        for (i = HALF_LONG_WINDOW; i != 0; i--)
+                        {
+                            Int16 win1, win2;
+                            Int32  temp2, test2;
+
+                            Int32  winx;
+
+                            temp2 = *(pFreq2T++);
+                            winx = *(win++);
+
+                            test  = *(pOverlap_and_Add_Buffer_1++);
+                            test2 = *(pOverlap_and_Add_Buffer_1--);
+                            temp  =   fxp_mul_16_by_16bb(temp2, winx) >> shift;
+                            temp2 =   fxp_mul_16_by_16tt(temp2, winx) >> shift;
+
+                            limiter(*(pInterleaved_output), (temp + test));
+
+                            limiter(*(pInterleaved_output + 2), (temp2 + test2));
+                            pInterleaved_output += 4;
+
+                            temp2 = *(pFreq2T_2++);
+
+                            win1  = *(pLong_Window_2--);
+                            win2  = *(pLong_Window_2--);
+                            temp  = fxp_mul_16_by_16bb(temp2, win1) >> shift;
+                            test2 = fxp_mul_16_by_16tb(temp2, win2) >> shift;
+
+                            *(pOverlap_and_Add_Buffer_1++) = temp;
+                            *(pOverlap_and_Add_Buffer_1++) = test2;
+                        }
+
+                    }
+
+                }
+
+                break;
+
+                case LONG_START_SEQUENCE:
+
+                    pFreq_2_Time_data_2 =
+                        &pFreq_2_Time_data_1[ HALF_LONG_WINDOW];
+
+                    pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
+                    pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
+                    pOverlap_and_Add_Buffer_2 = &Time_data[HALF_LONG_WINDOW];
+
+
+                    pInterleaved_output   = Interleaved_output;
+                    pInterleaved_output_2 = pInterleaved_output + (2 * HALF_LONG_WINDOW);
+
+
+                    /*
+                     *  process first  LONG_WINDOW elements
+                     */
+
+                    shift = exp + 15 - SCALING;
+
+                    for (i = HALF_LONG_WINDOW; i != 0; i--)
+                    {
+                        Int16 win1, win2;
+                        Int16  dat1, dat2;
+                        Int32  test1, test2;
+
+                        dat1   = *(pFreq_2_Time_data_1++);
+                        win1   = *(pLong_Window_1++);
+                        test1  = *(pOverlap_and_Add_Buffer_1++);
+
+                        dat2  =  *(pFreq_2_Time_data_2++);
+                        win2  = *(pLong_Window_2++);
+                        test2 = *(pOverlap_and_Add_Buffer_2++);
+
+                        limiter(*(pInterleaved_output), (test1 + (fxp_mul_16_by_16(dat1, win1) >> shift)));
+
+                        pInterleaved_output   += 2;
+
+                        limiter(*(pInterleaved_output_2), (test2 + (fxp_mul_16_by_16(dat2, win2) >> shift)));
+
+                        pInterleaved_output_2    += 2;
+                    }
+
+
+                    /*
+                     *  data unchanged from  LONG_WINDOW to W_L_START_1
+                     *  only scaled accordingly
+                     */
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[0];
+                    pFreq_2_Time_data_1       = &pFreqInfo[LONG_WINDOW];
+
+                    exp -= SCALING;
+
+                    if (exp >= 0)
+                    {
+
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
+                        {
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++) >> exp;
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++) >> exp;
+
+                        }
+
+                    }
+                    else if (exp < 0)
+                    {
+
+                        Int shift = -exp;
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0 ; i--)
+                        {
+                            Int32 temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp2;
+                            temp2 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp2;
+                        }
+
+                    }
+                    else
+                    {
+
+                        for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
+                        {
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++);
+                            *(pOverlap_and_Add_Buffer_1++) =
+                                *(pFreq_2_Time_data_1++);
+
+                        }
+
+                    }
+
+
+                    pFreq_2_Time_data_1  = &pFreqInfo[W_L_START_1];
+                    pFreq_2_Time_data_2  =
+                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
+
+                    pShort_Window_1   =
+                        &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+                    pShort_Window_2   = pShort_Window_1 - HALF_SHORT_WINDOW;
+
+                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1 +
+                                                HALF_SHORT_WINDOW;
+
+                    {
+                        Int16 win1, win2;
+                        Int16  dat1, dat2;
+                        Int32  temp2;
+
+                        for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                        {
+
+                            dat1  = (*pFreq_2_Time_data_1++);
+                            dat2  = (*pFreq_2_Time_data_2++);
+                            win1  = *(pShort_Window_1--);
+                            win2  = *(pShort_Window_2--);
+
+                            temp   =   fxp_mul_16_by_16(dat1, win1) >> shift;
+                            *(pOverlap_and_Add_Buffer_1++) = temp;
+
+                            temp2 =   fxp_mul_16_by_16(dat2, win2) >> shift;
+                            *(pOverlap_and_Add_Buffer_2++) = temp2;
+
+                        }
+                    }
+
+                    pOverlap_and_Add_Buffer_1 += HALF_SHORT_WINDOW;
+
+
+                    pv_memset(
+                        pOverlap_and_Add_Buffer_1,
+                        0,
+                        (LONG_BLOCK1 - W_L_START_2)
+                        *sizeof(*pOverlap_and_Add_Buffer_1));
+
+
+                    break;
+
+
+                case LONG_STOP_SEQUENCE:
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_2];
+
+                    pInterleaved_output    = &Interleaved_output[2*W_L_STOP_2];
+
+                    pFreq_2_Time_data_1      = &pFreqInfo[W_L_STOP_2];
+
+                    exp -= SCALING;
+
+
+                    if (exp > 0)
+                    {
+                        Int16 tmp1 = (*(pFreq_2_Time_data_1++) >> exp);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pInterleaved_output), (temp + tmp1));
+
+                            pInterleaved_output += 2;
+                            tmp1 = *(pFreq_2_Time_data_1++) >> exp;
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+                        }
+                    }
+                    else if (exp < 0)
+                    {
+                        shift = -exp;
+
+                        Int32 temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pInterleaved_output), (temp + temp1));
+
+                            pInterleaved_output += 2;
+                            temp1 = ((Int32) * (pFreq_2_Time_data_1++)) << shift;
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+                        }
+                    }
+                    else
+                    {
+                        Int16 tmp1 = *(pFreq_2_Time_data_1++);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+                        for (i = (LONG_WINDOW - W_L_STOP_2); i != 0; i--)
+                        {
+                            limiter(*(pInterleaved_output), (temp + tmp1));
+
+                            pInterleaved_output += 2;
+                            tmp1 = *(pFreq_2_Time_data_1++);
+                            temp = *(pOverlap_and_Add_Buffer_1++);
+                        }
+                    }
+
+
+
+                    pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0];
+                    pShort_Window_2 = &pShort_Window_1[HALF_SHORT_WINDOW];
+
+                    pFreq_2_Time_data_1 = &pFreqInfo[W_L_STOP_1];
+                    pFreq_2_Time_data_2 =
+                        &pFreq_2_Time_data_1[HALF_SHORT_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = &Time_data[ W_L_STOP_1];
+                    pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
+                                                + HALF_SHORT_WINDOW;
+
+
+                    pInterleaved_output   = &Interleaved_output[2*W_L_STOP_1];
+                    pInterleaved_output_2 = pInterleaved_output + (2 * HALF_SHORT_WINDOW);
+
+                    exp += SCALING;  /* +8 back to what it was */
+                    shift = exp + 15 - SCALING;
+
+
+                    for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                    {
+
+                        Int16 win1;
+                        Int16 dat1;
+
+                        dat1 = *(pFreq_2_Time_data_1++);
+                        win1 = *(pShort_Window_1++);
+                        temp = *(pOverlap_and_Add_Buffer_1++);
+
+                        test  = fxp_mul_16_by_16(dat1, win1);
+
+                        limiter(*(pInterleaved_output), (temp + (test >> shift)));
+
+                        pInterleaved_output += 2;
+
+                        dat1 = *(pFreq_2_Time_data_2++);
+                        win1 = *(pShort_Window_2++);
+                        temp = *(pOverlap_and_Add_Buffer_2++);
+                        test =  fxp_mul_16_by_16(dat1, win1);
+
+                        limiter(*(pInterleaved_output_2), (temp + (test >> shift)));
+
+                        pInterleaved_output_2 += 2;
+
+                    }
+
+
+
+                    pFreq_2_Time_data_2 = &pFreqInfo[LONG_WINDOW];
+
+                    pOverlap_and_Add_Buffer_1 = Time_data;
+
+
+                    pInterleaved_output = Interleaved_output;
+
+                    pLong_Window_2   =
+                        &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+
+                    /*
+                     *  Copy previous time in current buffer, also copy overlap
+                     *  and add buffer
+                     */
+
+                    for (i = W_L_STOP_1; i != 0; i--)
+                    {
+
+                        Int16 win1;
+                        Int16 dat1;
+
+                        win1 = *(pLong_Window_2--);
+                        dat1 = *pFreq_2_Time_data_2++;
+
+                        limiter(*(pInterleaved_output), *(pOverlap_and_Add_Buffer_1));
+
+                        pInterleaved_output += 2;
+
+                        temp = fxp_mul_16_by_16(dat1, win1) >> shift;
+                        *(pOverlap_and_Add_Buffer_1++) = temp ;
+
+                    }
+
+                    for (i = (LONG_WINDOW - W_L_STOP_1); i != 0; i--)
+                    {
+
+                        temp = fxp_mul_16_by_16(*pFreq_2_Time_data_2++, *(pLong_Window_2--)) >> shift;
+                        *(pOverlap_and_Add_Buffer_1++) = temp ;
+
+                    }
+
+                    break;
+
+
+
+            } /* switch (wnd_seq) */
+
+        }   /*  if (exp < 16)  */
+
+        else
+        {
+            /* all zeros buffer or excessive down shift */
+
+            /* Overlap and add, setup buffer for next iteration */
+            pOverlap_and_Add_Buffer_1 = &Time_data[0];
+
+            pInterleaved_output = Interleaved_output;
+
+
+            temp  = (*pOverlap_and_Add_Buffer_1++);
+            for (i = LONG_WINDOW; i != 0; i--)
+            {
+
+                limiter(*(pInterleaved_output), temp);
+
+                pInterleaved_output += 2;
+                temp  = (*pOverlap_and_Add_Buffer_1++);
+            }
+            pv_memset(Time_data, 0, LONG_WINDOW*sizeof(Time_data[0]));
+        }
+
+    }
+    else
+    {
+
+        Int32 *pScrath_mem;
+        Int32 *pScrath_mem_entry;
+        Int32  *pFrequency_data = Frequency_data;
+
+        Int32 * pOverlap_and_Add_Buffer_1;
+        Int32 * pOverlap_and_Add_Buffer_2;
+        Int32 * pOverlap_and_Add_Buffer_1x;
+        Int32 * pOverlap_and_Add_Buffer_2x;
+
+
+        /*
+         *  Frequency_data is 2*LONG_WINDOW length but only
+         *  the first LONG_WINDOW elements are filled in,
+         *  then the second part can be used as scratch mem,
+         *  then grab data from one window at a time in
+         *  reverse order.
+         *  The upper LONG_WINDOW Int32 are used to hold the
+         *  computed overlap and add, used in the next call to
+         *  this function, and also as sctrach memory
+         */
+
+        /*
+         *  Frequency_data usage for the case EIGHT_SHORT_SEQUENCE
+
+          |<----- Input Freq. data ----->|< Overlap & Add ->| Unused |-Scratch-|
+          |                              |  Store for next  |        |  memory |
+          |                              |  call            |        |         |
+          |                              |                  |        |         |
+          |//////////////////////////////|\\\\\\\\\\\\\\\\\\|--------|+++++++++|
+          |                              |                  |        |         |
+          0                         LONG_WINDOW        LONG_WINDOW   |   2*LONG_WINDOW
+                                                            +        |         |
+                                                       W_L_STOP_2    |         |
+                                                                     |<--   -->|
+                                                                      SHORT_WINDOW +
+                                                                    HALF_SHORT_WINDOW
+          *
+          */
+
+        pOverlap_and_Add_Buffer_1  = &pFrequency_data[
+                                         LONG_WINDOW + 3*SHORT_WINDOW + HALF_SHORT_WINDOW];
+
+        /*
+         *  Initialize to zero, only the firt short window used in overlap
+         *  and add
+         */
+        pv_memset(
+            pOverlap_and_Add_Buffer_1,
+            0,
+            SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+
+        /*
+         *  Showt windows are evaluated in decresing order. Windows from 7
+         *  to 0 are break down in four cases: window numbers 7 to 5, 4, 3,
+         *  and 2 to 0.
+         *  The data from short windows 3 and 4 is situated at the boundary
+         *  between the 'overlap and add' buffer and the output buffer.
+         */
+        for (wnd = NUM_SHORT_WINDOWS - 1; wnd >= NUM_SHORT_WINDOWS / 2 + 1; wnd--)
+        {
+
+            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+            exp = imdct_fxp(
+                      (Int32 *)pFreqInfo,
+                      freq_2_time_buffer,
+                      SHORT_BLOCK1,
+                      Q_format,
+                      abs_max_per_window[wnd]);
+
+            /*  W_L_STOP_1 == (LONG_WINDOW - SHORT_WINDOW)>>1 */
+            pOverlap_and_Add_Buffer_1 =
+                &pFrequency_data[ W_L_STOP_1 + SHORT_WINDOW*wnd];
+
+
+            pOverlap_and_Add_Buffer_2 =
+                pOverlap_and_Add_Buffer_1 + SHORT_WINDOW;
+
+            /*
+             *  If all element are zero or if the exponent is bigger than
+             *  16 ( it becomes an undefined shift) ->  skip
+             */
+
+            if (exp < 16)
+            {
+
+
+                pFreq_2_Time_data_1 = &pFreqInfo[0];
+                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+                /*
+                 *  Each of the eight short blocks is windowed separately.
+                 *  Window shape decisions are made on a frame-by-frame
+                 *  basis.
+                 */
+
+                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+                pShort_Window_2   =
+                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+
+
+                /*
+                 * For short windows from 7 to 5
+                 *                                      |   =========================
+                 *                                      |   |     5     6     7
+                 *               _--_  _--_  _--_  _--_ | _-|-_  _--_  _--_  _--_
+                 *              /    \/    \/    \/    \|/  |  \/    \/    \/    \
+                 *             /     /\    /\    /\    /|\  |  /\    /\    /\     \
+                 *            /     /  \  /  \  /  \  / | \ | /  \  /  \  /  \     \
+                 *           /     /    \/    \/    \/  |  \|/    \/    \     \     \
+                 *      --------------------------------|---[///////////////////////]--------
+                 *
+                 */
+
+
+                shift = exp + 15 - SCALING;
+
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    Int16 win1, win2;
+                    Int16  dat1, dat2;
+
+                    dat2 = *(pFreq_2_Time_data_2++);
+                    win2 = *(pShort_Window_2--);
+                    temp = *pOverlap_and_Add_Buffer_2;
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+
+                    *(pOverlap_and_Add_Buffer_2++) =  temp + (fxp_mul_16_by_16(dat2, win2) >> shift);
+
+                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                }
+
+            }   /* if (exp < 16) */
+            else
+            {
+                pv_memset(
+                    pOverlap_and_Add_Buffer_1,
+                    0,
+                    SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+            }
+
+
+        }/* for ( wnd=NUM_SHORT_WINDOWS-1; wnd>=NUM_SHORT_WINDOWS/2; wnd--) */
+
+
+        wnd = NUM_SHORT_WINDOWS / 2;
+
+        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+        /*
+         *  scratch memory is allocated in an unused part of memory
+         */
+
+
+        pScrath_mem = &pFrequency_data[ 2*LONG_WINDOW - HALF_SHORT_WINDOW];
+
+        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
+
+        pOverlap_and_Add_Buffer_2 = pOverlap_and_Add_Buffer_1
+                                    + HALF_SHORT_WINDOW;
+
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  SHORT_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[wnd]);
+
+        /*
+         *  If all element are zero or if the exponent is bigger than
+         *  16 ( it becomes an undefined shift) ->  skip
+         */
+
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = &pFreqInfo[0];
+            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+            pShort_Window_2 =
+                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+            /*
+             * For short window 4
+             *                                    ====|===========
+             *                                        |   4
+             *                                    |   |   |      |
+             *                _--_  _--_  _--_  _-|-_ | _-|-_  _-|-_  _--_  _--_
+             *               /    \/    \/    \/  |  \|/  |  \/  |  \/    \/    \
+             *              /     /\    /\    /\  |  /|\  |  /\  |  /\    /\     \
+             *             /     /  \  /  \  /  \ | / | \ | /  \ | /  \  /  \     \
+             *            /     /    \/    \/    \|/  |  \|/    \|/    \/    \     \
+             *      ------------------------------[\\\|\\\|//////]-------------------
+             *           |                        | A | B |   C  |
+             *           |
+             *        W_L_STOP_1
+             */
+
+            shift = exp + 15 - SCALING;
+            {
+                Int16 win1;
+                Int16  dat1;
+                /* -------- segment A ---------------*/
+                dat1 = *(pFreq_2_Time_data_1++);
+                win1 = *(pShort_Window_1++);
+                for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+                }
+
+                /* -------- segment B ---------------*/
+                for (i = HALF_SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pOverlap_and_Add_Buffer_1++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+                }
+
+                /* -------- segment C ---------------*/
+                temp = *pOverlap_and_Add_Buffer_2;
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    *(pOverlap_and_Add_Buffer_2++)  =  temp + (fxp_mul_16_by_16(dat1, win1) >> shift);
+
+                    temp = *pOverlap_and_Add_Buffer_2;
+                    dat1 = *(pFreq_2_Time_data_2++);
+                    win1 = *(pShort_Window_2--);
+                }
+            }
+
+        }   /* if (exp < 16) */
+        else
+        {
+            pv_memset(
+                pScrath_mem,
+                0,
+                HALF_SHORT_WINDOW*sizeof(*pScrath_mem));
+
+            pv_memset(
+                pOverlap_and_Add_Buffer_1,
+                0,
+                HALF_SHORT_WINDOW*sizeof(*pOverlap_and_Add_Buffer_1));
+        }
+
+
+        wnd = NUM_SHORT_WINDOWS / 2 - 1;
+
+        pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+        pScrath_mem_entry =
+            &pFrequency_data[2*LONG_WINDOW - HALF_SHORT_WINDOW - SHORT_WINDOW];
+
+
+        pScrath_mem = pScrath_mem_entry;
+
+        pOverlap_and_Add_Buffer_1 = &pFrequency_data[ LONG_WINDOW];
+
+        /* point to end of buffer less HALF_SHORT_WINDOW */
+
+        pInterleaved_output_2 = &Interleaved_output[2*(LONG_WINDOW - HALF_SHORT_WINDOW)];
+        pInterleaved_output = pInterleaved_output_2;
+
+        pOverlap_and_Add_Buffer_1x = &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
+
+
+        exp = imdct_fxp(
+                  (Int32 *)pFreqInfo,
+                  freq_2_time_buffer,
+                  SHORT_BLOCK1,
+                  Q_format,
+                  abs_max_per_window[wnd]);
+
+        /*
+         *  If all element are zero or if the exponent is bigger than
+         *  16 ( it becomes an undefined shift) ->  skip
+         */
+
+        if (exp < 16)
+        {
+
+            pFreq_2_Time_data_1 = &pFreqInfo[0];
+            pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+            /*
+             * For short window 3
+             *                             ===========|====
+             *                                    3   |
+             *                             |      |   |   |
+             *               _--_  _--_  _-|-_  _-|-_ | _-|-_  _--_  _--_  _--_
+             *              /    \/    \/  |  \/  |  \|/  |  \/    \/    \/    \
+             *             /     /\    /\  |  /\  |  /|\  |  /\    /\    /\     \
+             *            /     /  \  /  \ | /  \ | / | \ | /  \  /  \  /  \     \
+             *           /     /    \/    \|/    \|/  |  \|/    \/    \     \     \
+             *     -----|------------------[\\\\\\|///|///]--------------------------
+             *          |                  |   A  | B | C |
+             *
+             *      W_L_STOP_1
+             */
+
+
+            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+            pShort_Window_2 =
+                &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+            shift = exp + 15 - SCALING;
+
+            Int16 win1;
+            Int16  dat1;
+            /* -------- segment A ---------------*/
+            dat1 = *(pFreq_2_Time_data_1++);
+            win1 = *(pShort_Window_1++);
+            for (i = SHORT_WINDOW; i != 0; i--)
+            {
+                *(pScrath_mem++)  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+                dat1 = *(pFreq_2_Time_data_1++);
+                win1 = *(pShort_Window_1++);
+            }
+
+            dat1 = *(pFreq_2_Time_data_2++);
+            win1 = *(pShort_Window_2--);
+
+
+            /* -------- segment B ---------------*/
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+                test = fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                temp =  *(pScrath_mem++) + test;
+
+                test = *(pOverlap_and_Add_Buffer_1x++);
+                limiter(*(pInterleaved_output), (temp + test));
+
+
+                pInterleaved_output += 2;
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+
+            }
+
+            /* -------- segment C ---------------*/
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+
+                temp = fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                *(pOverlap_and_Add_Buffer_1++) += temp;
+
+                dat1 = *(pFreq_2_Time_data_2++);
+                win1 = *(pShort_Window_2--);
+            }
+
+
+        }   /* if (exp < 16) */
+        else
+        {
+
+            pv_memset(
+                pScrath_mem,
+                0,
+                SHORT_WINDOW*sizeof(*pScrath_mem));
+
+            pScrath_mem += SHORT_WINDOW;
+
+            temp = *(pScrath_mem++);
+            for (i = HALF_SHORT_WINDOW; i != 0; i--)
+            {
+                limiter(*(pInterleaved_output), (temp));
+
+                pInterleaved_output += 2;
+                temp = *(pScrath_mem++);
+
+            }
+        }
+
+
+        for (wnd = NUM_SHORT_WINDOWS / 2 - 2; wnd >= 0; wnd--)
+        {
+
+
+            pInterleaved_output_2 -= (SHORT_WINDOW * 2);
+            pInterleaved_output = pInterleaved_output_2;
+
+            /*
+             * The same memory is used as scratch in every iteration
+             */
+            pScrath_mem = pScrath_mem_entry;
+
+            pOverlap_and_Add_Buffer_2x =
+                &Time_data[W_L_STOP_1 + SHORT_WINDOW*(wnd+1)];
+
+            pFreqInfo = (Int16 *) & pFrequency_data[ wnd*SHORT_WINDOW];
+
+
+
+            exp = imdct_fxp(
+                      (Int32 *)pFreqInfo,
+                      freq_2_time_buffer,
+                      SHORT_BLOCK1,
+                      Q_format,
+                      abs_max_per_window[wnd]);
+
+            /*
+             *  If all element are zero or if the exponent is bigger than
+             *  16 ( it becomes an undefined shift) ->  skip
+             */
+
+            if (exp < 16)
+            {
+
+                pFreq_2_Time_data_1 = &pFreqInfo[0];
+                pFreq_2_Time_data_2 = &pFreqInfo[SHORT_WINDOW];
+
+
+                /*
+                 *  Each of the eight short blocks is windowed separately.
+                 *  Window shape decisions are made on a frame-by-frame
+                 *  basis.
+                 */
+
+                pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+
+                if (wnd == 0)
+                {
+                    pShort_Window_1 =
+                        &Short_Window_fxp[wnd_shape_prev_bk][0];
+                }
+
+                pShort_Window_2   =
+                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+
+                /*
+                 * For short windows from 2 to 0
+                 *
+                 *          =========================
+                 *                                       |
+                 *                0     1     2      |   |
+                 *               _--_  _--_  _--_  _-|-_ | _--_  _--_  _--_  _--_
+                 *              /    \/    \/    \/  |  \|/    \/    \/    \/    \
+                 *             /     /\    /\    /\  |  /|\    /\    /\    /\     \
+                 *            /     /  \  /  \  /  \ | / | \  /  \  /  \  /  \     \
+                 *           /     /    \/    \/    \|/  |  \/    \/    \     \     \
+                 *      ----[\\\\\\\\\\\\\\\\\\\\\\\\]---|-----------------------------
+                 *          |
+                 *
+                 *      W_L_STOP_1
+                 */
+
+                shift = exp + 15 - SCALING;
+
+                Int16 dat1 = *(pFreq_2_Time_data_2++);
+                Int16 win1 = *(pShort_Window_2--);
+
+                temp  =  *(pScrath_mem);
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    test  =  fxp_mul_16_by_16(dat1, win1) >> shift;
+
+                    temp += test;
+                    dat1 = *(pFreq_2_Time_data_1++);
+                    win1 = *(pShort_Window_1++);
+
+                    limiter(*(pInterleaved_output), (temp + *(pOverlap_and_Add_Buffer_2x++)));
+
+                    pInterleaved_output += 2;
+
+                    *(pScrath_mem++) = fxp_mul_16_by_16(dat1, win1) >> shift;
+                    dat1 = *(pFreq_2_Time_data_2++);
+                    win1 = *(pShort_Window_2--);
+                    temp  =  *(pScrath_mem);
+
+                }
+
+            }   /* if (exp < 16) */
+            else
+            {
+                test  = *(pScrath_mem);
+                temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+                for (i = SHORT_WINDOW; i != 0; i--)
+                {
+                    limiter(*(pInterleaved_output), (temp + test));
+
+                    pInterleaved_output += 2;
+
+                    *(pScrath_mem++) = 0;
+                    test  =  *(pScrath_mem);
+                    temp  = *(pOverlap_and_Add_Buffer_2x++);
+                }
+            }
+
+        }   /* for ( wnd=NUM_SHORT_WINDOWS/2-1; wnd>=0; wnd--) */
+
+        pOverlap_and_Add_Buffer_2x =  &Time_data[W_L_STOP_1];
+
+        pScrath_mem = pScrath_mem_entry;
+
+        pInterleaved_output_2 -= (SHORT_WINDOW * 2);
+        pInterleaved_output    = pInterleaved_output_2;
+
+        test  = *(pScrath_mem++);
+        temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+        for (i = SHORT_WINDOW; i != 0; i--)
+        {
+            limiter(*(pInterleaved_output), (temp + test));
+
+            pInterleaved_output += 2;
+            test  = *(pScrath_mem++);
+            temp  = *(pOverlap_and_Add_Buffer_2x++);
+
+        }
+
+        pOverlap_and_Add_Buffer_1x = Time_data;
+
+        pInterleaved_output = Interleaved_output;
+
+
+        temp = *(pOverlap_and_Add_Buffer_1x++);
+        for (i = W_L_STOP_1; i != 0; i--)
+        {
+            limiter(*(pInterleaved_output), temp);
+
+            pInterleaved_output += 2;
+            temp = *(pOverlap_and_Add_Buffer_1x++);
+
+        }
+
+        pOverlap_and_Add_Buffer_1x = &Time_data[0];
+
+        pOverlap_and_Add_Buffer_2 = &pFrequency_data[LONG_WINDOW];
+
+        /*
+         *  update overlap and add buffer,
+         *  so is ready for next iteration
+         */
+
+        for (int i = 0; i < W_L_STOP_2; i++)
+        {
+            temp = *(pOverlap_and_Add_Buffer_2++);
+            *(pOverlap_and_Add_Buffer_1x++) = temp;
+        }
+
+        pv_memset(
+            pOverlap_and_Add_Buffer_1x,
+            0,
+            W_L_STOP_1*sizeof(*pOverlap_and_Add_Buffer_1x));
+
+    } /* if ( wnd_seq != EIGHT_SHORT_SEQUENCE) */
+
+
+
+
+}   /* trans4m_freq_2_time_fxp */
+
+
+
+
diff --git a/media/libstagefright/codecs/aacdec/trans4m_time_2_freq_fxp.cpp b/media/libstagefright/codecs/aacdec/trans4m_time_2_freq_fxp.cpp
new file mode 100644
index 0000000..b1b44f0
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/trans4m_time_2_freq_fxp.cpp
@@ -0,0 +1,663 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+  Pathname: trans4m_time_2_freq_fxp.c
+  Function: trans4m_time_2_freq_fxp
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+        Modified normalization, so it now happen per window basis, eliminated
+        shifts left or rigth to accomodate TNS inverse filtering. The output
+        is 32 bits but only the lowest 16 are being used.
+        Modified fuction interface
+
+ Description: Modified variable names with leading "p" for pointers
+
+ Description:
+        Modified call to mdct_fxp to reflect extended precision use. Added routine
+        buffer_adaptation to extract 16 MSB and keep highest precision.
+        Modify casting to ensure proper operations for different platforms
+
+ Description:
+        Added comments according to code review
+
+ Description:
+        Removed include file "buffer_normalization.h"
+
+ Description:
+        Eliminated buffer_adaptation() and embedded its functionality in other
+        functions. Commented out the short window section given that this is
+        not supported by the standards
+
+ Description:
+        Added shift down operation for case when the window was equal to one.
+        This was not needed previuosly because buffer_adaptation() was doing
+        it.
+
+ Description: Created local version of vectors Long_Window_fxp and
+              Short_Window_fxp. This solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers.
+
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    Time2Freq_data    =  buffer with data in the time domain, it holds 2048
+                         points of input time data
+                         Output holds frequency (first 1024 points )
+                         type Int32
+
+    wnd_seq           =  window sequence
+                         type WINDOW_SEQUENCE
+
+    wnd_shape_prev_bk =  previous window shape type
+                         type Int
+
+    wnd_shape_this_bk =  current window shape type
+                         type Int
+
+    pQ_format          =  Holds the Q format of the data in, and data out
+                         type Int *
+
+    mem_4_in_place_FFT[] =  scratch memory for computing FFT, 1024 point
+                         type Int32
+
+
+
+ Local Stores/Buffers/Pointers Needed:
+    None
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    Frequency information (1024 pts.) is returned in Time2Freq_data
+    pQ_format content spectral coefficients Q format
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+The time/frequency representation of the signal is mapped onto the frequency
+domain by feeding it into the filterbank module. This module consists of
+a modified discrete cosine transform (MDCT), (windowing and DCT).
+In order to adapt the time/frequency resolution of the filterbank to the
+ characteristics of the input signal, a block switching tool is also
+adopted. N represents the window length, where N is a function of the
+window_sequence. For each channel, the N time values are transformed into the
+N/2 frequency domain values via the MDCT.
+
+The adaptation of the time-frequency resolution of the filterbank to the
+characteristics of the input signal is done by shifting between transforms
+whose input lengths are either 2048 or 256 samples. By enabling the block
+switching tool, the following transitions are meaningful:
+
+from ONLY_LONG_SEQUENCE to   { LONG_START_SEQUENCE
+                               ONLY_LONG_SEQUENCE
+
+from LONG_START_SEQUENCE to  { LONG_STOP_SEQUENCE
+                               EIGHT_SHORT_SEQUENCE
+
+from LONG_STOP_SEQUENCE to   { LONG_START_SEQUENCE
+                               ONLY_LONG_SEQUENCE
+
+from EIGHT_SHORT_SEQUENCE to { LONG_STOP_SEQUENCE
+                               EIGHT_SHORT_SEQUENCE
+
+Window shape decisions are made by the encoder on a frame-by-frame-basis.
+The window selected is applicable to the second half of the window function
+only, since the first half is constrained to use the appropriate window
+shape from the preceding frame.
+The 2048 time-domain values x'(i)(n), (i window, n sample) to be windowed are
+the last 1024 values of the previous window_sequence concatenated with 1024
+values of the current block. The formula below shows this fact:
+
+                     |  x(i-1)(n+1024)      for    0 < n < 1024
+            x'(i)(n) {
+                     |  x(i)(n)             for 1024 < n < 2048
+
+
+
+Once the window shape is selected, the window_shape syntax element is
+initialized. Together with the chosen window_sequence all information needed
+for windowing exist.
+With the window halves described below all window_sequences can be assembled.
+For window_shape == 1, the window coefficients are given by the Kaiser -
+Bessel derived (KBD) window.
+Otherwise, for window_shape == 0, a sine window is employed.
+
+The window length N can be 2048 or 256 for the KBD and the sine window.
+All four window_sequences explained below have a total length of 2048
+samples.
+For all kinds of window_sequences the window_shape of the left half of
+the first transform window is determined by the window shape of the previous
+block.
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This module shall implement a scheme to switch between window types and
+    in turn perform time to frequency transformations
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] ISO 14496-3:1999, pag 111
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF ( wnd_seq == EIGHT_SHORT_SEQUENCE)
+    THEN
+
+
+        FOR ( wnd=0; wnd<NUM_SHORT_WINDOWS; wnd++)
+
+            time_info = &Time2Freq_data[ W_L_STOP_1 + wnd*SHORT_WINDOW]
+
+            FOR( i=0; i<SHORT_BLOCK1; i++)
+                aux_temp[i] = time_info[i]
+            ENDFOR
+
+
+            IF (wnd == 0)
+            THEN
+                pShort_Window_1 = &Short_Window[wnd_shape_prev_bk][0]
+            ELSE
+                pShort_Window_1 = &Short_Window[wnd_shape_this_bk][0]
+            ENDIF
+
+
+            pShort_Window_2   =
+                    &Short_Window[wnd_shape->this_bk][SHORT_WINDOW_m_1]
+
+            FOR( i=0, j=SHORT_WINDOW; i<SHORT_WINDOW; i++, j--)
+                aux_temp[             i]  *= pShort_Window_1[i]
+                aux_temp[SHORT_WINDOW+i]  *= pShort_Window_2[j]
+            ENDFOR
+
+
+            CALL MDCT( aux_temp, SHORT_BLOCK1)
+            MODIFYING( aux_temp)
+
+            FOR( i=0; i<SHORT_WINDOW; i++)
+                Time2Freq_data[wnd*SHORT_WINDOW + i] = aux_temp[i];
+            ENDFOR
+
+        ENDFOR
+
+    ELSE
+
+        SWITCH ( wnd_seq)
+
+            CASE ( ONLY_LONG_SEQUENCE)
+
+                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0]
+                pLong_Window_2 =
+                        &Long_Window[wnd_shape_this_bk][LONG_WINDOW_m_1]
+
+                FOR (i=0; i<LONG_WINDOW; i++)
+                    Time2Freq_data[            i] *= *pLong_Window_1++
+                    Time2Freq_data[LONG_WINDOW+i] *= *pLong_Window_2--
+                ENDFOR
+
+                BREAK
+
+
+            CASE ( LONG_START_SEQUENCE)
+
+                pLong_Window_1 = &Long_Window[wnd_shape_prev_bk][0];
+
+                FOR ( i=0; i<LONG_WINDOW; i++)
+                    Time2Freq_data[ i] *= *pLong_Window_1++;
+                ENDFOR
+
+
+                pShort_Window_1   =
+                        &Short_Window[wnd_shape->this_bk][SHORT_WINDOW_m_1];
+
+                FOR ( i=0; i<SHORT_WINDOW; i++)
+                    Time2Freq_data[W_L_START_1 + i] *= *pShort_Window_1--;
+                ENDFOR
+
+
+                FOR ( i=W_L_START_2; i<LONG_BLOCK1; i++)
+                    Time2Freq_data[W_L_START_2 + i] = 0;
+                ENDFOR
+
+                BREAK
+
+
+            CASE ( LONG_STOP_SEQUENCE )
+
+                FOR ( i=0; i<W_L_STOP_1; i++)
+                    Time2Freq_data[ i] = 0;
+                ENDFOR
+
+
+                pShort_Window_1   = &Short_Window[wnd_shape->prev_bk][0];
+
+                FOR ( i=0; i<SHORT_WINDOW; i++)
+                    Time2Freq_data[W_L_STOP_1+ i] *= *pShort_Window_1++;
+                ENDFOR
+
+
+                pLong_Window_1 =
+                        &Long_Window[wnd_shape->this_bk][LONG_WINDOW_m_1];
+
+                FOR ( i=0; i<LONG_WINDOW; i++)
+                    Time2Freq_data[LONG_WINDOW + i]  *=  *pLong_Window_1--;
+                ENDFOR
+
+                BREAK
+
+
+        }
+
+        MDCT( Time2Freq_data, LONG_BLOCK1);
+        MODIFYING( Time2Freq_data)
+
+    ENDIF
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "aac_mem_funcs.h"
+#include "window_block_fxp.h"
+#include "mdct_fxp.h"
+#include "long_term_prediction.h"
+#include    "fxp_mul32.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
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void trans4m_time_2_freq_fxp(
+    Int32   Time2Freq_data[],       /* time data size 2048 */
+    WINDOW_SEQUENCE wnd_seq,        /* window sequence */
+    Int     wnd_shape_prev_bk,      /* window shape, current and previous  */
+    Int     wnd_shape_this_bk,
+    Int     *pQ_format,
+    Int32   mem_4_in_place_FFT[])   /* scratch memory for computing FFT */
+{
+
+    Int  i;
+
+    Int32   *pAux_temp_1;
+    Int32   *pAux_temp_2;
+    Int32   *pAux_temp;
+//    Int32   temp;
+    const   Int16 *pLong_Window_1;
+    const   Int16 *pLong_Window_2;
+    const   Int16 *pShort_Window_1;
+    const   Int16 *pShort_Window_2;
+    Int     shift = *pQ_format - 1;
+
+    const Int16 * Long_Window_fxp[NUM_WINDOW_SHAPES];
+    const Int16 * Short_Window_fxp[NUM_WINDOW_SHAPES];
+
+    Long_Window_fxp[0] = Long_Window_sine_fxp;
+    Long_Window_fxp[1] = Long_Window_KBD_fxp;
+    Short_Window_fxp[0] = Short_Window_sine_fxp;
+    Short_Window_fxp[1] = Short_Window_KBD_fxp;
+
+    if (wnd_seq != EIGHT_SHORT_SEQUENCE)
+    {
+
+        pAux_temp = Time2Freq_data;
+
+        *pQ_format = LTP_Q_FORMAT - *pQ_format;
+
+        pAux_temp_1 = pAux_temp;
+
+        switch (wnd_seq)
+        {
+
+            case LONG_START_SEQUENCE:
+
+                pAux_temp_2 = &pAux_temp_1[HALF_LONG_WINDOW];
+
+                pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
+                pLong_Window_2 = &pLong_Window_1[ HALF_LONG_WINDOW];
+
+
+
+
+                for (i = HALF_LONG_WINDOW; i > 0; i--)
+                {
+
+                    *pAux_temp_1 = fxp_mul32_by_16((*pAux_temp_1), *pLong_Window_1++) >> shift;
+                    pAux_temp_1++;
+                    *pAux_temp_2 = fxp_mul32_by_16((*pAux_temp_2), *pLong_Window_2++) >> shift;
+                    pAux_temp_2++;
+
+                }
+
+
+                /* data unchanged from  LONG_WINDOW to W_L_START_1 */
+                pAux_temp_1 = &pAux_temp[LONG_WINDOW];
+                if (shift)
+                {
+                    for (i = (W_L_START_1 - LONG_WINDOW) >> 1; i != 0; i--)
+                    {
+                        *(pAux_temp_1++) >>= shift;
+                        *(pAux_temp_1++) >>= shift;
+                    }
+                }
+
+
+                pAux_temp_1 = &pAux_temp[W_L_START_1];
+                pAux_temp_2 = &pAux_temp_1[HALF_SHORT_WINDOW];
+
+                pShort_Window_1   =
+                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+
+                pShort_Window_2   = pShort_Window_1 - HALF_SHORT_WINDOW;
+
+                for (i = HALF_SHORT_WINDOW; i > 0; i--)
+                {
+
+                    *pAux_temp_1 = fxp_mul32_by_16((*pAux_temp_1), *pShort_Window_1--) >> shift;
+                    pAux_temp_1++;
+                    *pAux_temp_2 = fxp_mul32_by_16((*pAux_temp_2), *pShort_Window_2--) >> shift;
+                    pAux_temp_2++;
+
+                }
+
+                pAux_temp_1 = &pAux_temp[W_L_START_2];
+
+                pv_memset(
+                    pAux_temp_1,
+                    0,
+                    (LONG_BLOCK1 - W_L_START_2)*sizeof(*pAux_temp_1));
+
+                break;
+
+
+            case LONG_STOP_SEQUENCE:
+
+                pv_memset(
+                    pAux_temp_1,
+                    0,
+                    (W_L_STOP_1)*sizeof(*pAux_temp_1));
+
+                pShort_Window_1   = &Short_Window_fxp[wnd_shape_prev_bk][0];
+                pShort_Window_2   = &pShort_Window_1[HALF_SHORT_WINDOW];
+
+                pAux_temp_1      = &pAux_temp_1[W_L_STOP_1];
+                pAux_temp_2      = pAux_temp_1 + HALF_SHORT_WINDOW;
+
+                for (i = HALF_SHORT_WINDOW; i > 0; i--)
+                {
+
+                    *pAux_temp_1 = fxp_mul32_by_16((*pAux_temp_1), *pShort_Window_1++) >> shift;
+                    pAux_temp_1++;
+                    *pAux_temp_2 = fxp_mul32_by_16((*pAux_temp_2), *pShort_Window_2++) >> shift;
+                    pAux_temp_2++;
+
+
+                }
+
+                /* data unchanged from  W_L_STOP_2 to LONG_WINDOW */
+                pAux_temp_1 = &pAux_temp[W_L_STOP_2];
+
+                if (shift)
+                {
+                    for (i = ((LONG_WINDOW - W_L_STOP_2) >> 1); i != 0; i--)
+                    {
+                        *(pAux_temp_1++) >>= shift;
+                        *(pAux_temp_1++) >>= shift;
+                    }
+                }
+
+
+
+                pAux_temp_1 = &pAux_temp[LONG_WINDOW];
+                pAux_temp_2 =  pAux_temp_1 + HALF_LONG_WINDOW;
+
+                pLong_Window_1 =
+                    &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+
+                pLong_Window_2   = &pLong_Window_1[-HALF_LONG_WINDOW];
+
+                for (i = HALF_LONG_WINDOW; i > 0; i--)
+                {
+                    *pAux_temp_1 = fxp_mul32_by_16((*pAux_temp_1), *pLong_Window_1--) >> shift;
+                    pAux_temp_1++;
+                    *pAux_temp_2 = fxp_mul32_by_16((*pAux_temp_2), *pLong_Window_2--) >> shift;
+                    pAux_temp_2++;
+
+                }
+
+                break;
+
+            case ONLY_LONG_SEQUENCE:
+            default:
+
+                pAux_temp_2 = &pAux_temp[LONG_WINDOW];
+
+                pLong_Window_1 = &Long_Window_fxp[wnd_shape_prev_bk][0];
+
+
+                pLong_Window_2 =
+                    &Long_Window_fxp[wnd_shape_this_bk][LONG_WINDOW_m_1];
+
+
+                for (i = LONG_WINDOW; i > 0; i--)
+                {
+
+                    *pAux_temp_1 = fxp_mul32_by_16((*pAux_temp_1), *pLong_Window_1++) >> shift;
+                    pAux_temp_1++;
+                    *pAux_temp_2 = fxp_mul32_by_16((*pAux_temp_2), *pLong_Window_2--) >> shift;
+                    pAux_temp_2++;
+                }
+
+                break;
+
+        }   /* end switch ( wnd_seq)  */
+
+
+
+        *pQ_format += mdct_fxp(
+                          pAux_temp,
+                          mem_4_in_place_FFT,
+                          LONG_BLOCK1);
+
+
+    }   /* end if( wnd_seq != EIGHT_SHORT_SEQUENCE) */
+
+
+
+    /*****************************************/
+    /* decoding process for short window */
+    /*****************************************/
+
+    /*
+     * For short window the following code will be applied
+     * in the future when short window is supported in the
+     * standards
+     */
+    /*-------------------------------------------------------------------------
+
+    *        pAux_temp = &mem_4_in_place_FFT[(2*SHORT_BLOCK1)];
+    *
+    *        for ( wnd=0; wnd<NUM_SHORT_WINDOWS; wnd++)
+    *        {
+    *
+    *            pShort_Window_1 = &Short_Window_fxp[wnd_shape_this_bk][0];
+    *
+    *            if (wnd == 0)
+    *            {
+    *                pShort_Window_1 = &Short_Window_fxp[wnd_shape_prev_bk][0];
+    *            }
+    *
+    *            pShort_Window_2   =
+    *                    &Short_Window_fxp[wnd_shape_this_bk][SHORT_WINDOW_m_1];
+    *
+    *            pAux_temp_1 =  pAux_temp;
+    *            pAux_temp_2 = pAux_temp_1 + SHORT_WINDOW;
+    *
+    *            Q_aux = 0;
+    *
+    *            buffer_adaptation (
+    *                &Q_aux,
+    *                &Time2Freq_data[ W_L_STOP_1 + wnd*SHORT_WINDOW],
+    *                (void *) pAux_temp,
+    *                SHORT_BLOCK1,
+    *                USING_INT,
+    *                16);
+    *
+    *
+    *            for ( i=SHORT_WINDOW; i>0; i--)
+    *            {
+    *                temp           = (*pAux_temp_1) * *pShort_Window_1++;
+    *                *pAux_temp_1++ = (temp + 0x08000L) >> 16;
+    *
+    *                temp           = (*pAux_temp_2) * *pShort_Window_2--;
+    *                *pAux_temp_2++ = (temp + 0x08000L) >> 16;
+    *
+    *            }
+    *
+    *
+    *            exp = mdct_fxp(
+    *                pAux_temp,
+    *                mem_4_in_place_FFT,
+    *                SHORT_BLOCK1);
+    *
+    *
+    *            exp += Q_aux;
+    *
+    *            pAux_temp_1  =  pAux_temp;
+    *            pAux_temp_2  =  pAux_temp_1  +  HALF_SHORT_WINDOW;
+    *            pTime_data_1 = &Time2Freq_data[wnd*SHORT_WINDOW];
+    *            pTime_data_2 =  pTime_data_1 + HALF_SHORT_WINDOW;
+    *
+    *
+    *            if (exp > 0)
+    *            {
+    *                for ( i=HALF_SHORT_WINDOW; i>0; i--)
+    *                {
+    *                    *pTime_data_1++ = (*pAux_temp_1++>>exp);
+    *                    *pTime_data_2++ = (*pAux_temp_2++>>exp);
+    *                }
+    *            }
+    *            else if (exp < 0)
+    *            {
+    *                exp = -exp;
+    *                for ( i=HALF_SHORT_WINDOW; i>0; i--)
+    *                {
+    *                    *pTime_data_1++ = (*pAux_temp_1++<<exp);
+    *                    *pTime_data_2++ = (*pAux_temp_2++<<exp);
+    *                }
+    *            }
+    *            else
+    *            {
+    *                for ( i=HALF_SHORT_WINDOW; i>0; i--)
+    *                {
+    *                    *pTime_data_1++ = (*pAux_temp_1++);
+    *                    *pTime_data_2++ = (*pAux_temp_2++);
+    *                }
+    *            }
+    *
+    *        }
+    *
+    *    }
+    *
+    *--------------------------------------------------------------------------*/
+
+}   /* trans4m_time_2_freq_fxp */
diff --git a/media/libstagefright/codecs/aacdec/unpack_idx.cpp b/media/libstagefright/codecs/aacdec/unpack_idx.cpp
new file mode 100644
index 0000000..9180994
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/unpack_idx.cpp
@@ -0,0 +1,660 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./src/unpack_idx.c
+ Function:  unpack_idx
+            unpack_idx_sgn
+            unpack_idx_esc
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:  Modified from original shareware code
+
+ Description:  Eliminated 3 divisions and 1 multiplication through a table
+ look-up method for calculating 1/mod and constant allocation of 1/mod^3
+ and 1/mod^2.
+ Eliminated 3 additions through simple optimizations in the code.
+ Changed if/else  statement to a switch/case utilizing fall-through.
+
+ Description:   Made changes per review comments.  Main improvements were
+ in change of switch/case to if statement, and use of temporary variable
+ to hold value of *pQuantSpec.
+
+ Description: (1) Typecast codeword_indx to Int32 before multiplication, this
+              assures the shift operation happens on a 32-bit product on
+              TI-C55x processor.
+              (2) define temp_spec as Int32 to avoid overflow
+
+ Description: Modified per review comments
+              (1) remove the two typecastings of codeword_indx when
+                  pHuffCodebook->dim == DIMENSION_4
+              (2) temp_spec is Int because the result never exceeds 16 bits
+
+ Description: Break up and combine unpack index with sign bit reading and for
+              special escape code. Parent function must know which one of the
+              3 functions should be called.
+
+ Description: Put back if-statement to get the max.
+
+ Description: When searching for the max, there was some instances where the
+              max was compared against a negative number, so the max was never
+              updated (defaulted to 0), leading to block processing in other
+              magnitude sensitive stages.
+
+ Who:                       Date:
+ Description:
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+          Int  quant_spec[]  = Array for storage of the quantized
+                               spectral coefficients.  Length is either 2 or 4.
+                               See Ref #1, Page 76 for a complete description.
+
+          Int  codeword_indx = The index into the Huffman table.
+                               Range is [1-288]
+
+    const Hcb *pHuffCodebook = Pointer to HuffmanCodebook information.
+
+          BITS  *pInputStream = Pointer to the bitstream buffer.
+          Int *max           = Pointer to maximum coefficient value.
+
+ Local Stores/Buffers/Pointers Needed:
+    const UInt div_mod[18]   = An array with the values for 1/mod
+                               stored in Q-formats 13.
+
+ Global Stores/Buffers/Pointers Needed:
+    None
+
+ Outputs:
+    None
+
+ Pointers and Buffers Modified:
+    Int quant_spec[] = Output (the quantized and signed spectral coefficients)
+                       returned via this pointer.
+
+ Local Stores Modified:
+    None
+
+ Global Stores Modified:
+    None
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ This function decodes quantized spectral coefficients and decode their signs
+ from the input bitstream. Quantized spectral coefficients are transmitted as
+ four-tuples or 2-tuples, and this information is conveyed to the function via
+ the variable HuffCodebook->dim.
+
+ See Reference #1 for a complete description
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+ This function shall correctly calculate pQuantSpec[], given the inputs
+
+ codeword_indx     = {1-288};
+ HuffCodebook->off = {0, 1, 4};
+ HuffCodebook->mod = {3, 8, 9, 13, 17};
+
+ mod =   LAV + 1 if unsigned codebook
+ mod = 2*LAV + 1 if   signed codebook
+
+ Range of values for LAV is {2,7,12,16} if unsigned
+                            {1,4}       if   signed
+
+ Additionally,
+     LAV <= 2 if dim == 4
+
+ This restricts mod ==  3                if dim == 4
+            and mod == {3, 8, 9, 13, 17} if dim == 2
+
+ This function will NOT function correctly if fed values that do not
+ meet the requirements as stated above.
+
+ This limitation on the range of values was determined by analysis
+ of Reference #1 (see below.)
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 14496-3:1999(E)
+     Part 3
+        Subpart 4.6.3.3   Decoding Process
+        Subpart 4.6.4     Tables
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her  own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+    IF (pHuffCodebook->dim == 4)
+        *(pQuantSpec) = codeword_indx/(3^3);
+        codeword_indx = codeword_indx - *(pQuantSpec)*(3^3);
+        *(pQuantSpec) = *(pQuantSpec) - off;
+
+        pQuantSpec    = pQuantSpec + 1;
+
+        *(pQuantSpec) = codeword_indx/(3^2);
+        codeword_indx = codeword_indx - *(pQuantSpec)*(3^2);
+        *(pQuantSpec) = *(pQuantSpec) - off;
+
+        pQuantSpec    = pQuantSpec + 1;
+    ENDIF
+
+        *(pQuantSpec) = codeword_indx/mod;
+        codeword_indx = codeword_indx - (*pQuantSpec)*mod;
+        *(pQuantSpec) = *(pQuantSpec) - off;
+
+        pQuantSpec    = pQuantSpec + 1;
+
+        *(pQuantSpec) = codeword_indx - off;
+
+------------------------------------------------------------------------------
+ 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 "pv_audio_type_defs.h"
+#include "s_hcb.h"
+#include "ibstream.h"
+#include "unpack_idx.h"
+
+#include "fxp_mul32.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define DIV_3_CUBED    19  /* 19 = 1/27 in Q-9 format    */
+#define THREE_CUBED    27  /* 27 = 3^3                   */
+
+#define DIV_3_SQUARED  57  /* 57 = 1/9  in Q-9 format    */
+#define THREE_SQUARED   9  /*  9 = 3^2                   */
+
+#define Q_FORMAT_MOD   13  /* Q-format for 1/mod table   */
+#define Q_FORMAT_MOD2   9  /* Q-format for DIV_3_SQUARED */
+#define Q_FORMAT_MOD3   9  /* Q-format for DIV_3_CUBED   */
+
+#define LOWER_5_BITS_MASK 0x1F
+
+
+#if ( defined(PV_ARM_V5) || defined(PV_ARM_V4))
+
+__inline Int32 abs1(Int32 x)
+{
+    Int32 z;
+    /*
+        z = x - (x<0);
+        x = z ^ sign(z)
+     */
+    __asm
+    {
+        sub  z, x, x, lsr #31
+        eor  x, z, z, asr #31
+    }
+    return (x);
+}
+
+#define pv_abs(x)   abs1(x)
+
+
+#else
+
+#define pv_abs(x)   ((x) > 0)? (x) : (-x)
+
+#endif
+
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------
+    Possible values for mod = {3,8,9,13,17}
+
+    There exists "empty" spaces in the table.  These can potentially
+    be utilized by other const tables, if available memory becomes an issue.
+---------------------------------------------------------------------------*/
+
+const Int div_mod[18] =   /*   mod   index  Q-format */
+{
+    /* ----------------------- */
+    0xCC,                 /* |      |  0  |          */
+    0xCC,                 /* |      |  1  |          */
+    0xCC,                 /* |      |  2  |          */
+    2731,                 /* |  3   |  3  |   13     */
+    0xCC,                 /* |      |  4  |          */
+    0xCC,                 /* |      |  5  |          */
+    0xCC,                 /* |      |  6  |          */
+    0xCC,                 /* |      |  7  |          */
+    1025,                 /* |  8   |  8  |   13     */
+    911,                 /* |  9   |  9  |   13     */
+    0xCC,                 /* |      | 10  |          */
+    0xCC,                 /* |      | 11  |          */
+    0xCC,                 /* |      | 12  |          */
+    631,                 /* |  13  | 13  |   13     */
+    0xCC,                 /* |      | 14  |          */
+    0xCC,                 /* |      | 15  |          */
+    0xCC,                 /* |      | 16  |          */
+    482,                 /* |  17  | 17  |   13     */
+};
+
+/*----------------------------------------------------------------------------
+; 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 unpack_idx(
+    Int16   quant_spec[],
+    Int codeword_indx,
+    const Hcb   *pHuffCodebook,
+    BITS  *pInputStream,
+    Int *max)
+{
+    Int16 *pQuantSpec = &quant_spec[0];
+    Int  temp_spec;
+
+    const Int mod = pHuffCodebook->mod;
+    const Int off = pHuffCodebook->off;
+
+    OSCL_UNUSED_ARG(pInputStream);
+
+
+    if (pHuffCodebook->dim == DIMENSION_4)
+    {
+        /* Calculate pQuantSpec[0] */
+
+        temp_spec      = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3;
+
+        codeword_indx -= temp_spec * THREE_CUBED;
+
+        temp_spec -= off;
+        *pQuantSpec++  = (Int16)temp_spec;
+
+        temp_spec = pv_abs(temp_spec);
+
+        if (temp_spec > *max)
+        {
+            *max = temp_spec;
+        }
+
+        /* Calculate pQuantSpec[1] */
+        temp_spec      = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2;
+
+        codeword_indx -= temp_spec * THREE_SQUARED;
+
+        temp_spec -= off;
+        *pQuantSpec++  = (Int16)temp_spec;
+
+        temp_spec = pv_abs(temp_spec);
+
+        if (temp_spec > *max)
+        {
+            *max = temp_spec;
+        }
+    }
+
+    /*
+     *  Calculate pQuantSpec[2] if dim == 4
+     *  Calculate pQuantSpec[0] if dim == 2
+     */
+
+    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
+
+    codeword_indx -= temp_spec * mod;
+
+    temp_spec -= off;
+    *pQuantSpec++  = (Int16)temp_spec;
+
+    temp_spec = pv_abs(temp_spec);
+
+
+    if (temp_spec > *max)
+    {
+        *max = temp_spec;
+    }
+
+    /*
+    *  Calculate pQuantSpec[3] if dim == 4
+    *  Calculate pQuantSpec[1] if dim == 2
+    */
+    codeword_indx -= off;
+    *pQuantSpec    = (Int16)codeword_indx ;
+
+
+    codeword_indx = pv_abs(codeword_indx);
+
+    if (codeword_indx > *max)
+    {
+        *max = codeword_indx;
+    }
+
+
+    return ;
+} /* unpack_idx */
+
+
+void unpack_idx_sgn(
+    Int16   quant_spec[],
+    Int codeword_indx,
+    const Hcb   *pHuffCodebook,
+    BITS  *pInputStream,
+    Int *max)
+{
+    Int16 *pQuantSpec = &quant_spec[0];
+    Int  temp_spec;
+    Int  sgn;
+
+    const Int mod = pHuffCodebook->mod;
+    const Int off = pHuffCodebook->off;
+
+
+
+    if (pHuffCodebook->dim == DIMENSION_4)
+    {
+        /* Calculate pQuantSpec[0] */
+        preload_cache((Int32 *)pQuantSpec);
+        temp_spec      = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3;
+
+        codeword_indx -= temp_spec * THREE_CUBED;
+
+        temp_spec -= off;
+        if (temp_spec)
+        {
+            sgn = get1bits(pInputStream);
+
+
+            *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
+
+            temp_spec = pv_abs(temp_spec);
+
+            if (temp_spec > *max)
+            {
+                *max = temp_spec;
+            }
+
+        }
+        else
+        {
+            *pQuantSpec++ = 0;
+        }
+
+        /* Calculate pQuantSpec[1] */
+        temp_spec      = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2;
+
+        codeword_indx -= temp_spec * THREE_SQUARED;
+
+        temp_spec -= off;
+        if (temp_spec)
+        {
+
+            sgn = get1bits(pInputStream);
+
+            *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
+
+            temp_spec = pv_abs(temp_spec);
+
+            if (temp_spec > *max)
+            {
+                *max = temp_spec;
+            }
+        }
+        else
+        {
+            *pQuantSpec++ = 0;
+        }
+    }
+
+    /*
+     *  Calculate pQuantSpec[2] if dim == 4
+     *  Calculate pQuantSpec[0] if dim == 2
+     */
+
+    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
+
+    codeword_indx -= temp_spec * mod;
+
+    temp_spec -= off;
+    if (temp_spec)
+    {
+
+        sgn = get1bits(pInputStream);
+
+        *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec);
+
+        temp_spec = pv_abs(temp_spec);
+
+        if (temp_spec > *max)
+        {
+            *max = temp_spec;
+        }
+    }
+    else
+    {
+        *pQuantSpec++ = 0;
+    }
+
+    /*
+     *  Calculate pQuantSpec[3] if dim == 4
+     *  Calculate pQuantSpec[1] if dim == 2
+     */
+    codeword_indx -= off;
+    if (codeword_indx)
+    {
+
+        sgn = get1bits(pInputStream);
+
+        *pQuantSpec = (Int16)((sgn) ? -codeword_indx : codeword_indx);
+
+        codeword_indx = pv_abs(codeword_indx);
+
+        if (codeword_indx > *max)
+        {
+            *max = codeword_indx;
+        }
+    }
+    else
+    {
+        *pQuantSpec = 0;
+    }
+
+    return ;
+} /* unpack_idx_sgn */
+
+
+void unpack_idx_esc(
+    Int16   quant_spec[],
+    Int codeword_indx,
+    const Hcb   *pHuffCodebook,
+    BITS  *pInputStream,
+    Int *max)
+{
+    Int  temp_spec;
+    Int  sgn1 = 0, sgn2 = 0;
+    Int N;
+    Int32 esc_seq;
+
+    const Int mod = pHuffCodebook->mod;
+    const Int off = pHuffCodebook->off;
+
+
+    temp_spec      = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD;
+
+    codeword_indx -= temp_spec * mod;
+
+    temp_spec -= off;
+    if (temp_spec)
+    {
+        sgn1 = get1bits(pInputStream);
+    }
+
+    codeword_indx -= off;
+    if (codeword_indx)
+    {
+        sgn2 = get1bits(pInputStream);
+    }
+
+
+    if ((temp_spec & LOWER_5_BITS_MASK) == 16)
+    {
+        N = 3;
+        do
+        {
+            N++;
+
+            esc_seq = get1bits(pInputStream);
+
+        }
+        while (esc_seq != 0);
+
+        esc_seq  = getbits(N, pInputStream);
+
+        esc_seq += (1 << N);
+
+
+        temp_spec = (Int)((temp_spec * esc_seq) >> 4);
+
+    }
+
+
+    if (sgn1)
+    {
+        quant_spec[0]  = (Int16)(-temp_spec);
+    }
+    else
+    {
+        quant_spec[0]  = (Int16)temp_spec;
+    }
+
+    temp_spec = pv_abs(temp_spec);
+
+    if (temp_spec > *max)
+    {
+        *max = temp_spec;
+    }
+
+    if ((codeword_indx & LOWER_5_BITS_MASK) == 16)
+    {
+        N = 3;
+        do
+        {
+            N++;
+
+            esc_seq = get1bits(pInputStream);
+
+        }
+        while (esc_seq != 0);
+
+        esc_seq  = getbits(N, pInputStream);
+
+        esc_seq += (1 << N);
+
+        codeword_indx = (Int)((codeword_indx * esc_seq) >> 4);
+    }
+
+
+
+
+    if (sgn2)
+    {
+        quant_spec[1]    = (Int16)(-codeword_indx);
+    }
+    else
+    {
+        quant_spec[1]    = (Int16)codeword_indx;
+    }
+
+
+    codeword_indx = pv_abs(codeword_indx);
+
+    if (codeword_indx > *max)
+    {
+        *max = codeword_indx;
+    }
+
+
+    return ;
+} /* unpack_idx_esc */
diff --git a/media/libstagefright/codecs/aacdec/unpack_idx.h b/media/libstagefright/codecs/aacdec/unpack_idx.h
new file mode 100644
index 0000000..a308c4a
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/unpack_idx.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.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: ./include/unpack_idx.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Who:                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This header file includes the function definition for unpack_idx()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef UNPACK_IDX_H
+#define UNPACK_IDX_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include    "pv_audio_type_defs.h"
+#include    "s_hcb.h"
+#include    "s_bits.h"
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define DIMENSION_4     4
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+    void unpack_idx(
+        Int16  QuantSpec[],
+        Int  codeword_indx,
+        const Hcb *pHuffCodebook,
+        BITS  *pInputStream,
+        Int *max);
+    void unpack_idx_sgn(
+        Int16  quant_spec[],
+        Int  codeword_indx,
+        const Hcb *pHuffCodebook,
+        BITS  *pInputStream,
+        Int *max);
+    void unpack_idx_esc(
+        Int16  quant_spec[],
+        Int  codeword_indx,
+        const Hcb *pHuffCodebook,
+        BITS  *pInputStream,
+        Int *max);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/aacdec/window_block_fxp.h b/media/libstagefright/codecs/aacdec/window_block_fxp.h
new file mode 100644
index 0000000..f936199
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/window_block_fxp.h
@@ -0,0 +1,231 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: window_block_fxp.h
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+    modified function definition: Time_data from Int to Int32
+    change wnd_shape from structure to passing parameters
+    delete definition of wnd_shape1, not needed.
+
+ Description: Modified based on unit test comments
+
+ Description: Change copyright, add () around constants.
+
+ Description:
+    changed Long_Window_fxp and Short _Window_fxp tables definition, from
+    "const UInt16 *"  to "const UInt16 * const" to avoid global variable
+    definition.
+
+ Description: Updated function trans4m_freq_2_time_fxp definition
+
+ Description:  Modified function interface to add output_buffer
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for window and block switch
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ (1) ISO/IEC 13818-7 Part 7: Advanced Audo Coding (AAC)
+
+
+ (2) MPEG-2 NBC Audio Decoder
+   "This software module was originally developed by AT&T, Dolby
+   Laboratories, Fraunhofer Gesellschaft IIS in the course of development
+   of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
+   3. This software module is an implementation of a part of one or more
+   MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
+   Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
+   standards free license to this software module or modifications thereof
+   for use in hardware or software products claiming conformance to the
+   MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
+   module in hardware or software products are advised that this use may
+   infringe existing patents. The original developer of this software
+   module and his/her company, the subsequent editors and their companies,
+   and ISO/IEC have no liability for use of this software module or
+   modifications thereof in an implementation. Copyright is not released
+   for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
+   developer retains full right to use the code for his/her own purpose,
+   assign or donate the code to a third party and to inhibit third party
+   from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
+   This copyright notice must be included in all copies or derivative
+   works."
+   Copyright(c)1996.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef WINDOW_BLOCK_FXP_H
+#define WINDOW_BLOCK_FXP_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "e_window_shape.h"
+#include "e_window_sequence.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; DEFINES
+    ; Include all pre-processor statements here.
+    ----------------------------------------------------------------------------*/
+#define LONG_WINDOW         (1024)
+#define SHORT_WINDOW        (128)
+
+#define HALF_LONG_WINDOW    (LONG_WINDOW>>1)
+#define HALF_SHORT_WINDOW   (SHORT_WINDOW>>1)
+
+#define NUM_SHORT_WINDOWS   (8)
+#define LONG_WINDOW_m_1     (LONG_WINDOW-1)
+#define SHORT_WINDOW_m_1    (SHORT_WINDOW-1)
+
+    /*
+     *  Limits for window sequences, they are used to build
+     *  each long window, they are defined in the standards
+     */
+#define W_L_START_1         ((3*LONG_WINDOW - SHORT_WINDOW)>>1)
+#define W_L_START_2         ((3*LONG_WINDOW + SHORT_WINDOW)>>1)
+#define W_L_STOP_1          ((LONG_WINDOW - SHORT_WINDOW)>>1)
+#define W_L_STOP_2          ((LONG_WINDOW + SHORT_WINDOW)>>1)
+
+
+#define LONG_BLOCK1          (2*LONG_WINDOW)
+#define SHORT_BLOCK1         (2*SHORT_WINDOW)
+
+
+#define  SCALING    10
+#define  ROUNDING     (1<<(SCALING-1))
+
+
+    /*----------------------------------------------------------------------------
+    ; EXTERNAL VARIABLES REFERENCES
+    ; Declare variables used in this module but defined elsewhere
+    ----------------------------------------------------------------------------*/
+    extern const Int16 Short_Window_KBD_fxp[ SHORT_WINDOW];
+    extern const Int16 Long_Window_KBD_fxp[ LONG_WINDOW];
+    extern const Int16 Short_Window_sine_fxp[ SHORT_WINDOW];
+    extern const Int16 Long_Window_sine_fxp[ LONG_WINDOW];
+
+    extern const Int16 * const Long_Window_fxp[];
+    extern const Int16 * const Short_Window_fxp[];
+
+    /*----------------------------------------------------------------------------
+    ; SIMPLE TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; ENUMERATED TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /*----------------------------------------------------------------------------
+    ; GLOBAL FUNCTION DEFINITIONS
+    ; Function Prototype declaration
+    ----------------------------------------------------------------------------*/
+
+    void trans4m_freq_2_time_fxp(
+        Int32   Frequency_data[],
+        Int32   Time_data[],
+#ifdef AAC_PLUS
+        Int32   Output_buffer[],
+#else
+        Int16   Output_buffer[],
+#endif
+        WINDOW_SEQUENCE wnd_seq,
+        Int     wnd_shape_prev_bk,
+        Int     wnd_shape_this_bk,
+        Int     Q_format,
+        Int32   abs_max_per_window[],
+        Int32   freq_2_time_buffer[] ,
+        Int16   *Interleave_output
+    );
+
+
+
+    void trans4m_freq_2_time_fxp_1(
+        Int32   Frequency_data[],
+        Int32   Time_data[],
+        Int16   Output_buffer[],
+        WINDOW_SEQUENCE wnd_seq,
+        Int     wnd_shape_prev_bk,
+        Int     wnd_shape_this_bk,
+        Int     Q_format,
+        Int32   abs_max_per_window[],
+        Int32   freq_2_time_buffer[]
+    );
+
+
+    void trans4m_freq_2_time_fxp_2(
+        Int32   Frequency_data[],
+        Int32   Time_data[],
+        WINDOW_SEQUENCE wnd_seq,
+        Int     wnd_shape_prev_bk,
+        Int     wnd_shape_this_bk,
+        Int     Q_format,
+        Int32   abs_max_per_window[],
+        Int32   freq_2_time_buffer[] ,
+        Int16   *Interleave_output
+    );
+
+    void trans4m_time_2_freq_fxp(
+        Int32   Time2Freq_data[],
+        WINDOW_SEQUENCE wnd_seq,
+        Int     wnd_shape_prev_bk,
+        Int     wnd_shape_this_bk,
+        Int     *pQ_format,
+        Int32   mem_4_in_place_FFT[]);
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /*  WINDOW_BLOCK_FXP_H */
+
diff --git a/media/libstagefright/codecs/aacdec/window_tables_fxp.cpp b/media/libstagefright/codecs/aacdec/window_tables_fxp.cpp
new file mode 100644
index 0000000..aa04225
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/window_tables_fxp.cpp
@@ -0,0 +1,730 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: window_tables_fxp.c
+ Funtions:
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+    changed table content definition from UInt to UInt16.
+
+ Description:
+    changed Long_Window_fxp and Short _Window_fxp tables definition, from
+    "const UInt16 *"  to "const UInt16 * const" to avoid global variable
+    definition.
+
+ Description:
+    Improved rounding on table elements.
+
+ Description: Eliminated structure to avoid assigning addresses to constant
+              tables. This solve linking problem when using the
+              /ropi option (Read-only position independent) for some
+              compilers
+              - Eliminated Long_Window_fxp and Short_Window_fxp as global
+                contants vectors
+
+ Who:                       Date:
+ Description:
+
+  ------------------------------------------------------------------------------
+ MODULE DESCRIPTION
+
+    Window tables
+
+        For a sine table with N  points:
+
+            w_left  = sin(pi/N (n + 1/2))     for 0   =< n < N/2
+
+            w_rigth = sin(pi/N (n + 1/2))     for N/2 =< n < N
+
+
+        For Kaiser-Bessel derived (KBD)
+
+                               n             N/2
+            w_left  =  sqrt(( SUM W(p,a) )/( SUM W(p,a) )   for   0   =< n < N/2
+                              p=0            p=0
+
+
+                             N-n-1           N/2
+            w_rigth =  sqrt(( SUM W(p,a) )/( SUM W(p,a) )   for   N/2 =< n < N
+                              p=0            p=0
+
+
+            W(p,a) see ISO 14496-3, pag 113
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+    This module shall implement the fix point verwion of the windowing tables
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+    [1] ISO 14496-3, pag 113
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_audio_type_defs.h"
+#include "window_block_fxp.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
+----------------------------------------------------------------------------*/
+
+
+const Int16 Long_Window_sine_fxp[LONG_WINDOW] =
+{
+
+
+    0x0019,  0x004B,  0x007E,  0x00B0,
+    0x00E2,  0x0114,  0x0147,  0x0179,
+    0x01AB,  0x01DD,  0x0210,  0x0242,
+    0x0274,  0x02A7,  0x02D9,  0x030B,
+    0x033D,  0x0370,  0x03A2,  0x03D4,
+    0x0406,  0x0438,  0x046B,  0x049D,
+    0x04CF,  0x0501,  0x0534,  0x0566,
+    0x0598,  0x05CA,  0x05FC,  0x062F,
+    0x0661,  0x0693,  0x06C5,  0x06F7,
+    0x072A,  0x075C,  0x078E,  0x07C0,
+    0x07F2,  0x0825,  0x0857,  0x0889,
+    0x08BB,  0x08ED,  0x091F,  0x0951,
+    0x0984,  0x09B6,  0x09E8,  0x0A1A,
+    0x0A4C,  0x0A7E,  0x0AB0,  0x0AE2,
+    0x0B14,  0x0B46,  0x0B78,  0x0BAB,
+    0x0BDD,  0x0C0F,  0x0C41,  0x0C73,
+    0x0CA5,  0x0CD7,  0x0D09,  0x0D3B,
+    0x0D6D,  0x0D9F,  0x0DD1,  0x0E03,
+    0x0E35,  0x0E67,  0x0E99,  0x0ECA,
+    0x0EFC,  0x0F2E,  0x0F60,  0x0F92,
+    0x0FC4,  0x0FF6,  0x1028,  0x105A,
+    0x108B,  0x10BD,  0x10EF,  0x1121,
+    0x1153,  0x1185,  0x11B6,  0x11E8,
+    0x121A,  0x124C,  0x127D,  0x12AF,
+    0x12E1,  0x1312,  0x1344,  0x1376,
+    0x13A8,  0x13D9,  0x140B,  0x143C,
+    0x146E,  0x14A0,  0x14D1,  0x1503,
+    0x1534,  0x1566,  0x1598,  0x15C9,
+    0x15FB,  0x162C,  0x165E,  0x168F,
+    0x16C1,  0x16F2,  0x1724,  0x1755,
+    0x1786,  0x17B8,  0x17E9,  0x181B,
+    0x184C,  0x187D,  0x18AF,  0x18E0,
+    0x1911,  0x1942,  0x1974,  0x19A5,
+    0x19D6,  0x1A07,  0x1A39,  0x1A6A,
+    0x1A9B,  0x1ACC,  0x1AFD,  0x1B2E,
+    0x1B60,  0x1B91,  0x1BC2,  0x1BF3,
+    0x1C24,  0x1C55,  0x1C86,  0x1CB7,
+    0x1CE8,  0x1D19,  0x1D4A,  0x1D7B,
+    0x1DAC,  0x1DDC,  0x1E0D,  0x1E3E,
+    0x1E6F,  0x1EA0,  0x1ED1,  0x1F01,
+    0x1F32,  0x1F63,  0x1F94,  0x1FC4,
+    0x1FF5,  0x2026,  0x2056,  0x2087,
+    0x20B7,  0x20E8,  0x2119,  0x2149,
+    0x217A,  0x21AA,  0x21DB,  0x220B,
+    0x223C,  0x226C,  0x229C,  0x22CD,
+    0x22FD,  0x232E,  0x235E,  0x238E,
+    0x23BE,  0x23EF,  0x241F,  0x244F,
+    0x247F,  0x24AF,  0x24E0,  0x2510,
+    0x2540,  0x2570,  0x25A0,  0x25D0,
+    0x2600,  0x2630,  0x2660,  0x2690,
+    0x26C0,  0x26F0,  0x2720,  0x274F,
+    0x277F,  0x27AF,  0x27DF,  0x280F,
+    0x283E,  0x286E,  0x289E,  0x28CD,
+    0x28FD,  0x292D,  0x295C,  0x298C,
+    0x29BB,  0x29EB,  0x2A1A,  0x2A4A,
+    0x2A79,  0x2AA8,  0x2AD8,  0x2B07,
+    0x2B37,  0x2B66,  0x2B95,  0x2BC4,
+    0x2BF4,  0x2C23,  0x2C52,  0x2C81,
+    0x2CB0,  0x2CDF,  0x2D0E,  0x2D3D,
+    0x2D6C,  0x2D9B,  0x2DCA,  0x2DF9,
+    0x2E28,  0x2E57,  0x2E86,  0x2EB5,
+    0x2EE3,  0x2F12,  0x2F41,  0x2F70,
+    0x2F9E,  0x2FCD,  0x2FFC,  0x302A,
+    0x3059,  0x3087,  0x30B6,  0x30E4,
+    0x3113,  0x3141,  0x316F,  0x319E,
+    0x31CC,  0x31FA,  0x3229,  0x3257,
+    0x3285,  0x32B3,  0x32E1,  0x330F,
+    0x333E,  0x336C,  0x339A,  0x33C8,
+    0x33F6,  0x3423,  0x3451,  0x347F,
+    0x34AD,  0x34DB,  0x3509,  0x3536,
+    0x3564,  0x3592,  0x35BF,  0x35ED,
+    0x361A,  0x3648,  0x3676,  0x36A3,
+    0x36D0,  0x36FE,  0x372B,  0x3759,
+    0x3786,  0x37B3,  0x37E0,  0x380E,
+    0x383B,  0x3868,  0x3895,  0x38C2,
+    0x38EF,  0x391C,  0x3949,  0x3976,
+    0x39A3,  0x39D0,  0x39FD,  0x3A29,
+    0x3A56,  0x3A83,  0x3AB0,  0x3ADC,
+    0x3B09,  0x3B35,  0x3B62,  0x3B8E,
+    0x3BBB,  0x3BE7,  0x3C14,  0x3C40,
+    0x3C6C,  0x3C99,  0x3CC5,  0x3CF1,
+    0x3D1D,  0x3D4A,  0x3D76,  0x3DA2,
+    0x3DCE,  0x3DFA,  0x3E26,  0x3E52,
+    0x3E7D,  0x3EA9,  0x3ED5,  0x3F01,
+    0x3F2D,  0x3F58,  0x3F84,  0x3FB0,
+    0x3FDB,  0x4007,  0x4032,  0x405E,
+    0x4089,  0x40B5,  0x40E0,  0x410B,
+    0x4136,  0x4162,  0x418D,  0x41B8,
+    0x41E3,  0x420E,  0x4239,  0x4264,
+    0x428F,  0x42BA,  0x42E5,  0x4310,
+    0x433B,  0x4365,  0x4390,  0x43BB,
+    0x43E5,  0x4410,  0x443B,  0x4465,
+    0x448F,  0x44BA,  0x44E4,  0x450F,
+    0x4539,  0x4563,  0x458D,  0x45B8,
+    0x45E2,  0x460C,  0x4636,  0x4660,
+    0x468A,  0x46B4,  0x46DE,  0x4707,
+    0x4731,  0x475B,  0x4785,  0x47AE,
+    0x47D8,  0x4802,  0x482B,  0x4855,
+    0x487E,  0x48A7,  0x48D1,  0x48FA,
+    0x4923,  0x494D,  0x4976,  0x499F,
+    0x49C8,  0x49F1,  0x4A1A,  0x4A43,
+    0x4A6C,  0x4A95,  0x4ABE,  0x4AE6,
+    0x4B0F,  0x4B38,  0x4B61,  0x4B89,
+    0x4BB2,  0x4BDA,  0x4C03,  0x4C2B,
+    0x4C53,  0x4C7C,  0x4CA4,  0x4CCC,
+    0x4CF4,  0x4D1D,  0x4D45,  0x4D6D,
+    0x4D95,  0x4DBD,  0x4DE5,  0x4E0D,
+    0x4E34,  0x4E5C,  0x4E84,  0x4EAB,
+    0x4ED3,  0x4EFB,  0x4F22,  0x4F4A,
+    0x4F71,  0x4F99,  0x4FC0,  0x4FE7,
+    0x500E,  0x5036,  0x505D,  0x5084,
+    0x50AB,  0x50D2,  0x50F9,  0x5120,
+    0x5147,  0x516D,  0x5194,  0x51BB,
+    0x51E2,  0x5208,  0x522F,  0x5255,
+    0x527C,  0x52A2,  0x52C8,  0x52EF,
+    0x5315,  0x533B,  0x5361,  0x5387,
+    0x53AE,  0x53D4,  0x53FA,  0x541F,
+    0x5445,  0x546B,  0x5491,  0x54B7,
+    0x54DC,  0x5502,  0x5527,  0x554D,
+    0x5572,  0x5598,  0x55BD,  0x55E2,
+    0x5608,  0x562D,  0x5652,  0x5677,
+    0x569C,  0x56C1,  0x56E6,  0x570B,
+    0x5730,  0x5754,  0x5779,  0x579E,
+    0x57C2,  0x57E7,  0x580C,  0x5830,
+    0x5854,  0x5879,  0x589D,  0x58C1,
+    0x58E5,  0x590A,  0x592E,  0x5952,
+    0x5976,  0x599A,  0x59BD,  0x59E1,
+    0x5A05,  0x5A29,  0x5A4C,  0x5A70,
+    0x5A94,  0x5AB7,  0x5ADA,  0x5AFE,
+    0x5B21,  0x5B44,  0x5B68,  0x5B8B,
+    0x5BAE,  0x5BD1,  0x5BF4,  0x5C17,
+    0x5C3A,  0x5C5D,  0x5C7F,  0x5CA2,
+    0x5CC5,  0x5CE7,  0x5D0A,  0x5D2C,
+    0x5D4F,  0x5D71,  0x5D94,  0x5DB6,
+    0x5DD8,  0x5DFA,  0x5E1C,  0x5E3E,
+    0x5E60,  0x5E82,  0x5EA4,  0x5EC6,
+    0x5EE8,  0x5F09,  0x5F2B,  0x5F4D,
+    0x5F6E,  0x5F90,  0x5FB1,  0x5FD2,
+    0x5FF4,  0x6015,  0x6036,  0x6057,
+    0x6078,  0x6099,  0x60BA,  0x60DB,
+    0x60FC,  0x611D,  0x613D,  0x615E,
+    0x617F,  0x619F,  0x61C0,  0x61E0,
+    0x6200,  0x6221,  0x6241,  0x6261,
+    0x6281,  0x62A1,  0x62C1,  0x62E1,
+    0x6301,  0x6321,  0x6341,  0x6360,
+    0x6380,  0x63A0,  0x63BF,  0x63DF,
+    0x63FE,  0x641D,  0x643D,  0x645C,
+    0x647B,  0x649A,  0x64B9,  0x64D8,
+    0x64F7,  0x6516,  0x6535,  0x6554,
+    0x6572,  0x6591,  0x65AF,  0x65CE,
+    0x65EC,  0x660B,  0x6629,  0x6647,
+    0x6666,  0x6684,  0x66A2,  0x66C0,
+    0x66DE,  0x66FC,  0x6719,  0x6737,
+    0x6755,  0x6772,  0x6790,  0x67AE,
+    0x67CB,  0x67E8,  0x6806,  0x6823,
+    0x6840,  0x685D,  0x687A,  0x6897,
+    0x68B4,  0x68D1,  0x68EE,  0x690B,
+    0x6927,  0x6944,  0x6961,  0x697D,
+    0x699A,  0x69B6,  0x69D2,  0x69EE,
+    0x6A0B,  0x6A27,  0x6A43,  0x6A5F,
+    0x6A7B,  0x6A97,  0x6AB2,  0x6ACE,
+    0x6AEA,  0x6B05,  0x6B21,  0x6B3C,
+    0x6B58,  0x6B73,  0x6B8E,  0x6BAA,
+    0x6BC5,  0x6BE0,  0x6BFB,  0x6C16,
+    0x6C31,  0x6C4C,  0x6C66,  0x6C81,
+    0x6C9C,  0x6CB6,  0x6CD1,  0x6CEB,
+    0x6D06,  0x6D20,  0x6D3A,  0x6D54,
+    0x6D6E,  0x6D88,  0x6DA2,  0x6DBC,
+    0x6DD6,  0x6DF0,  0x6E0A,  0x6E23,
+    0x6E3D,  0x6E56,  0x6E70,  0x6E89,
+    0x6EA2,  0x6EBC,  0x6ED5,  0x6EEE,
+    0x6F07,  0x6F20,  0x6F39,  0x6F52,
+    0x6F6B,  0x6F83,  0x6F9C,  0x6FB4,
+    0x6FCD,  0x6FE5,  0x6FFE,  0x7016,
+    0x702E,  0x7046,  0x705F,  0x7077,
+    0x708F,  0x70A6,  0x70BE,  0x70D6,
+    0x70EE,  0x7105,  0x711D,  0x7134,
+    0x714C,  0x7163,  0x717A,  0x7192,
+    0x71A9,  0x71C0,  0x71D7,  0x71EE,
+    0x7205,  0x721C,  0x7232,  0x7249,
+    0x7260,  0x7276,  0x728D,  0x72A3,
+    0x72B9,  0x72D0,  0x72E6,  0x72FC,
+    0x7312,  0x7328,  0x733E,  0x7354,
+    0x7369,  0x737F,  0x7395,  0x73AA,
+    0x73C0,  0x73D5,  0x73EB,  0x7400,
+    0x7415,  0x742A,  0x743F,  0x7454,
+    0x7469,  0x747E,  0x7493,  0x74A8,
+    0x74BC,  0x74D1,  0x74E5,  0x74FA,
+    0x750E,  0x7522,  0x7537,  0x754B,
+    0x755F,  0x7573,  0x7587,  0x759B,
+    0x75AE,  0x75C2,  0x75D6,  0x75E9,
+    0x75FD,  0x7610,  0x7624,  0x7637,
+    0x764A,  0x765E,  0x7671,  0x7684,
+    0x7697,  0x76A9,  0x76BC,  0x76CF,
+    0x76E2,  0x76F4,  0x7707,  0x7719,
+    0x772C,  0x773E,  0x7750,  0x7762,
+    0x7774,  0x7786,  0x7798,  0x77AA,
+    0x77BC,  0x77CE,  0x77DF,  0x77F1,
+    0x7803,  0x7814,  0x7825,  0x7837,
+    0x7848,  0x7859,  0x786A,  0x787B,
+    0x788C,  0x789D,  0x78AE,  0x78BE,
+    0x78CF,  0x78E0,  0x78F0,  0x7901,
+    0x7911,  0x7921,  0x7931,  0x7941,
+    0x7952,  0x7962,  0x7971,  0x7981,
+    0x7991,  0x79A1,  0x79B0,  0x79C0,
+    0x79CF,  0x79DF,  0x79EE,  0x79FD,
+    0x7A0D,  0x7A1C,  0x7A2B,  0x7A3A,
+    0x7A49,  0x7A57,  0x7A66,  0x7A75,
+    0x7A83,  0x7A92,  0x7AA0,  0x7AAF,
+    0x7ABD,  0x7ACB,  0x7AD9,  0x7AE7,
+    0x7AF5,  0x7B03,  0x7B11,  0x7B1F,
+    0x7B2D,  0x7B3A,  0x7B48,  0x7B55,
+    0x7B63,  0x7B70,  0x7B7D,  0x7B8B,
+    0x7B98,  0x7BA5,  0x7BB2,  0x7BBF,
+    0x7BCB,  0x7BD8,  0x7BE5,  0x7BF1,
+    0x7BFE,  0x7C0A,  0x7C17,  0x7C23,
+    0x7C2F,  0x7C3B,  0x7C47,  0x7C53,
+    0x7C5F,  0x7C6B,  0x7C77,  0x7C83,
+    0x7C8E,  0x7C9A,  0x7CA5,  0x7CB1,
+    0x7CBC,  0x7CC7,  0x7CD2,  0x7CDD,
+    0x7CE8,  0x7CF3,  0x7CFE,  0x7D09,
+    0x7D14,  0x7D1E,  0x7D29,  0x7D33,
+    0x7D3E,  0x7D48,  0x7D52,  0x7D5C,
+    0x7D67,  0x7D71,  0x7D7B,  0x7D84,
+    0x7D8E,  0x7D98,  0x7DA2,  0x7DAB,
+    0x7DB5,  0x7DBE,  0x7DC8,  0x7DD1,
+    0x7DDA,  0x7DE3,  0x7DEC,  0x7DF5,
+    0x7DFE,  0x7E07,  0x7E10,  0x7E18,
+    0x7E21,  0x7E29,  0x7E32,  0x7E3A,
+    0x7E42,  0x7E4B,  0x7E53,  0x7E5B,
+    0x7E63,  0x7E6B,  0x7E73,  0x7E7A,
+    0x7E82,  0x7E8A,  0x7E91,  0x7E99,
+    0x7EA0,  0x7EA7,  0x7EAF,  0x7EB6,
+    0x7EBD,  0x7EC4,  0x7ECB,  0x7ED2,
+    0x7ED8,  0x7EDF,  0x7EE6,  0x7EEC,
+    0x7EF3,  0x7EF9,  0x7EFF,  0x7F05,
+    0x7F0C,  0x7F12,  0x7F18,  0x7F1E,
+    0x7F23,  0x7F29,  0x7F2F,  0x7F35,
+    0x7F3A,  0x7F40,  0x7F45,  0x7F4A,
+    0x7F50,  0x7F55,  0x7F5A,  0x7F5F,
+    0x7F64,  0x7F69,  0x7F6D,  0x7F72,
+    0x7F77,  0x7F7B,  0x7F80,  0x7F84,
+    0x7F88,  0x7F8D,  0x7F91,  0x7F95,
+    0x7F99,  0x7F9D,  0x7FA1,  0x7FA4,
+    0x7FA8,  0x7FAC,  0x7FAF,  0x7FB3,
+    0x7FB6,  0x7FB9,  0x7FBD,  0x7FC0,
+    0x7FC3,  0x7FC6,  0x7FC9,  0x7FCC,
+    0x7FCE,  0x7FD1,  0x7FD4,  0x7FD6,
+    0x7FD9,  0x7FDB,  0x7FDD,  0x7FE0,
+    0x7FE2,  0x7FE4,  0x7FE6,  0x7FE8,
+    0x7FEA,  0x7FEB,  0x7FED,  0x7FEF,
+    0x7FF0,  0x7FF2,  0x7FF3,  0x7FF5,
+    0x7FF6,  0x7FF7,  0x7FF8,  0x7FF9,
+    0x7FFA,  0x7FFB,  0x7FFC,  0x7FFC,
+    0x7FFD,  0x7FFD,  0x7FFE,  0x7FFE,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF
+
+};
+
+
+const Int16 Short_Window_sine_fxp[SHORT_WINDOW] =
+{
+
+    0x00C9,  0x025B,  0x03ED,  0x057F,
+    0x0711,  0x08A2,  0x0A33,  0x0BC4,
+    0x0D54,  0x0EE3,  0x1072,  0x1201,
+    0x138F,  0x151C,  0x16A8,  0x1833,
+    0x19BE,  0x1B47,  0x1CCF,  0x1E57,
+    0x1FDD,  0x2161,  0x22E5,  0x2467,
+    0x25E8,  0x2767,  0x28E5,  0x2A61,
+    0x2BDC,  0x2D55,  0x2ECC,  0x3041,
+    0x31B5,  0x3326,  0x3496,  0x3604,
+    0x376F,  0x38D9,  0x3A40,  0x3BA5,
+    0x3D07,  0x3E68,  0x3FC5,  0x4121,
+    0x427A,  0x43D0,  0x4524,  0x4675,
+    0x47C3,  0x490F,  0x4A58,  0x4B9D,
+    0x4CE0,  0x4E20,  0x4F5D,  0x5097,
+    0x51CE,  0x5302,  0x5432,  0x5560,
+    0x568A,  0x57B0,  0x58D3,  0x59F3,
+    0x5B0F,  0x5C28,  0x5D3E,  0x5E4F,
+    0x5F5D,  0x6068,  0x616E,  0x6271,
+    0x6370,  0x646C,  0x6563,  0x6656,
+    0x6746,  0x6832,  0x6919,  0x69FD,
+    0x6ADC,  0x6BB7,  0x6C8E,  0x6D61,
+    0x6E30,  0x6EFB,  0x6FC1,  0x7083,
+    0x7140,  0x71F9,  0x72AE,  0x735E,
+    0x740A,  0x74B2,  0x7555,  0x75F3,
+    0x768D,  0x7722,  0x77B3,  0x783F,
+    0x78C7,  0x794A,  0x79C8,  0x7A41,
+    0x7AB6,  0x7B26,  0x7B91,  0x7BF8,
+    0x7C59,  0x7CB6,  0x7D0E,  0x7D62,
+    0x7DB0,  0x7DFA,  0x7E3E,  0x7E7E,
+    0x7EB9,  0x7EEF,  0x7F21,  0x7F4D,
+    0x7F74,  0x7F97,  0x7FB4,  0x7FCD,
+    0x7FE1,  0x7FF0,  0x7FF9,  0x7FFE
+};
+
+
+
+const Int16 Long_Window_KBD_fxp[LONG_WINDOW] =
+{
+
+    0x000A,  0x000E,  0x0012,  0x0015,
+    0x0019,  0x001C,  0x0020,  0x0023,
+    0x0026,  0x002A,  0x002D,  0x0030,
+    0x0034,  0x0038,  0x003B,  0x003F,
+    0x0043,  0x0047,  0x004B,  0x004F,
+    0x0053,  0x0057,  0x005B,  0x0060,
+    0x0064,  0x0069,  0x006D,  0x0072,
+    0x0077,  0x007C,  0x0081,  0x0086,
+    0x008B,  0x0091,  0x0096,  0x009C,
+    0x00A1,  0x00A7,  0x00AD,  0x00B3,
+    0x00B9,  0x00BF,  0x00C6,  0x00CC,
+    0x00D3,  0x00DA,  0x00E0,  0x00E7,
+    0x00EE,  0x00F5,  0x00FD,  0x0104,
+    0x010C,  0x0113,  0x011B,  0x0123,
+    0x012B,  0x0133,  0x013C,  0x0144,
+    0x014D,  0x0156,  0x015F,  0x0168,
+    0x0171,  0x017A,  0x0183,  0x018D,
+    0x0197,  0x01A1,  0x01AB,  0x01B5,
+    0x01BF,  0x01CA,  0x01D4,  0x01DF,
+    0x01EA,  0x01F5,  0x0200,  0x020C,
+    0x0217,  0x0223,  0x022F,  0x023B,
+    0x0247,  0x0253,  0x0260,  0x026D,
+    0x027A,  0x0287,  0x0294,  0x02A1,
+    0x02AF,  0x02BC,  0x02CA,  0x02D8,
+    0x02E7,  0x02F5,  0x0304,  0x0312,
+    0x0321,  0x0331,  0x0340,  0x034F,
+    0x035F,  0x036F,  0x037F,  0x038F,
+    0x03A0,  0x03B0,  0x03C1,  0x03D2,
+    0x03E3,  0x03F5,  0x0406,  0x0418,
+    0x042A,  0x043C,  0x044F,  0x0461,
+    0x0474,  0x0487,  0x049A,  0x04AE,
+    0x04C1,  0x04D5,  0x04E9,  0x04FD,
+    0x0512,  0x0526,  0x053B,  0x0550,
+    0x0566,  0x057B,  0x0591,  0x05A7,
+    0x05BD,  0x05D3,  0x05EA,  0x0601,
+    0x0618,  0x062F,  0x0646,  0x065E,
+    0x0676,  0x068E,  0x06A6,  0x06BF,
+    0x06D8,  0x06F1,  0x070A,  0x0723,
+    0x073D,  0x0757,  0x0771,  0x078C,
+    0x07A6,  0x07C1,  0x07DC,  0x07F7,
+    0x0813,  0x082F,  0x084B,  0x0867,
+    0x0884,  0x08A0,  0x08BD,  0x08DA,
+    0x08F8,  0x0916,  0x0933,  0x0952,
+    0x0970,  0x098F,  0x09AE,  0x09CD,
+    0x09EC,  0x0A0C,  0x0A2C,  0x0A4C,
+    0x0A6C,  0x0A8D,  0x0AAD,  0x0ACF,
+    0x0AF0,  0x0B11,  0x0B33,  0x0B55,
+    0x0B78,  0x0B9A,  0x0BBD,  0x0BE0,
+    0x0C03,  0x0C27,  0x0C4B,  0x0C6F,
+    0x0C93,  0x0CB8,  0x0CDD,  0x0D02,
+    0x0D27,  0x0D4D,  0x0D73,  0x0D99,
+    0x0DBF,  0x0DE6,  0x0E0C,  0x0E33,
+    0x0E5B,  0x0E82,  0x0EAA,  0x0ED2,
+    0x0EFB,  0x0F23,  0x0F4C,  0x0F75,
+    0x0F9F,  0x0FC8,  0x0FF2,  0x101C,
+    0x1047,  0x1071,  0x109C,  0x10C7,
+    0x10F3,  0x111E,  0x114A,  0x1176,
+    0x11A3,  0x11D0,  0x11FC,  0x122A,
+    0x1257,  0x1285,  0x12B3,  0x12E1,
+    0x130F,  0x133E,  0x136D,  0x139C,
+    0x13CB,  0x13FB,  0x142B,  0x145B,
+    0x148B,  0x14BC,  0x14ED,  0x151E,
+    0x1550,  0x1581,  0x15B3,  0x15E5,
+    0x1618,  0x164A,  0x167D,  0x16B0,
+    0x16E3,  0x1717,  0x174B,  0x177F,
+    0x17B3,  0x17E8,  0x181D,  0x1852,
+    0x1887,  0x18BC,  0x18F2,  0x1928,
+    0x195E,  0x1995,  0x19CB,  0x1A02,
+    0x1A39,  0x1A71,  0x1AA8,  0x1AE0,
+    0x1B18,  0x1B50,  0x1B89,  0x1BC1,
+    0x1BFA,  0x1C34,  0x1C6D,  0x1CA7,
+    0x1CE0,  0x1D1A,  0x1D55,  0x1D8F,
+    0x1DCA,  0x1E05,  0x1E40,  0x1E7B,
+    0x1EB7,  0x1EF2,  0x1F2E,  0x1F6B,
+    0x1FA7,  0x1FE4,  0x2020,  0x205D,
+    0x209B,  0x20D8,  0x2116,  0x2153,
+    0x2191,  0x21D0,  0x220E,  0x224D,
+    0x228B,  0x22CA,  0x2309,  0x2349,
+    0x2388,  0x23C8,  0x2408,  0x2448,
+    0x2488,  0x24C9,  0x2509,  0x254A,
+    0x258B,  0x25CC,  0x260E,  0x264F,
+    0x2691,  0x26D3,  0x2715,  0x2757,
+    0x2799,  0x27DC,  0x281F,  0x2861,
+    0x28A4,  0x28E8,  0x292B,  0x296E,
+    0x29B2,  0x29F6,  0x2A3A,  0x2A7E,
+    0x2AC2,  0x2B06,  0x2B4B,  0x2B8F,
+    0x2BD4,  0x2C19,  0x2C5E,  0x2CA3,
+    0x2CE9,  0x2D2E,  0x2D74,  0x2DB9,
+    0x2DFF,  0x2E45,  0x2E8B,  0x2ED1,
+    0x2F18,  0x2F5E,  0x2FA5,  0x2FEB,
+    0x3032,  0x3079,  0x30C0,  0x3107,
+    0x314E,  0x3195,  0x31DD,  0x3224,
+    0x326C,  0x32B4,  0x32FB,  0x3343,
+    0x338B,  0x33D3,  0x341B,  0x3463,
+    0x34AC,  0x34F4,  0x353D,  0x3585,
+    0x35CE,  0x3616,  0x365F,  0x36A8,
+    0x36F1,  0x373A,  0x3783,  0x37CC,
+    0x3815,  0x385E,  0x38A7,  0x38F0,
+    0x393A,  0x3983,  0x39CC,  0x3A16,
+    0x3A5F,  0x3AA9,  0x3AF2,  0x3B3C,
+    0x3B86,  0x3BCF,  0x3C19,  0x3C63,
+    0x3CAC,  0x3CF6,  0x3D40,  0x3D8A,
+    0x3DD3,  0x3E1D,  0x3E67,  0x3EB1,
+    0x3EFB,  0x3F45,  0x3F8E,  0x3FD8,
+    0x4022,  0x406C,  0x40B6,  0x4100,
+    0x414A,  0x4193,  0x41DD,  0x4227,
+    0x4271,  0x42BB,  0x4304,  0x434E,
+    0x4398,  0x43E1,  0x442B,  0x4475,
+    0x44BE,  0x4508,  0x4551,  0x459B,
+    0x45E4,  0x462E,  0x4677,  0x46C0,
+    0x4709,  0x4753,  0x479C,  0x47E5,
+    0x482E,  0x4877,  0x48C0,  0x4909,
+    0x4951,  0x499A,  0x49E3,  0x4A2B,
+    0x4A74,  0x4ABC,  0x4B04,  0x4B4D,
+    0x4B95,  0x4BDD,  0x4C25,  0x4C6D,
+    0x4CB5,  0x4CFC,  0x4D44,  0x4D8C,
+    0x4DD3,  0x4E1A,  0x4E62,  0x4EA9,
+    0x4EF0,  0x4F37,  0x4F7E,  0x4FC4,
+    0x500B,  0x5051,  0x5098,  0x50DE,
+    0x5124,  0x516A,  0x51B0,  0x51F6,
+    0x523B,  0x5281,  0x52C6,  0x530B,
+    0x5351,  0x5396,  0x53DA,  0x541F,
+    0x5464,  0x54A8,  0x54EC,  0x5530,
+    0x5574,  0x55B8,  0x55FC,  0x563F,
+    0x5683,  0x56C6,  0x5709,  0x574C,
+    0x578F,  0x57D1,  0x5814,  0x5856,
+    0x5898,  0x58DA,  0x591B,  0x595D,
+    0x599E,  0x59E0,  0x5A21,  0x5A61,
+    0x5AA2,  0x5AE3,  0x5B23,  0x5B63,
+    0x5BA3,  0x5BE3,  0x5C22,  0x5C62,
+    0x5CA1,  0x5CE0,  0x5D1F,  0x5D5D,
+    0x5D9C,  0x5DDA,  0x5E18,  0x5E56,
+    0x5E93,  0x5ED1,  0x5F0E,  0x5F4B,
+    0x5F87,  0x5FC4,  0x6000,  0x603D,
+    0x6079,  0x60B4,  0x60F0,  0x612B,
+    0x6166,  0x61A1,  0x61DC,  0x6216,
+    0x6250,  0x628A,  0x62C4,  0x62FE,
+    0x6337,  0x6370,  0x63A9,  0x63E2,
+    0x641A,  0x6452,  0x648A,  0x64C2,
+    0x64F9,  0x6531,  0x6568,  0x659E,
+    0x65D5,  0x660B,  0x6641,  0x6677,
+    0x66AD,  0x66E2,  0x6717,  0x674C,
+    0x6781,  0x67B5,  0x67E9,  0x681D,
+    0x6851,  0x6885,  0x68B8,  0x68EB,
+    0x691D,  0x6950,  0x6982,  0x69B4,
+    0x69E6,  0x6A17,  0x6A48,  0x6A79,
+    0x6AAA,  0x6ADB,  0x6B0B,  0x6B3B,
+    0x6B6A,  0x6B9A,  0x6BC9,  0x6BF8,
+    0x6C27,  0x6C55,  0x6C83,  0x6CB1,
+    0x6CDF,  0x6D0D,  0x6D3A,  0x6D67,
+    0x6D93,  0x6DC0,  0x6DEC,  0x6E18,
+    0x6E44,  0x6E6F,  0x6E9A,  0x6EC5,
+    0x6EF0,  0x6F1A,  0x6F44,  0x6F6E,
+    0x6F98,  0x6FC1,  0x6FEA,  0x7013,
+    0x703C,  0x7064,  0x708C,  0x70B4,
+    0x70DB,  0x7103,  0x712A,  0x7151,
+    0x7177,  0x719D,  0x71C3,  0x71E9,
+    0x720F,  0x7234,  0x7259,  0x727E,
+    0x72A2,  0x72C7,  0x72EB,  0x730E,
+    0x7332,  0x7355,  0x7378,  0x739B,
+    0x73BD,  0x73E0,  0x7402,  0x7424,
+    0x7445,  0x7466,  0x7487,  0x74A8,
+    0x74C9,  0x74E9,  0x7509,  0x7529,
+    0x7548,  0x7568,  0x7587,  0x75A5,
+    0x75C4,  0x75E2,  0x7601,  0x761E,
+    0x763C,  0x7659,  0x7676,  0x7693,
+    0x76B0,  0x76CC,  0x76E9,  0x7705,
+    0x7720,  0x773C,  0x7757,  0x7772,
+    0x778D,  0x77A8,  0x77C2,  0x77DC,
+    0x77F6,  0x780F,  0x7829,  0x7842,
+    0x785B,  0x7874,  0x788C,  0x78A5,
+    0x78BD,  0x78D5,  0x78EC,  0x7904,
+    0x791B,  0x7932,  0x7949,  0x795F,
+    0x7976,  0x798C,  0x79A2,  0x79B7,
+    0x79CD,  0x79E2,  0x79F7,  0x7A0C,
+    0x7A21,  0x7A35,  0x7A4A,  0x7A5E,
+    0x7A72,  0x7A85,  0x7A99,  0x7AAC,
+    0x7ABF,  0x7AD2,  0x7AE5,  0x7AF7,
+    0x7B09,  0x7B1B,  0x7B2D,  0x7B3F,
+    0x7B51,  0x7B62,  0x7B73,  0x7B84,
+    0x7B95,  0x7BA5,  0x7BB6,  0x7BC6,
+    0x7BD6,  0x7BE6,  0x7BF6,  0x7C05,
+    0x7C15,  0x7C24,  0x7C33,  0x7C42,
+    0x7C50,  0x7C5F,  0x7C6D,  0x7C7B,
+    0x7C89,  0x7C97,  0x7CA5,  0x7CB2,
+    0x7CC0,  0x7CCD,  0x7CDA,  0x7CE7,
+    0x7CF3,  0x7D00,  0x7D0C,  0x7D18,
+    0x7D25,  0x7D31,  0x7D3C,  0x7D48,
+    0x7D53,  0x7D5F,  0x7D6A,  0x7D75,
+    0x7D80,  0x7D8B,  0x7D95,  0x7DA0,
+    0x7DAA,  0x7DB4,  0x7DBE,  0x7DC8,
+    0x7DD2,  0x7DDC,  0x7DE5,  0x7DEF,
+    0x7DF8,  0x7E01,  0x7E0A,  0x7E13,
+    0x7E1C,  0x7E25,  0x7E2D,  0x7E36,
+    0x7E3E,  0x7E46,  0x7E4E,  0x7E56,
+    0x7E5E,  0x7E66,  0x7E6D,  0x7E75,
+    0x7E7C,  0x7E83,  0x7E8B,  0x7E92,
+    0x7E99,  0x7EA0,  0x7EA6,  0x7EAD,
+    0x7EB3,  0x7EBA,  0x7EC0,  0x7EC6,
+    0x7ECD,  0x7ED3,  0x7ED9,  0x7EDE,
+    0x7EE4,  0x7EEA,  0x7EF0,  0x7EF5,
+    0x7EFA,  0x7F00,  0x7F05,  0x7F0A,
+    0x7F0F,  0x7F14,  0x7F19,  0x7F1E,
+    0x7F23,  0x7F27,  0x7F2C,  0x7F30,
+    0x7F35,  0x7F39,  0x7F3D,  0x7F41,
+    0x7F46,  0x7F4A,  0x7F4E,  0x7F52,
+    0x7F55,  0x7F59,  0x7F5D,  0x7F60,
+    0x7F64,  0x7F68,  0x7F6B,  0x7F6E,
+    0x7F72,  0x7F75,  0x7F78,  0x7F7B,
+    0x7F7E,  0x7F81,  0x7F84,  0x7F87,
+    0x7F8A,  0x7F8D,  0x7F90,  0x7F92,
+    0x7F95,  0x7F97,  0x7F9A,  0x7F9C,
+    0x7F9F,  0x7FA1,  0x7FA4,  0x7FA6,
+    0x7FA8,  0x7FAA,  0x7FAC,  0x7FAE,
+    0x7FB1,  0x7FB3,  0x7FB5,  0x7FB6,
+    0x7FB8,  0x7FBA,  0x7FBC,  0x7FBE,
+    0x7FBF,  0x7FC1,  0x7FC3,  0x7FC4,
+    0x7FC6,  0x7FC8,  0x7FC9,  0x7FCB,
+    0x7FCC,  0x7FCD,  0x7FCF,  0x7FD0,
+    0x7FD1,  0x7FD3,  0x7FD4,  0x7FD5,
+    0x7FD6,  0x7FD8,  0x7FD9,  0x7FDA,
+    0x7FDB,  0x7FDC,  0x7FDD,  0x7FDE,
+    0x7FDF,  0x7FE0,  0x7FE1,  0x7FE2,
+    0x7FE3,  0x7FE4,  0x7FE4,  0x7FE5,
+    0x7FE6,  0x7FE7,  0x7FE8,  0x7FE8,
+    0x7FE9,  0x7FEA,  0x7FEA,  0x7FEB,
+    0x7FEC,  0x7FEC,  0x7FED,  0x7FEE,
+    0x7FEE,  0x7FEF,  0x7FEF,  0x7FF0,
+    0x7FF0,  0x7FF1,  0x7FF1,  0x7FF2,
+    0x7FF2,  0x7FF3,  0x7FF3,  0x7FF4,
+    0x7FF4,  0x7FF4,  0x7FF5,  0x7FF5,
+    0x7FF6,  0x7FF6,  0x7FF6,  0x7FF7,
+    0x7FF7,  0x7FF7,  0x7FF8,  0x7FF8,
+    0x7FF8,  0x7FF8,  0x7FF9,  0x7FF9,
+    0x7FF9,  0x7FF9,  0x7FFA,  0x7FFA,
+    0x7FFA,  0x7FFA,  0x7FFA,  0x7FFB,
+    0x7FFB,  0x7FFB,  0x7FFB,  0x7FFB,
+    0x7FFC,  0x7FFC,  0x7FFC,  0x7FFC,
+    0x7FFC,  0x7FFC,  0x7FFC,  0x7FFC,
+    0x7FFD,  0x7FFD,  0x7FFD,  0x7FFD,
+    0x7FFD,  0x7FFD,  0x7FFD,  0x7FFD,
+    0x7FFD,  0x7FFD,  0x7FFE,  0x7FFE,
+    0x7FFE,  0x7FFE,  0x7FFE,  0x7FFE,
+    0x7FFE,  0x7FFE,  0x7FFE,  0x7FFE,
+    0x7FFE,  0x7FFE,  0x7FFE,  0x7FFE,
+    0x7FFE,  0x7FFE,  0x7FFE,  0x7FFE,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF
+
+};
+
+
+
+
+const Int16 Short_Window_KBD_fxp[SHORT_WINDOW] =
+{
+
+    0x0001,  0x0004,  0x0008,  0x000D,
+    0x0014,  0x001D,  0x0029,  0x0039,
+    0x004C,  0x0063,  0x0080,  0x00A2,
+    0x00CB,  0x00FB,  0x0133,  0x0174,
+    0x01BE,  0x0214,  0x0275,  0x02E3,
+    0x035E,  0x03E8,  0x0481,  0x052B,
+    0x05E7,  0x06B4,  0x0795,  0x088A,
+    0x0993,  0x0AB2,  0x0BE7,  0x0D32,
+    0x0E94,  0x100E,  0x119F,  0x1347,
+    0x1507,  0x16DE,  0x18CC,  0x1AD0,
+    0x1CEB,  0x1F1A,  0x215F,  0x23B6,
+    0x2620,  0x289C,  0x2B27,  0x2DC0,
+    0x3066,  0x3317,  0x35D2,  0x3894,
+    0x3B5C,  0x3E28,  0x40F6,  0x43C4,
+    0x468F,  0x4956,  0x4C18,  0x4ED1,
+    0x5181,  0x5425,  0x56BC,  0x5944,
+    0x5BBB,  0x5E21,  0x6073,  0x62B1,
+    0x64DA,  0x66EC,  0x68E7,  0x6ACB,
+    0x6C96,  0x6E49,  0x6FE4,  0x7166,
+    0x72D0,  0x7421,  0x755B,  0x767E,
+    0x778A,  0x7881,  0x7962,  0x7A30,
+    0x7AEA,  0x7B92,  0x7C29,  0x7CB0,
+    0x7D28,  0x7D92,  0x7DF0,  0x7E42,
+    0x7E89,  0x7EC7,  0x7EFC,  0x7F2A,
+    0x7F50,  0x7F71,  0x7F8C,  0x7FA3,
+    0x7FB6,  0x7FC5,  0x7FD2,  0x7FDC,
+    0x7FE4,  0x7FEB,  0x7FF0,  0x7FF4,
+    0x7FF7,  0x7FF9,  0x7FFB,  0x7FFC,
+    0x7FFD,  0x7FFE,  0x7FFE,  0x7FFE,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF,
+    0x7FFF,  0x7FFF,  0x7FFF,  0x7FFF
+};
+
diff --git a/media/libstagefright/codecs/aacdec/write_output.h b/media/libstagefright/codecs/aacdec/write_output.h
new file mode 100644
index 0000000..0085a63
--- /dev/null
+++ b/media/libstagefright/codecs/aacdec/write_output.h
@@ -0,0 +1,138 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+
+ Pathname: write_output.h
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description: Change function prototype.
+
+ Description: Remove CR/LF from unknown editor
+
+ Who:                                       Date:
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ Header file for the declaration of the function write_output()
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef WRITE_OUTPUT_H
+#define WRITE_OUTPUT_H
+
+#include "pv_audio_type_defs.h"
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; INCLUDES
+    ----------------------------------------------------------------------------*/
+#include "pvmp4audiodecoder_api.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
+    ----------------------------------------------------------------------------*/
+
+#ifndef AAC_PLUS
+
+    Int write_output(
+        const Int16   sourceLeft[],
+        const Int16   sourceRight[],
+        Int16   outputBuffer[],
+        const Int     sourcePointsPerChannel,
+        const Int     sourceChannels,
+        const Int     requestedChannels,
+        const tPVMP4AudioDecoderOutputFormat  outputFormat);
+
+#else
+
+    Int write_output(
+        const Int16   sourceLeft[],
+        const Int16   sourceRight[],
+        Int16   outputBuffer[],
+        const Int     sourcePointsPerChannel,
+        const Int     sourceChannels,
+        const Int     requestedChannels,
+#ifdef PARAMETRICSTEREO
+        Int32 sbrEnablePS,
+#endif
+        const tPVMP4AudioDecoderOutputFormat  outputFormat);
+
+#ifdef AAC_32_BIT_INTERFACE
+
+    Int write_output_1(
+        const Int32   sourceLeft[],
+        const Int32   sourceRight[],
+        Int16   outputBuffer[],
+        const Int     sourcePointsPerChannel,
+        const Int     sourceChannels,
+        const Int     requestedChannels,
+        const tPVMP4AudioDecoderOutputFormat  outputFormat);
+#endif
+
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; END
+    ----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* WRITE_OUTPUT_H */
+
+
diff --git a/media/libstagefright/codecs/mp3dec/Android.mk b/media/libstagefright/codecs/mp3dec/Android.mk
new file mode 100644
index 0000000..d618b83
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/Android.mk
@@ -0,0 +1,59 @@
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+        MP3Decoder.cpp \
+	src/pvmp3_normalize.cpp \
+ 	src/pvmp3_alias_reduction.cpp \
+ 	src/pvmp3_crc.cpp \
+ 	src/pvmp3_decode_header.cpp \
+ 	src/pvmp3_decode_huff_cw.cpp \
+ 	src/pvmp3_getbits.cpp \
+ 	src/pvmp3_dequantize_sample.cpp \
+ 	src/pvmp3_framedecoder.cpp \
+ 	src/pvmp3_get_main_data_size.cpp \
+ 	src/pvmp3_get_side_info.cpp \
+ 	src/pvmp3_get_scale_factors.cpp \
+ 	src/pvmp3_mpeg2_get_scale_data.cpp \
+ 	src/pvmp3_mpeg2_get_scale_factors.cpp \
+ 	src/pvmp3_mpeg2_stereo_proc.cpp \
+ 	src/pvmp3_huffman_decoding.cpp \
+ 	src/pvmp3_huffman_parsing.cpp \
+ 	src/pvmp3_tables.cpp \
+ 	src/pvmp3_imdct_synth.cpp \
+ 	src/pvmp3_mdct_6.cpp \
+ 	src/pvmp3_dct_6.cpp \
+ 	src/pvmp3_poly_phase_synthesis.cpp \
+ 	src/pvmp3_equalizer.cpp \
+ 	src/pvmp3_seek_synch.cpp \
+ 	src/pvmp3_stereo_proc.cpp \
+ 	src/pvmp3_reorder.cpp \
+ 	src/pvmp3_polyphase_filter_window.cpp \
+ 	src/pvmp3_mdct_18.cpp \
+ 	src/pvmp3_dct_9.cpp \
+ 	src/pvmp3_dct_16.cpp
+
+ifeq ($(TARGET_ARCH),arm)
+LOCAL_SRC_FILES += \
+	src/asm/pvmp3_polyphase_filter_window_gcc.s \
+ 	src/asm/pvmp3_mdct_18_gcc.s \
+ 	src/asm/pvmp3_dct_9_gcc.s \
+	src/asm/pvmp3_dct_16_gcc.s
+endif
+
+LOCAL_C_INCLUDES := \
+        frameworks/base/media/libstagefright/include \
+        $(LOCAL_PATH)/src \
+        $(LOCAL_PATH)/include
+
+LOCAL_CFLAGS := \
+        -DOSCL_UNUSED_ARG=
+
+LOCAL_SHARED_LIBRARIES := \
+        libstagefright \
+        libutils
+
+LOCAL_MODULE := libstagefright_mp3dec
+
+include $(BUILD_STATIC_LIBRARY)
+
diff --git a/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
new file mode 100644
index 0000000..45e20dc
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/MP3Decoder.cpp
@@ -0,0 +1,165 @@
+#include "MP3Decoder.h"
+
+#include "include/pvmp3decoder_api.h"
+
+#include <media/stagefright/MediaBufferGroup.h>
+#include <media/stagefright/MediaDebug.h>
+#include <media/stagefright/MediaDefs.h>
+#include <media/stagefright/MetaData.h>
+
+namespace android {
+
+MP3Decoder::MP3Decoder(const sp<MediaSource> &source)
+    : mSource(source),
+      mStarted(false),
+      mBufferGroup(NULL),
+      mConfig(new tPVMP3DecoderExternal),
+      mDecoderBuf(NULL),
+      mAnchorTimeUs(0),
+      mNumSamplesOutput(0),
+      mInputBuffer(NULL) {
+}
+
+MP3Decoder::~MP3Decoder() {
+    if (mStarted) {
+        stop();
+    }
+
+    delete mConfig;
+    mConfig = NULL;
+}
+
+status_t MP3Decoder::start(MetaData *params) {
+    CHECK(!mStarted);
+
+    mBufferGroup = new MediaBufferGroup;
+    mBufferGroup->add_buffer(new MediaBuffer(4608 * 2));
+
+    mConfig->equalizerType = flat;
+    mConfig->crcEnabled = true;
+
+    uint32_t memRequirements = pvmp3_decoderMemRequirements();
+    mDecoderBuf = malloc(memRequirements);
+
+    pvmp3_InitDecoder(mConfig, mDecoderBuf);
+
+    mSource->start();
+
+    mAnchorTimeUs = 0;
+    mNumSamplesOutput = 0;
+    mStarted = true;
+
+    return OK;
+}
+
+status_t MP3Decoder::stop() {
+    CHECK(mStarted);
+
+    if (mInputBuffer) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    free(mDecoderBuf);
+    mDecoderBuf = NULL;
+
+    delete mBufferGroup;
+    mBufferGroup = NULL;
+
+    mSource->stop();
+
+    mStarted = false;
+
+    return OK;
+}
+
+sp<MetaData> MP3Decoder::getFormat() {
+    sp<MetaData> srcFormat = mSource->getFormat();
+
+    int32_t numChannels;
+    int32_t sampleRate;
+    CHECK(srcFormat->findInt32(kKeyChannelCount, &numChannels));
+    CHECK(srcFormat->findInt32(kKeySampleRate, &sampleRate));
+
+    sp<MetaData> meta = new MetaData;
+    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
+    meta->setInt32(kKeyChannelCount, numChannels);
+    meta->setInt32(kKeySampleRate, sampleRate);
+
+    return meta;
+}
+
+status_t MP3Decoder::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;
+        }
+    }
+
+    MediaBuffer *buffer;
+    CHECK_EQ(mBufferGroup->acquire_buffer(&buffer), OK);
+
+    mConfig->pInputBuffer =
+        (uint8_t *)mInputBuffer->data() + mInputBuffer->range_offset();
+
+    mConfig->inputBufferCurrentLength = mInputBuffer->range_length();
+    mConfig->inputBufferMaxLength = 0;
+    mConfig->inputBufferUsedLength = 0;
+
+    mConfig->outputFrameSize = buffer->size() / sizeof(int16_t);
+    mConfig->pOutputBuffer = static_cast<int16_t *>(buffer->data());
+
+    CHECK_EQ(pvmp3_framedecoder(mConfig, mDecoderBuf), NO_DECODING_ERROR);
+
+    buffer->set_range(
+            0, mConfig->outputFrameSize * sizeof(int16_t));
+
+    mInputBuffer->set_range(
+            mInputBuffer->range_offset() + mConfig->inputBufferUsedLength,
+            mInputBuffer->range_length() - mConfig->inputBufferUsedLength);
+
+    if (mInputBuffer->range_length() == 0) {
+        mInputBuffer->release();
+        mInputBuffer = NULL;
+    }
+
+    buffer->meta_data()->setInt64(
+            kKeyTime,
+            mAnchorTimeUs
+                + (mNumSamplesOutput * 1000000) / mConfig->samplingRate);
+
+    mNumSamplesOutput += mConfig->outputFrameSize / sizeof(int16_t);
+
+    *out = buffer;
+
+    return OK;
+}
+
+}  // namespace android
diff --git a/media/libstagefright/codecs/mp3dec/include/mp3_decoder_selection.h b/media/libstagefright/codecs/mp3dec/include/mp3_decoder_selection.h
new file mode 100644
index 0000000..e287433
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/include/mp3_decoder_selection.h
@@ -0,0 +1,30 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*! \file   mp3_decoder_selection.h
+ *  \brief  select mp3 decoder
+ *
+ */
+
+#ifndef MP3_DECODER_SELECTION_H
+#define MP3_DECODER_SELECTION_H
+
+
+#define NEW_PV_MP3_DECODER 1  //  1 == PV mp3 decoder
+
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/include/pvmp3_audio_type_defs.h b/media/libstagefright/codecs/mp3dec/include/pvmp3_audio_type_defs.h
new file mode 100644
index 0000000..2d94384
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/include/pvmp3_audio_type_defs.h
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_audio_type_defs.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ 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 PVMP3_AUDIO_TYPE_DEFS_H
+#define PVMP3_AUDIO_TYPE_DEFS_H
+
+#include <stdint.h>
+
+typedef int8_t int8;
+typedef uint8_t uint8;
+typedef int16_t int16;
+typedef uint16_t uint16;
+typedef int32_t int32;
+typedef uint32_t uint32;
+typedef int64_t int64;
+typedef uint64_t uint64;
+
+typedef int32_t Int32;
+
+#endif  /* PVMP3_AUDIO_TYPE_DEFS_H */
diff --git a/media/libstagefright/codecs/mp3dec/include/pvmp3decoder_api.h b/media/libstagefright/codecs/mp3dec/include/pvmp3decoder_api.h
new file mode 100644
index 0000000..1568e7c
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/include/pvmp3decoder_api.h
@@ -0,0 +1,259 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3decoder_api.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure tPVMP3DecoderExternal
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3DECODER_API_H
+#define PVMP3DECODER_API_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3_dec_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; 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
+    ----------------------------------------------------------------------------*/
+    typedef enum
+    {
+        flat       = 0,
+        bass_boost = 1,
+        rock       = 2,
+        pop        = 3,
+        jazz       = 4,
+        classical  = 5,
+        talk       = 6,
+        flat_      = 7
+
+    } e_equalization;
+
+
+
+    typedef enum ERROR_CODE
+    {
+        NO_DECODING_ERROR         = 0,
+        UNSUPPORTED_LAYER         = 1,
+        UNSUPPORTED_FREE_BITRATE  = 2,
+        FILE_OPEN_ERROR           = 3,          /* error opening file */
+        CHANNEL_CONFIG_ERROR      = 4,     /* error in channel configuration */
+        SYNTHESIS_WINDOW_ERROR    = 5,   /* error in synthesis window table */
+        READ_FILE_ERROR           = 6,          /* error reading input file */
+        SIDE_INFO_ERROR           = 7,          /* error in side info */
+        HUFFMAN_TABLE_ERROR       = 8,      /* error in Huffman table */
+        COMMAND_LINE_ERROR        = 9,       /* error in command line */
+        MEMORY_ALLOCATION_ERROR   = 10,   /* error allocating memory */
+        NO_ENOUGH_MAIN_DATA_ERROR = 11,
+        SYNCH_LOST_ERROR          = 12,
+        OUTPUT_BUFFER_TOO_SMALL   = 13     /* output buffer can't hold output */
+    } ERROR_CODE;
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    typedef struct
+#ifdef __cplusplus
+                tPVMP3DecoderExternal
+#endif
+    {
+
+        /*
+         * 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.
+         * The calling environment can change what is pointed to between calls to
+         * the decode function, library, as long as the inputBufferCurrentLength,
+         * and inputBufferUsedLength are updated too. Also, any remaining bits in
+         * the old buffer must be put at the beginning of the new buffer.
+         */
+        uint8      *pInputBuffer;
+
+        /*
+         * INPUT:
+         * Number of valid bytes in the input buffer, set by the calling
+         * function. After decoding the bitstream the library checks to
+         * see if it when past this value; it would be to prohibitive to
+         * check after every read operation. This value is not modified by
+         * the MP3 library.
+         */
+        int32     inputBufferCurrentLength;
+
+        /*
+         * INPUT/OUTPUT:
+         * Number of elements used by the library, initially set to zero by
+         * the function pvmp3_resetDecoder(), and modified by each
+         * call to pvmp3_framedecoder().
+         */
+        int32     inputBufferUsedLength;
+
+        /*
+         * OUTPUT:
+         * holds the predicted frame size. It used on the test console, for parsing
+         * purposes.
+         */
+        uint32     CurrentFrameLength;
+
+        /*
+         * INPUT:
+         * This variable holds the type of equalization used
+         *
+         *
+         */
+        e_equalization     equalizerType;
+
+
+        /*
+         * INPUT:
+         * The actual size of the buffer.
+         * This variable is not used by the library, but is used by the
+         * console test application. This parameter could be deleted
+         * if this value was passed into these function.
+         */
+        int32     inputBufferMaxLength;
+
+        /*
+         * OUTPUT:
+         * The number of channels decoded from the bitstream.
+         */
+        int16       num_channels;
+
+        /*
+         * OUTPUT:
+         * The number of channels decoded from the bitstream.
+         */
+        int16       version;
+
+        /*
+         * OUTPUT:
+         * The sampling rate decoded from the bitstream, in units of
+         * samples/second.
+         */
+        int32       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       bitRate;
+
+        /*
+         * INPUT/OUTPUT:
+         * In: Inform decoder how much more room is available in the output buffer in int16 samples
+         * Out: Size of the output frame in 16-bit words, This value depends on the mp3 version
+         */
+        int32     outputFrameSize;
+
+        /*
+         * INPUT:
+         * Flag to enable/disable crc error checking
+         */
+        int32     crcEnabled;
+
+        /*
+         * OUTPUT:
+         * This value is used to accumulate bit processed and compute an estimate of the
+         * bitrate. For debugging purposes only, as it will overflow for very long clips
+         */
+        uint32     totalNumberOfBitsUsed;
+
+
+        /*
+         * INPUT: (but what is pointed to is an output)
+         * Pointer to the output buffer to hold the 16-bit PCM audio samples.
+         * If the output is stereo, both left and right channels will be stored
+         * in this one buffer.
+         */
+
+        int16       *pOutputBuffer;
+
+    } tPVMP3DecoderExternal;
+
+uint32 pvmp3_decoderMemRequirements(void);
+
+void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt,
+                       void  *pMem);
+
+void pvmp3_resetDecoder(void  *pMem);
+
+ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt,
+                              void              *pMem);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/patent_disclaimer.txt b/media/libstagefright/codecs/mp3dec/patent_disclaimer.txt
new file mode 100644
index 0000000..b4bf11d
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/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/mp3dec/src/asm/pvmp3_dct_16_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s
new file mode 100644
index 0000000..f83732b
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s
@@ -0,0 +1,474 @@
+@ ------------------------------------------------------------------
+@ Copyright (C) 1998-2009 PacketVideo
+@
+@ Licensed under the Apache License, Version 2.0 (the "License");
+@ you may not use this file except in compliance with the License.
+@ You may obtain a copy of the License at
+@
+@      http://www.apache.org/licenses/LICENSE-2.0
+@
+@ Unless required by applicable law or agreed to in writing, software
+@ distributed under the License is distributed on an "AS IS" BASIS,
+@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+@ express or implied.
+@ See the License for the specific language governing permissions
+@ and limitations under the License.
+@ -------------------------------------------------------------------
+
+@
+@
+@   Filename: pvmp3_dct_16_gcc.s
+@
+@
+@------------------------------------------------------------------------------
+@ REVISION HISTORY
+@
+@
+@ Who:                                   Date: MM/DD/YYYY
+@ Description: 
+@
+@------------------------------------------------------------------------------
+
+.arm
+
+.align 4
+
+.text
+
+.extern  pvmp3_dct_16
+.extern  pvmp3_merge_in_place_N32
+.extern  pvmp3_split
+
+
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_dct_16
+
+pvmp3_dct_16:
+        stmfd    sp!,{r0,r1,r4-r11,lr}
+        ldr      r1,[r0]
+        ldr      r3,[r0,#0x3c]
+        ldr      r12,constant1
+        sub      r2,r1,r3
+        smull    lr,r2,r12,r2
+        sub      sp,sp,#0x1c
+        str      r2,[sp,#0x14]
+        ldr      r2,[r0,#0x1c]
+        ldr      r12,[r0,#0x20]
+        add      r1,r1,r3
+        sub      r3,r2,r12
+        ldr      lr,constant2
+        mov      r3,r3,lsl #3
+        smull    r4,r3,lr,r3
+        ldr      r6,constant5
+        str      r3,[sp]
+        add      r3,r2,r12
+        sub      r2,r1,r3
+        ldr      r12,constant3
+        add      r3,r1,r3
+        smull    lr,r2,r12,r2
+        ldr      r12,[r0,#0x38]
+        ldr      r1,[r0,#4]
+        ldr      lr,constant4
+        sub      r4,r1,r12
+        add      r1,r1,r12
+        ldr      r12,[r0,#0x18]
+        smull    r4,r5,lr,r4
+        ldr      lr,[r0,#0x24]
+        ldr      r10,constant10
+        sub      r4,r12,lr
+        mov      r4,r4,lsl #1
+        smull    r7,r4,r6,r4
+        add      r12,r12,lr
+        add      r7,r1,r12
+        sub      r12,r1,r12
+        ldr      r1,constant6
+        str      r4,[sp,#4]
+        smull    r12,r4,r1,r12
+        ldr      r1,[r0,#8]
+        ldr      r12,[r0,#0x34]
+        ldr      r6,constant7
+        sub      lr,r1,r12
+        smull    r8,lr,r6,lr
+        add      r1,r1,r12
+        str      lr,[sp,#0x10]
+        ldr      r12,[r0,#0x14]
+        ldr      lr,[r0,#0x28]
+        ldr      r8,constant8
+        sub      r6,r12,lr
+        mov      r6,r6,lsl #1
+        smull    r9,r6,r8,r6
+        add      r12,r12,lr
+        ldr      r9,constant9
+        add      r8,r1,r12
+        sub      r12,r1,r12
+        smull    r12,lr,r9,r12
+        ldr      r12,[r0,#0x30]
+        ldr      r1,[r0,#0xc]
+        sub      r9,r1,r12
+        smull    r11,r9,r10,r9
+        add      r12,r1,r12
+        str      r9,[sp,#0xc]
+        ldr      r9,[r0,#0x10]
+        ldr      r10,constant11
+        str      r9,[sp,#0x18]
+        ldr      r1,[r0,#0x2c]
+        sub      r9,r9,r1
+        smull    r11,r9,r10,r9
+        ldr      r10,constant12
+        str      r9,[sp,#8]
+        ldr      r9,[sp,#0x18]
+        ldr      r11,constant14
+        add      r9,r9,r1
+        add      r1,r12,r9
+        sub      r12,r12,r9
+        mov      r12,r12,lsl #2
+        smull    r9,r12,r10,r12
+        ldr      r10,constant13
+        add      r9,r3,r1
+        sub      r1,r3,r1
+        smull    r1,r3,r10,r1
+        sub      r1,r7,r8
+        mov      r1,r1,lsl #1
+        smull    r1,r10,r11,r1
+        add      r1,r7,r8
+        add      r8,r9,r1
+        sub      r7,r9,r1
+        mov      r8,r8,asr #1
+        ldr      r1,constant15
+        str      r8,[r0]
+        smull    r7,r8,r1,r7
+        sub      r7,r3,r10
+        str      r8,[r0,#0x20]
+        mov      r7,r7,lsl #1
+        smull    r8,r7,r1,r7
+        add      r3,r3,r10
+        add      r3,r3,r7
+        str      r3,[r0,#0x10]
+        sub      r3,r2,r12
+        str      r7,[r0,#0x30]
+        add      r2,r2,r12
+        ldr      r7,constant13
+        sub      r12,r4,lr
+        mov      r3,r3,lsl #1
+        smull    r8,r3,r7,r3
+        add      lr,r4,lr
+        sub      r4,r2,lr
+        mov      r12,r12,lsl #2
+        smull    r7,r12,r11,r12
+        add      lr,lr,r2
+        sub      r2,r3,r12
+        mov      r2,r2,lsl #1
+        smull    r7,r2,r1,r2
+        mov      r4,r4,lsl #1
+        add      r12,r12,r2
+        add      r3,r12,r3
+        smull    r7,r4,r1,r4
+        add      r12,r3,lr
+        add      r3,r3,r4
+        str      r3,[r0,#0x18]
+        add      r3,r2,r4
+        str      r2,[r0,#0x38]
+        str      r3,[r0,#0x28]
+        str      r12,[r0,#8]
+        ldr      r2,[sp,#0x14]
+        ldr      r3,[sp,#0]
+        ldr      lr,[sp,#4]
+        sub      r2,r2,r3
+        ldr      r3,constant3
+        mov      r2,r2,lsl #1
+        smull    r12,r2,r3,r2
+        ldr      r3,[sp,#0x14]
+        ldr      r12,[sp,#0]
+        ldr      r4,constant6
+        add      r12,r3,r12
+        ldr      r3,[sp,#4]
+        sub      lr,r5,lr
+        mov      lr,lr,lsl #1
+        add      r3,r5,r3
+        smull    r5,lr,r4,lr
+        ldr      r4,[sp,#0x10]
+        ldr      r5,[sp,#0x10]
+        add      r4,r4,r6
+        sub      r5,r5,r6
+        ldr      r6,constant9
+        mov      r5,r5,lsl #1
+        smull    r7,r5,r6,r5
+        ldr      r6,[sp,#8]
+        ldr      r9,[sp,#0xc]
+        ldr      r10,constant12
+        sub      r6,r9,r6
+        mov      r6,r6,lsl #3
+        smull    r7,r6,r10,r6
+        ldr      r8,[sp,#0x20]
+        ldr      r7,[sp,#8]
+        cmp      r8,#0
+        add      r7,r9,r7
+
+        bne      no_flag_proc
+        rsb      r12,r12,#0
+        rsb      r2,r2,#0
+        rsb      r3,r3,#0
+        rsb      lr,lr,#0
+        rsb      r4,r4,#0
+        rsb      r5,r5,#0
+        rsb      r7,r7,#0
+        rsb      r6,r6,#0
+no_flag_proc:
+
+        sub      r8,r2,r6
+        add      r2,r6,r2
+        sub      r6,r12,r7
+        ldr      r9,constant13
+        add      r12,r12,r7
+        sub      r7,r3,r4
+        mov      r6,r6,lsl #1
+        mov      r8,r8,lsl #1
+        smull    r10,r8,r9,r8
+        add      r3,r3,r4
+        smull    r10,r6,r9,r6
+        sub      r4,lr,r5
+        mov      r7,r7,lsl #2
+        smull    r9,r7,r11,r7
+        add      lr,lr,r5
+        sub      r5,r6,r7
+        add      r6,r6,r7
+        sub      r7,r12,r3
+        add      r3,r12,r3
+        sub      r12,r2,lr
+        mov      r4,r4,lsl #2
+        smull    r9,r4,r11,r4
+        add      lr,r2,lr
+        sub      r2,r8,r4
+        mov      r2,r2,lsl #1
+        mov      r5,r5,lsl #1
+        mov      r12,r12,lsl #1
+        mov      r7,r7,lsl #1
+        smull    r9,r5,r1,r5
+        smull    r9,r2,r1,r2
+        add      r6,r6,r5
+        smull    r9,r7,r1,r7
+        smull    r9,r12,r1,r12
+        add      r1,r4,r2
+        add      r1,r1,r8
+        add      lr,lr,r1
+        add      r3,r3,lr
+        str      r3,[r0,#4]
+        add      r3,r6,lr
+        str      r3,[r0,#0xc]
+        add      r1,r1,r12
+        add      r3,r6,r1
+        add      r1,r7,r1
+        str      r1,[r0,#0x1c]
+        str      r3,[r0,#0x14]
+        add      r1,r12,r2
+        add      r3,r7,r1
+        add      r1,r5,r1
+        str      r1,[r0,#0x2c]
+        str      r3,[r0,#0x24]!
+        add      r1,r5,r2
+        str      r1,[r0,#0x10]
+        str      r2,[r0,#0x18]
+        add      sp,sp,#0x24
+        ldmfd    sp!,{r4-r11,pc}
+
+
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_merge_in_place_N32
+
+
+
+pvmp3_merge_in_place_N32:
+        stmfd    sp!,{r4,lr}
+        ldr      r1,[r0,#0x1c]
+        ldr      r2,[r0,#0x38]
+        str      r1,[r0,#0x38]
+        ldr      r1,[r0,#0x18]
+        ldr      r3,[r0,#0x30]
+        str      r1,[r0,#0x30]
+        ldr      r12,[r0,#0x14]
+        ldr      r1,[r0,#0x28]
+        str      r12,[r0,#0x28]
+        ldr      r12,[r0,#0x10]
+        ldr      lr,[r0,#0x20]
+        str      r12,[r0,#0x20]
+        ldr      r12,[r0,#0xc]
+        str      r12,[r0,#0x18]
+        ldr      r12,[r0,#8]
+        str      r12,[r0,#0x10]
+        ldr      r12,[r0,#4]
+        str      r12,[r0,#8]
+        ldr      r4,[r0,#0x40]
+        ldr      r12,[r0,#0x44]
+        add      r4,r4,r12
+        str      r4,[r0,#4]
+        str      lr,[r0,#0x40]
+        ldr      lr,[r0,#0x48]
+        add      r12,lr,r12
+        str      r12,[r0,#0xc]
+        ldr      r12,[r0,#0x4c]
+        add      lr,r12,lr
+        str      lr,[r0,#0x14]
+        ldr      lr,[r0,#0x24]
+        str      lr,[r0,#0x48]
+        ldr      lr,[r0,#0x50]
+        add      r12,lr,r12
+        str      r12,[r0,#0x1c]
+        ldr      r12,[r0,#0x54]
+        str      r1,[r0,#0x50]
+        add      lr,r12,lr
+        str      lr,[r0,#0x24]
+        ldr      r1,[r0,#0x58]
+        ldr      r4,[r0,#0x2c]
+        ldr      lr,[r0,#0x34]
+        add      r12,r1,r12
+        str      r12,[r0,#0x2c]
+        ldr      r12,[r0,#0x5c]
+        add      r1,r12,r1
+        str      r1,[r0,#0x34]
+        str      r4,[r0,#0x58]
+        ldr      r1,[r0,#0x60]
+        ldr      r4,[r0,#0x3c]
+        add      r12,r1,r12
+        str      r12,[r0,#0x3c]
+        ldr      r12,[r0,#0x64]
+        add      r1,r12,r1
+        str      r1,[r0,#0x44]
+        ldr      r1,[r0,#0x68]
+        add      r12,r1,r12
+        str      r12,[r0,#0x4c]
+        ldr      r12,[r0,#0x6c]
+        add      r1,r12,r1
+        str      r1,[r0,#0x54]
+        ldr      r1,[r0,#0x70]
+        str      r3,[r0,#0x60]
+        add      r12,r1,r12
+        str      r12,[r0,#0x5c]
+        ldr      r3,[r0,#0x74]
+        add      r1,r3,r1
+        str      r1,[r0,#0x64]
+        str      lr,[r0,#0x68]
+        ldr      r1,[r0,#0x78]
+        str      r2,[r0,#0x70]
+        add      r3,r1,r3
+        str      r3,[r0,#0x6c]
+        ldr      r2,[r0,#0x7c]
+        add      r1,r1,r2
+        str      r1,[r0,#0x74]
+        str      r4,[r0,#0x78]
+        ldmfd    sp!,{r4,pc}
+
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_split
+
+
+pvmp3_split:
+        stmfd    sp!,{r4,r5,lr}
+        ldr      r2,constant16
+        sub      r1,r0,#4
+        mov      r3,#3
+loop1:
+        ldr      r12,[r0]
+        ldr      lr,[r1]
+        ldr      r4,[r2],#-4
+        add      r5,lr,r12
+        sub      r12,lr,r12
+        smull    r12,lr,r4,r12
+        str      r5,[r1],#-4
+        mov      r12,r12,lsr #27
+        add      r12,r12,lr,lsl #5
+        str      r12,[r0],#4
+        ldr      r12,[r0]
+        ldr      lr,[r1]
+        ldr      r4,[r2],#-4
+        add      r5,lr,r12
+        sub      r12,lr,r12
+        smull    r12,lr,r4,r12
+        str      r5,[r1],#-4
+        mov      r12,r12,lsr #27
+        add      r12,r12,lr,lsl #5
+        str      r12,[r0],#4
+        subs     r3,r3,#1
+        bne      loop1
+        mov      r3,#5
+loop2:
+        ldr      r12,[r0]
+        ldr      lr,[r1]
+        ldr      r4,[r2],#-4
+        add      r5,lr,r12
+        sub      r12,lr,r12
+        mov      r12,r12,lsl #1
+        smull    lr,r12,r4,r12
+        str      r5,[r1],#-4
+        str      r12,[r0],#4
+        ldr      r12,[r0]
+        ldr      lr,[r1]
+        ldr      r4,[r2],#-4
+        add      r5,lr,r12
+        sub      r12,lr,r12
+        mov      r12,r12,lsl #1
+        smull    lr,r12,r4,r12
+        str      r5,[r1],#-4
+        str      r12,[r0],#4
+        subs     r3,r3,#1
+        bne      loop2
+        ldmfd    sp!,{r4,r5,pc}
+constant1:
+        .word      0x404f4680
+constant2:
+        .word      0x519e4e00
+constant3:
+        .word      0x4140fb80
+constant4:
+        .word      0x42e13c00
+constant5:
+        .word      0x6e3c9300
+constant6:
+        .word      0x4cf8de80
+constant7:
+        .word      0x48919f80
+constant8:
+        .word      0x43e22480
+constant9:
+        .word      0x73326b80
+constant10:
+        .word      0x52cb0e80
+constant11:
+        .word      0x64e24000
+constant12:
+        .word      0x52036780
+constant13:
+        .word      0x4545ea00
+constant14:
+        .word      0x539eba80
+constant15:
+        .word      0x5a827980
+constant16:
+        .word      CosTable_dct32 + 60
+
+
+
+CosTable_dct32:
+        .word      0x4013c280
+        .word      0x40b34580
+        .word      0x41fa2d80
+        .word      0x43f93400
+        .word      0x46cc1c00
+        .word      0x4a9d9d00
+        .word      0x4fae3700
+        .word      0x56601e80
+        .word      0x5f4cf700
+        .word      0x6b6fcf00
+        .word      0x07c7d1d8
+        .word      0x095b0350
+        .word      0x0bdf91b0
+        .word      0x107655e0
+        .word      0x1b42c840
+        .word      0x51852300
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_arm.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_arm.s
new file mode 100644
index 0000000..3a6dd4f
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_arm.s
@@ -0,0 +1,210 @@
+; ------------------------------------------------------------------
+; Copyright (C) 1998-2009 PacketVideo
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+; express or implied.
+; See the License for the specific language governing permissions
+; and limitations under the License.
+; -------------------------------------------------------------------
+
+;
+;
+;   Filename: pvmp3_dct_9.s
+;
+;------------------------------------------------------------------------------
+; REVISION HISTORY
+;
+;
+; Who:                                   Date: MM/DD/YYYY
+; Description: 
+;
+;------------------------------------------------------------------------------
+
+  AREA  |.drectve|, DRECTVE
+
+    DCB "-defaultlib:coredll.lib "
+    DCB "-defaultlib:corelibc.lib "
+
+  IMPORT pvmp3_mdct_18 ; pvmp3_mdct_18.cpp
+
+;------------------------------------------------------------------------------
+
+  AREA  |.rdata|, DATA, READONLY
+  % 4
+
+
+;------------------------------------------------------------------------------
+
+  AREA  |.text|, CODE, READONLY
+
+
+;------------------------------------------------------------------------------
+
+ EXPORT |pvmp3_dct_9|
+
+|pvmp3_dct_9| PROC
+        stmfd    sp!,{r4-r10,lr}
+        ldr      r2, [r0, #0x20]
+        ldr      r3, [r0]
+        ldr      r12,[r0, #4]
+        add      r1,r2,r3
+        sub      lr,r2,r3
+        ldr      r3,[r0, #0x1c]
+        ldr      r4,[r0, #0x18]
+        add      r2,r3,r12
+        ldr      r5,[r0,#8]
+        sub      r3,r3,r12
+        add      r12,r4,r5
+        sub      r4,r4,r5
+        ldr      r5,[r0, #0x14]
+        ldr      r7,[r0, #0xc]
+        ldr      r9,[r0, #0x10]
+        add      r6,r5,r7
+        sub      r5,r5,r7
+        add      r7,r1,r12
+        add      r8,r9,r2
+        add      r7,r7,r6
+        add      r10,r7,r8
+        rsb      r7,r8,r7,asr #1
+        str      r7,[r0, #0x18]
+        rsb      r2,r9,r2,asr #1
+        str      r10,[r0]
+        ldr      r11,|cos_2pi_9|
+        rsb      r7,r2,#0
+
+        mov      r9,r1,lsl #1
+		mov      r1,r9			;;;;;;  !!!!!!
+        mov      r8,r7
+
+;    vec[4]  = fxp_mac32_Q32( vec[4], tmp0<<1, cos_2pi_9); 
+
+        smlal    r1,r8,r11,r9
+        ldr      r10,|cos_4pi_9|
+        ldr      r11,|cos_pi_9|
+
+;    vec[8]  = fxp_mac32_Q32( vec[8], tmp0<<1, cos_4pi_9);
+
+        smlal    r1,r7,r10,r9
+
+
+
+;    vec[2]  = fxp_mac32_Q32( vec[2], tmp0<<1, cos_pi_9);
+
+        smlal    r9,r2,r11,r9
+        mov      r1,r12,lsl #1
+        rsb      r9,r10,#0
+        ldr      r11,|cos_5pi_9|
+
+        smlal    r12,r2,r9,r1
+
+
+
+;    vec[2]  = fxp_mac32_Q32( vec[2], tmp2<<1, cos_5pi_9);
+
+        ldr      r9,|cos_2pi_9|
+        mov      r12,r1			;;;;;;  !!!!!!
+        smlal    r12,r8,r11,r1
+
+
+;    vec[8]  = fxp_mac32_Q32( vec[8], tmp2<<1, cos_2pi_9);
+
+        smlal    r1,r7,r9,r1
+        mov      r1,r6,lsl #1
+        smlal    r12,r7,r11,r1
+        and      r6,r10,r11,asr #14
+        smlal    r12,r8,r6,r1
+        ldr      r10,|cos_11pi_18|
+        add      r12,r11,r6
+        smlal    r1,r2,r12,r1
+        ldr      r9,|cos_8pi_9|
+        str      r2,[r0,#8]
+        mov      r1,r5,lsl #1
+
+;    vec[8]  = fxp_mac32_Q32( vec[8], tmp3<<1, cos_8pi_9);
+
+        smull    r2,r6,r9,r1
+        str      r7,[r0,#0x20]
+        mov      r2,r4,lsl #1
+        ldr      r7,|cos_13pi_18|
+        smlal    r12,r6,r10,r2
+
+        mov      r3,r3,lsl #1
+
+;    vec[5]  = fxp_mac32_Q32( vec[5], tmp8<<1, cos_13pi_18);
+
+        smlal    r12,r6,r7,r3
+        add      r4,r5,r4
+        mov      r12,lr,lsl #1
+        sub      lr,r4,lr
+        ldr      r7,|cos_17pi_18|
+        str      r8,[r0, #0x10]
+        ldr      r4,|cos_pi_6|
+
+        mov      lr,lr,lsl #1
+
+;    vec[1]  = fxp_mac32_Q32( vec[1], tmp8<<1, cos_17pi_18);
+
+        smlal    r8,r6,r7,r12
+
+;    vec[3]  = fxp_mul32_Q32((tmp5 + tmp6  - tmp8)<<1, cos_pi_6);
+
+        smull    r5,lr,r4,lr
+        str      r6,[r0, #4]
+        str      lr,[r0, #0xc]
+
+
+;    vec[5]  = fxp_mul32_Q32(tmp5<<1, cos_17pi_18);
+        smull    r5,lr,r7,r1
+        rsb      r6,r9,#0
+;    vec[5]  = fxp_mac32_Q32( vec[5], tmp6<<1,  cos_7pi_18);
+        smlal    r5,lr,r6,r2
+;    vec[5]  = fxp_mac32_Q32( vec[5], tmp7<<1,    cos_pi_6);
+        smlal    r5,lr,r4,r3
+;    vec[5]  = fxp_mac32_Q32( vec[5], tmp8<<1, cos_13pi_18);
+        smlal    r5,lr,r10,r12
+        str      lr,[r0, #0x14]
+        rsb      lr,r10,#0
+
+;    vec[7]  = fxp_mul32_Q32(tmp5<<1, cos_5pi_18);
+        smull    r5,r1,lr,r1
+;    vec[7]  = fxp_mac32_Q32( vec[7], tmp6<<1, cos_17pi_18);
+        smlal    r2,r1,r7,r2
+;    vec[7]  = fxp_mac32_Q32( vec[7], tmp7<<1,    cos_pi_6);
+        smlal    r3,r1,r4,r3
+;    vec[7]  = fxp_mac32_Q32( vec[7], tmp8<<1, cos_11pi_18);
+        smlal    r12,r1,r9,r12
+        str      r1,[r0, #0x1c]
+        ldmfd    sp!,{r4-r10,pc}
+|cos_2pi_9|
+        DCD      0x620dbe80
+|cos_4pi_9|
+        DCD      0x163a1a80
+|cos_pi_9|
+        DCD      0x7847d900
+|cos_5pi_9|
+        DCD      0x87b82700
+|cos_8pi_9|
+        DCD      0xd438af00
+|cos_11pi_18|
+        DCD      0xadb92280
+|cos_13pi_18|
+        DCD      0x91261480
+|cos_17pi_18|
+        DCD      0x81f1d200
+|cos_pi_6|
+        DCD      0x6ed9eb80
+        ENDP
+
+
+
+
+
+        END
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_gcc.s
new file mode 100644
index 0000000..618c50e2
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_9_gcc.s
@@ -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.
+@ -------------------------------------------------------------------
+
+@
+@
+@   Filename: pvmp3_dct_9_gcc.s
+@
+@------------------------------------------------------------------------------
+@ REVISION HISTORY
+@
+@
+@ Who:                                   Date: MM/DD/YYYY
+@ Description: 
+@
+@------------------------------------------------------------------------------
+
+.arm
+
+.align 4
+
+.text
+
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_dct_9
+
+pvmp3_dct_9:
+        stmfd    sp!,{r4-r11,lr}
+        ldr      r2, [r0, #0x20]
+        ldr      r3, [r0, #0]
+        ldr      r12,[r0, #4]
+        add      r1,r2,r3
+        sub      lr,r2,r3
+        ldr      r3,[r0, #0x1c]
+        ldr      r4,[r0, #0x18]
+        add      r2,r3,r12
+        ldr      r5,[r0,#8]
+        sub      r3,r3,r12
+        add      r12,r4,r5
+        sub      r4,r4,r5
+        ldr      r5,[r0, #0x14]
+        ldr      r7,[r0, #0xc]
+        ldr      r9,[r0, #0x10]
+        add      r6,r5,r7
+        sub      r5,r5,r7
+        add      r7,r1,r12
+        add      r8,r9,r2
+        add      r7,r7,r6
+        add      r10,r7,r8
+        rsb      r7,r8,r7,asr #1
+        str      r7,[r0, #0x18]
+        rsb      r2,r9,r2,asr #1
+        str      r10,[r0,#0]
+        ldr      r11,cos_2pi_9
+        rsb      r7,r2,#0
+
+        ldr      r10,cos_4pi_9
+        mov      r9,r1,lsl #1
+        mov      r8,r7
+
+@    vec[4]  = fxp_mac32_Q32( vec[4], tmp0<<1, cos_2pi_9)@ 
+
+        smlal    r1,r8,r11,r9
+        ldr      r11,cos_pi_9
+		mov      r1,r9			@@@@@@  !!!!!!
+
+@    vec[8]  = fxp_mac32_Q32( vec[8], tmp0<<1, cos_4pi_9)@
+
+        smlal    r1,r7,r10,r9
+
+        mov      r1,r12,lsl #1
+
+
+@    vec[2]  = fxp_mac32_Q32( vec[2], tmp0<<1, cos_pi_9)@
+
+        smlal    r9,r2,r11,r9
+        rsb      r9,r10,#0
+        ldr      r11,cos_5pi_9
+
+        smlal    r12,r2,r9,r1
+
+
+
+@    vec[2]  = fxp_mac32_Q32( vec[2], tmp2<<1, cos_5pi_9)@
+
+        ldr      r9,cos_2pi_9
+        mov      r12,r1			@@@@@@  !!!!!!
+        smlal    r12,r8,r11,r1
+
+
+@    vec[8]  = fxp_mac32_Q32( vec[8], tmp2<<1, cos_2pi_9)@
+
+        smlal    r1,r7,r9,r1
+        mov      r1,r6,lsl #1
+        smlal    r12,r7,r11,r1
+        and      r6,r10,r11,asr #14
+        smlal    r12,r8,r6,r1
+        ldr      r10,cos_11pi_18
+        add      r12,r11,r6
+        smlal    r1,r2,r12,r1
+        ldr      r9,cos_8pi_9
+        str      r2,[r0,#8]
+        mov      r1,r5,lsl #1
+
+@    vec[8]  = fxp_mac32_Q32( vec[8], tmp3<<1, cos_8pi_9)@
+
+        smull    r2,r6,r9,r1
+        str      r7,[r0,#0x20]
+        mov      r2,r4,lsl #1
+        ldr      r7,cos_13pi_18
+        smlal    r12,r6,r10,r2
+
+        mov      r3,r3,lsl #1
+
+@    vec[5]  = fxp_mac32_Q32( vec[5], tmp8<<1, cos_13pi_18)@
+
+        smlal    r12,r6,r7,r3
+        add      r4,r5,r4
+        mov      r12,lr,lsl #1
+        sub      lr,r4,lr
+        ldr      r7,cos_17pi_18
+        str      r8,[r0, #0x10]
+        ldr      r4,cos_pi_6
+
+        mov      lr,lr,lsl #1
+
+@    vec[1]  = fxp_mac32_Q32( vec[1], tmp8<<1, cos_17pi_18)@
+
+        smlal    r8,r6,r7,r12
+
+@    vec[3]  = fxp_mul32_Q32((tmp5 + tmp6  - tmp8)<<1, cos_pi_6)@
+
+        smull    r5,lr,r4,lr
+        str      r6,[r0, #4]
+        str      lr,[r0, #0xc]
+
+
+@    vec[5]  = fxp_mul32_Q32(tmp5<<1, cos_17pi_18)@
+        smull    r5,lr,r7,r1
+        rsb      r6,r9,#0
+@    vec[5]  = fxp_mac32_Q32( vec[5], tmp6<<1,  cos_7pi_18)@
+        smlal    r5,lr,r6,r2
+@    vec[5]  = fxp_mac32_Q32( vec[5], tmp7<<1,    cos_pi_6)@
+        smlal    r5,lr,r4,r3
+@    vec[5]  = fxp_mac32_Q32( vec[5], tmp8<<1, cos_13pi_18)@
+        smlal    r5,lr,r10,r12
+        str      lr,[r0, #0x14]
+        rsb      lr,r10,#0
+
+@    vec[7]  = fxp_mul32_Q32(tmp5<<1, cos_5pi_18)@
+        smull    r5,r1,lr,r1
+@    vec[7]  = fxp_mac32_Q32( vec[7], tmp6<<1, cos_17pi_18)@
+        smlal    r2,r1,r7,r2
+@    vec[7]  = fxp_mac32_Q32( vec[7], tmp7<<1,    cos_pi_6)@
+        smlal    r3,r1,r4,r3
+@    vec[7]  = fxp_mac32_Q32( vec[7], tmp8<<1, cos_11pi_18)@
+        smlal    r12,r1,r9,r12
+        str      r1,[r0, #0x1c]
+        ldmfd    sp!,{r4-r11,pc}
+cos_2pi_9:
+        .word      0x620dbe80
+cos_4pi_9:
+        .word      0x163a1a80
+cos_pi_9:
+        .word      0x7847d900
+cos_5pi_9:
+        .word      0x87b82700
+cos_8pi_9:
+        .word      0xd438af00
+cos_11pi_18:
+        .word      0xadb92280
+cos_13pi_18:
+        .word      0x91261480
+cos_17pi_18:
+        .word      0x81f1d200
+cos_pi_6:
+        .word      0x6ed9eb80
+
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_arm.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_arm.s
new file mode 100644
index 0000000..9401d8c
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_arm.s
@@ -0,0 +1,369 @@
+; ------------------------------------------------------------------
+; Copyright (C) 1998-2009 PacketVideo
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+; express or implied.
+; See the License for the specific language governing permissions
+; and limitations under the License.
+; -------------------------------------------------------------------
+
+;
+;
+;   Filename: pvmp3_dct_18.s
+;
+;------------------------------------------------------------------------------
+; REVISION HISTORY
+;
+;
+; Who:                                   Date: MM/DD/YYYY
+; Description: 
+;
+;------------------------------------------------------------------------------
+
+        EXPORT pvmp3_mdct_18
+
+        IMPORT ||Lib$$Request$$armlib|| [WEAK]
+        IMPORT ||Lib$$Request$$cpplib|| [WEAK]
+        IMPORT pvmp3_dct_9
+
+
+;------------------------------------------------------------------------------
+
+ AREA |.text|, CODE, READONLY, ALIGN=2
+
+
+;------------------------------------------------------------------------------
+
+|pvmp3_mdct_18| PROC
+        stmfd    sp!,{r4-r10,lr}
+        mov      r7,r2
+        ldr      r2,table
+        mov      r6,r1
+        add      r3,r2,#0x24
+        add      r12,r3,#0x44
+        add      r1,r0,#0x44
+        mov      r5,r0
+
+;    for ( i=9; i!=0; i--)
+;    {
+
+        mov      r4,#9
+Loop_1
+
+;       tmp  = *(pt_vec);
+;		tmp1 = *(pt_vec_o);
+
+        ldr      lr,[r0]		;; tmp  == lr
+        ldr      r8,[r3],#4		;; tmp1 == r8
+
+;        tmp  = fxp_mul32_Q32( tmp<<1,  *(pt_cos++  ));
+;        tmp1 = fxp_mul32_Q27( tmp1, *(pt_cos_x--));
+
+        mov      lr,lr,lsl #1
+        smull    r10,lr,r8,lr
+        ldr      r8,[r12],#-4
+        ldr      r9,[r1]
+        subs     r4,r4,#1
+        smull    r9,r10,r8,r9
+        mov      r8,r9,lsr #27
+        add      r8,r8,r10,lsl #5
+
+;        *(pt_vec++)   =   tmp + tmp1 ;
+;        *(pt_vec_o--) = fxp_mul32_Q28( (tmp - tmp1), *(pt_cos_split++));
+
+        add      r9,lr,r8
+        sub      r8,lr,r8
+        ldr      lr,[r2],#4
+        str      r9,[r0],#4
+        smull    r8,r9,lr,r8
+        mov      lr,r8,lsr #28
+        add      lr,lr,r9,lsl #4
+        str      lr,[r1],#-4
+        bne      Loop_1
+
+;		}
+
+        mov      r0,r5			;; r0 = vec
+        bl       pvmp3_dct_9
+        add      r0,r5,#0x24	;; r0 = &vec[9]
+        bl       pvmp3_dct_9
+
+        ldr      r0,[r5,#0x20]
+        ldr      r2,[r5,#0x40]
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x1c]
+        ldr      r3,[r5,#0x38]
+        str      r0,[r5,#0x38]
+        ldr      r1,[r5,#0x18]
+        ldr      r0,[r5,#0x30]
+        str      r1,[r5,#0x30]
+        ldr      r12,[r5,#0x14]
+        ldr      r1,[r5,#0x28]
+        str      r12,[r5,#0x28]
+        ldr      r12,[r5,#0x10]
+        str      r12,[r5,#0x20]
+        ldr      r12,[r5,#0xc]
+        str      r12,[r5,#0x18]
+        ldr      r12,[r5,#8]
+        str      r12,[r5,#0x10]
+        ldr      r12,[r5,#4]
+        str      r12,[r5,#8]
+        ldr      r12,[r5,#0x24]
+        sub      r12,r12,r1
+        str      r12,[r5,#4]
+        ldr      r12,[r5,#0x2c]
+        sub      r1,r12,r1
+        str      r1,[r5,#0xc]
+        sub      r1,r12,r0
+        str      r1,[r5,#0x14]
+        ldr      r1,[r5,#0x34]
+        sub      r0,r1,r0
+        str      r0,[r5,#0x1c]
+        sub      r0,r1,r3
+        str      r0,[r5,#0x24]
+        ldr      r1,[r5,#0x3c]
+        sub      r3,r1,r3
+        sub      r1,r1,r2
+        str      r1,[r5,#0x34]
+        str      r3,[r5,#0x2c]
+        ldr      r1,[r5,#0x44]
+        sub      r1,r1,r2
+        str      r1,[r5,#0x3c]
+        ldr      r12,[r5,#0]
+
+Loop_2
+        add      r1,r5,r4,lsl #2
+        ldr      r2,[r1,#0x28]
+        ldr      r3,[r6,r4,lsl #2]
+        add      r0,r0,r2
+        str      r0,[r1,#0x28]
+        ldr      lr,[r7,r4,lsl #2]
+        ldr      r1,[r1,#4]
+        smlal    r0,r3,lr,r0
+        mov      r0,r2
+        add      r2,r12,r1
+        rsb      r2,r2,#0
+        str      r3,[r5,r4,lsl #2]
+        str      r2,[r6,r4,lsl #2]
+        add      r4,r4,#1
+        cmp      r4,#6
+        mov      r12,r1
+
+        blt      Loop_2
+
+        ldr      r1,[r5,#0x40]
+        ldr      r2,[r6,#0x18]
+        add      r3,r0,r1
+        str      r3,[r5,#0x40]
+        ldr      lr,[r7,r4,lsl #2]
+        mov      r3,r3,lsl #1
+        ldr      r0,[r5,#0x1c]
+        smlal    r3,r2,lr,r3
+        add      r3,r12,r0
+        str      r2,[r5,#0x18]
+        ldr      r2,[r6,#0x1c]
+        rsb      r3,r3,#0
+        str      r3,[r6,#0x18]
+        ldr      r3,[r5,#0x20]
+        add      r0,r3,r0
+        rsb      r0,r0,#0
+        str      r0,[r6,#0x1c]
+        ldr      r3,[r5,#0x44]
+        ldr      r0,[r6,#0x20]
+        add      r3,r3,r1
+        mov      r1,r2
+        ldr      r10,[r7,#0x1c]
+        mov      r2,r3,lsl #1
+        smlal    r12,r1,r10,r2
+        str      r1,[r5,#0x1c]
+        ldr      r1,[r5,#0x20]
+        ldr      r3,[r5,#0x24]
+        add      r1,r1,r3
+        rsb      r1,r1,#0
+        str      r1,[r6,#0x20]
+        ldr      r1,[r5,#0x44]
+        ldr      r3,[r7,#0x20]
+        mov      r1,r1,lsl #1
+        smlal    r12,r0,r3,r1
+        ldr      lr,[r7,#0x24]
+        ldr      r3,[r6,#0x24]
+        str      r0,[r5,#0x20]
+        smlal    r1,r3,lr,r1
+        ldr      r0,[r6,#0x40]
+        ldr      r12,[r6,#0x44]
+        str      r3,[r5,#0x24]
+        ldr      r1,[r5,#0x28]
+        ldr      r3,[r7,#0x44]
+        mov      r1,r1,lsl #1
+        smlal    r1,r12,r3,r1
+        ldr      r1,[r5,#0x40]
+        str      r12,[r5,#0x44]
+        rsb      r8,r1,#0
+        str      r8,[r5,#0x28]
+        ldr      r1,[r5,#0x2c]
+        ldr      r3,[r7,#0x40]
+        mov      r1,r1,lsl #1
+        smlal    r1,r0,r3,r1
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x3c]
+        ldr      r1,[r6,#0x38]
+        ldr      r3,[r6,#0x3c]
+        rsb      r9,r0,#0
+        str      r9,[r5,#0x2c]
+        ldr      r0,[r5,#0x30]
+        ldr      r12,[r7,#0x3c]
+        mov      r0,r0,lsl #1
+        smlal    r0,r3,r12,r0
+        str      r3,[r5,#0x3c]
+        ldr      r0,[r5,#0x38]
+        rsb      r0,r0,#0
+        str      r0,[r5,#0x30]
+        ldr      r3,[r5,#0x34]
+        ldr      r12,[r7,#0x38]
+        mov      r3,r3,lsl #1
+        smlal    r3,r1,r12,r3
+        mov      r0,r0,lsl #1
+        str      r1,[r5,#0x38]
+        ldr      r4,[r7,#0x34]
+        ldr      r1,[r6,#0x34]
+        ldr      r3,[r6,#0x30]
+        smlal    r0,r1,r4,r0
+        ldr      r12,[r6,#0x2c]
+        ldr      lr,[r6,#0x28]
+        str      r1,[r5,#0x34]
+        ldr      r1,[r7,#0x30]
+        mov      r0,r9,lsl #1
+        smlal    r0,r3,r1,r0
+        mov      r0,r8,lsl #1
+        ldr      r1,[r7,#0x2c]
+        str      r3,[r5,#0x30]
+        smlal    r0,r12,r1,r0
+        ldr      r0,[r7,#0x28]
+        str      r12,[r5,#0x2c]
+        smlal    r2,lr,r0,r2
+        str      lr,[r5,#0x28]
+        ldr      r1,[r6,#4]
+        ldr      r12,[r7,#0x48]
+        mov      r2,r1,lsl #1
+        ldr      r1,[r6,#0x20]
+        ldr      r0,[r6]
+        mov      r1,r1,lsl #1
+        smull    r4,lr,r12,r1
+        ldr      r3,[r6,#0x1c]
+        str      lr,[r6]
+        ldr      r12,[r7,#0x4c]
+        mov      r3,r3,lsl #1
+        smull    r4,lr,r12,r3
+        mov      r0,r0,lsl #1
+        ldr      r12,[r7,#0x64]
+        str      lr,[r6,#4]
+        smull    r4,lr,r12,r2
+        ldr      r12,[r7,#0x68]
+        str      lr,[r6,#0x1c]
+        smull    r4,lr,r12,r0
+        ldr      r12,[r7,#0x6c]
+        str      lr,[r6,#0x20]
+        smull    lr,r0,r12,r0
+        ldr      r12,[r7,#0x70]
+        str      r0,[r6,#0x24]
+        smull    r0,r2,r12,r2
+        ldr      r0,[r7,#0x88]
+        str      r2,[r6,#0x28]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x8c]
+        str      r2,[r6,#0x40]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x44]
+        ldr      r0,[r6,#0x18]
+        ldr      lr,[r7,#0x50]
+        mov      r1,r0,lsl #1
+        ldr      r0,[r6,#0x14]
+        smull    r5,r4,lr,r1
+        ldr      r12,[r6,#0x10]
+        mov      r3,r0,lsl #1
+        ldr      r0,[r6,#0xc]
+        mov      r12,r12,lsl #1
+        mov      r2,r0,lsl #1
+        ldr      r0,[r6,#8]
+        str      r4,[r6,#8]
+        ldr      lr,[r7,#0x54]
+        mov      r0,r0,lsl #1
+        smull    r5,r4,lr,r3
+        ldr      lr,[r7,#0x58]
+        str      r4,[r6,#0xc]
+        smull    r5,r4,lr,r12
+        ldr      lr,[r7,#0x5c]
+        str      r4,[r6,#0x10]
+        smull    r5,r4,lr,r2
+        ldr      lr,[r7,#0x60]
+        str      r4,[r6,#0x14]
+        smull    r5,r4,lr,r0
+        ldr      lr,[r7,#0x74]
+        str      r4,[r6,#0x18]
+        smull    r4,r0,lr,r0
+        ldr      lr,[r7,#0x78]
+        str      r0,[r6,#0x2c]
+        smull    r0,r2,lr,r2
+        ldr      r0,[r7,#0x7c]
+        str      r2,[r6,#0x30]
+        smull    r12,r2,r0,r12
+        ldr      r0,[r7,#0x80]
+        str      r2,[r6,#0x34]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x84]
+        str      r2,[r6,#0x38]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x3c]
+        ldmfd    sp!,{r4-r10,pc}
+table
+        DCD      ||.constdata$1||
+        ENDP
+
+;------------------------------------------------------------------------------
+
+ AREA |.constdata|, DATA, READONLY, ALIGN=2
+
+;------------------------------------------------------------------------------
+
+||.constdata$1||
+cosTerms_dct18
+        DCD      0x0807d2b0
+        DCD      0x08483ee0
+        DCD      0x08d3b7d0
+        DCD      0x09c42570
+        DCD      0x0b504f30
+        DCD      0x0df29440
+        DCD      0x12edfb20
+        DCD      0x1ee8dd40
+        DCD      0x5bca2a00
+cosTerms_1_ov_cos_phi
+        DCD      0x400f9c00
+        DCD      0x408d6080
+        DCD      0x418dcb80
+        DCD      0x431b1a00
+        DCD      0x4545ea00
+        DCD      0x48270680
+        DCD      0x4be25480
+        DCD      0x50ab9480
+        DCD      0x56ce4d80
+        DCD      0x05ebb630
+        DCD      0x06921a98
+        DCD      0x0771d3a8
+        DCD      0x08a9a830
+        DCD      0x0a73d750
+        DCD      0x0d4d5260
+        DCD      0x127b1ca0
+        DCD      0x1ea52b40
+        DCD      0x5bb3cc80
+
+
+
+        END
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s
new file mode 100644
index 0000000..96230c53
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s
@@ -0,0 +1,359 @@
+@ ------------------------------------------------------------------
+@ Copyright (C) 1998-2009 PacketVideo
+@
+@ Licensed under the Apache License, Version 2.0 (the "License");
+@ you may not use this file except in compliance with the License.
+@ You may obtain a copy of the License at
+@
+@      http://www.apache.org/licenses/LICENSE-2.0
+@
+@ Unless required by applicable law or agreed to in writing, software
+@ distributed under the License is distributed on an "AS IS" BASIS,
+@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+@ express or implied.
+@ See the License for the specific language governing permissions
+@ and limitations under the License.
+@ -------------------------------------------------------------------
+
+@
+@
+@   Filename: pvmp3_dct_18_gcc.s
+@
+@------------------------------------------------------------------------------
+@ REVISION HISTORY
+@
+@
+@ Who:                                   Date: MM/DD/YYYY
+@ Description: 
+@
+@------------------------------------------------------------------------------
+
+.arm
+
+.align 4
+
+.text
+
+.extern  pvmp3_dct_9
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_mdct_18
+
+pvmp3_mdct_18:
+        stmfd    sp!,{r4-r11,lr}
+        mov      r7,r2
+        ldr      r2,table
+        mov      r6,r1
+        add      r3,r2,#0x24
+        add      r12,r3,#0x44
+        add      r1,r0,#0x44
+        mov      r5,r0
+
+@    for ( i=9@ i!=0@ i--)
+@    {
+
+        mov      r4,#9
+Loop_1:
+
+@       tmp  = *(pt_vec)
+@		tmp1 = *(pt_vec_o)
+
+        ldr      lr,[r0]		@@ tmp  == lr
+        ldr      r8,[r3],#4		@@ tmp1 == r8
+
+@        tmp  = fxp_mul32_Q32( tmp<<1,  *(pt_cos++  ))
+@        tmp1 = fxp_mul32_Q27( tmp1, *(pt_cos_x--))
+
+        mov      lr,lr,lsl #1
+        smull    r10,lr,r8,lr
+        ldr      r8,[r12],#-4
+        ldr      r9,[r1]
+        subs     r4,r4,#1
+        smull    r9,r10,r8,r9
+        mov      r8,r9,lsr #27
+        add      r8,r8,r10,lsl #5
+
+@        *(pt_vec++)   =   tmp + tmp1 
+@        *(pt_vec_o--) = fxp_mul32_Q28( (tmp - tmp1), *(pt_cos_split++))
+
+        add      r9,lr,r8
+        sub      r8,lr,r8
+        ldr      lr,[r2],#4
+        str      r9,[r0],#4
+        smull    r8,r9,lr,r8
+        mov      lr,r8,lsr #28
+        add      lr,lr,r9,lsl #4
+        str      lr,[r1],#-4
+        bne      Loop_1
+
+@		}
+
+        mov      r0,r5			@@ r0 = vec
+        bl       pvmp3_dct_9
+        add      r0,r5,#0x24	@@ r0 = &vec[9]
+        bl       pvmp3_dct_9
+
+        ldr      r0,[r5,#0x20]
+        ldr      r2,[r5,#0x40]
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x1c]
+        ldr      r3,[r5,#0x38]
+        str      r0,[r5,#0x38]
+        ldr      r1,[r5,#0x18]
+        ldr      r0,[r5,#0x30]
+        str      r1,[r5,#0x30]
+        ldr      r12,[r5,#0x14]
+        ldr      r1,[r5,#0x28]
+        str      r12,[r5,#0x28]
+        ldr      r12,[r5,#0x10]
+        str      r12,[r5,#0x20]
+        ldr      r12,[r5,#0xc]
+        str      r12,[r5,#0x18]
+        ldr      r12,[r5,#8]
+        str      r12,[r5,#0x10]
+        ldr      r12,[r5,#4]
+        str      r12,[r5,#8]
+        ldr      r12,[r5,#0x24]
+        sub      r12,r12,r1
+        str      r12,[r5,#4]
+        ldr      r12,[r5,#0x2c]
+        sub      r1,r12,r1
+        str      r1,[r5,#0xc]
+        sub      r1,r12,r0
+        str      r1,[r5,#0x14]
+        ldr      r1,[r5,#0x34]
+        sub      r0,r1,r0
+        str      r0,[r5,#0x1c]
+        sub      r0,r1,r3
+        str      r0,[r5,#0x24]
+        ldr      r1,[r5,#0x3c]
+        sub      r3,r1,r3
+        sub      r1,r1,r2
+        str      r1,[r5,#0x34]
+        str      r3,[r5,#0x2c]
+        ldr      r1,[r5,#0x44]
+        sub      r1,r1,r2
+        str      r1,[r5,#0x3c]
+        ldr      r12,[r5,#0]
+
+Loop_2:
+        add      r1,r5,r4,lsl #2
+        ldr      r2,[r1,#0x28]
+        ldr      r3,[r6,r4,lsl #2]
+        add      r0,r0,r2
+        str      r0,[r1,#0x28]
+        ldr      lr,[r7,r4,lsl #2]
+        ldr      r1,[r1,#4]
+        smlal    r0,r3,lr,r0
+        mov      r0,r2
+        add      r2,r12,r1
+        rsb      r2,r2,#0
+        str      r3,[r5,r4,lsl #2]
+        str      r2,[r6,r4,lsl #2]
+        add      r4,r4,#1
+        cmp      r4,#6
+        mov      r12,r1
+
+        blt      Loop_2
+
+        ldr      r1,[r5,#0x40]
+        ldr      r2,[r6,#0x18]
+        add      r3,r0,r1
+        str      r3,[r5,#0x40]
+        ldr      lr,[r7,r4,lsl #2]
+        mov      r3,r3,lsl #1
+        ldr      r0,[r5,#0x1c]
+        smlal    r3,r2,lr,r3
+        add      r3,r12,r0
+        str      r2,[r5,#0x18]
+        ldr      r2,[r6,#0x1c]
+        rsb      r3,r3,#0
+        str      r3,[r6,#0x18]
+        ldr      r3,[r5,#0x20]
+        add      r0,r3,r0
+        rsb      r0,r0,#0
+        str      r0,[r6,#0x1c]
+        ldr      r3,[r5,#0x44]
+        ldr      r0,[r6,#0x20]
+        add      r3,r3,r1
+        mov      r1,r2
+        ldr      r10,[r7,#0x1c]
+        mov      r2,r3,lsl #1
+        smlal    r12,r1,r10,r2
+        str      r1,[r5,#0x1c]
+        ldr      r1,[r5,#0x20]
+        ldr      r3,[r5,#0x24]
+        add      r1,r1,r3
+        rsb      r1,r1,#0
+        str      r1,[r6,#0x20]
+        ldr      r1,[r5,#0x44]
+        ldr      r3,[r7,#0x20]
+        mov      r1,r1,lsl #1
+        smlal    r12,r0,r3,r1
+        ldr      lr,[r7,#0x24]
+        ldr      r3,[r6,#0x24]
+        str      r0,[r5,#0x20]
+        smlal    r1,r3,lr,r1
+        ldr      r0,[r6,#0x40]
+        ldr      r12,[r6,#0x44]
+        str      r3,[r5,#0x24]
+        ldr      r1,[r5,#0x28]
+        ldr      r3,[r7,#0x44]
+        mov      r1,r1,lsl #1
+        smlal    r1,r12,r3,r1
+        ldr      r1,[r5,#0x40]
+        str      r12,[r5,#0x44]
+        rsb      r8,r1,#0
+        str      r8,[r5,#0x28]
+        ldr      r1,[r5,#0x2c]
+        ldr      r3,[r7,#0x40]
+        mov      r1,r1,lsl #1
+        smlal    r1,r0,r3,r1
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x3c]
+        ldr      r1,[r6,#0x38]
+        ldr      r3,[r6,#0x3c]
+        rsb      r9,r0,#0
+        str      r9,[r5,#0x2c]
+        ldr      r0,[r5,#0x30]
+        ldr      r12,[r7,#0x3c]
+        mov      r0,r0,lsl #1
+        smlal    r0,r3,r12,r0
+        str      r3,[r5,#0x3c]
+        ldr      r0,[r5,#0x38]
+        rsb      r0,r0,#0
+        str      r0,[r5,#0x30]
+        ldr      r3,[r5,#0x34]
+        ldr      r12,[r7,#0x38]
+        mov      r3,r3,lsl #1
+        smlal    r3,r1,r12,r3
+        mov      r0,r0,lsl #1
+        str      r1,[r5,#0x38]
+        ldr      r4,[r7,#0x34]
+        ldr      r1,[r6,#0x34]
+        ldr      r3,[r6,#0x30]
+        smlal    r0,r1,r4,r0
+        ldr      r12,[r6,#0x2c]
+        ldr      lr,[r6,#0x28]
+        str      r1,[r5,#0x34]
+        ldr      r1,[r7,#0x30]
+        mov      r0,r9,lsl #1
+        smlal    r0,r3,r1,r0
+        mov      r0,r8,lsl #1
+        ldr      r1,[r7,#0x2c]
+        str      r3,[r5,#0x30]
+        smlal    r0,r12,r1,r0
+        ldr      r0,[r7,#0x28]
+        str      r12,[r5,#0x2c]
+        smlal    r2,lr,r0,r2
+        str      lr,[r5,#0x28]
+        ldr      r1,[r6,#4]
+        ldr      r12,[r7,#0x48]
+        mov      r2,r1,lsl #1
+        ldr      r1,[r6,#0x20]
+        ldr      r0,[r6,#0]
+        mov      r1,r1,lsl #1
+        smull    r4,lr,r12,r1
+        ldr      r3,[r6,#0x1c]
+        str      lr,[r6,#0]
+        ldr      r12,[r7,#0x4c]
+        mov      r3,r3,lsl #1
+        smull    r4,lr,r12,r3
+        mov      r0,r0,lsl #1
+        ldr      r12,[r7,#0x64]
+        str      lr,[r6,#4]
+        smull    r4,lr,r12,r2
+        ldr      r12,[r7,#0x68]
+        str      lr,[r6,#0x1c]
+        smull    r4,lr,r12,r0
+        ldr      r12,[r7,#0x6c]
+        str      lr,[r6,#0x20]
+        smull    lr,r0,r12,r0
+        ldr      r12,[r7,#0x70]
+        str      r0,[r6,#0x24]
+        smull    r0,r2,r12,r2
+        ldr      r0,[r7,#0x88]
+        str      r2,[r6,#0x28]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x8c]
+        str      r2,[r6,#0x40]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x44]
+        ldr      r0,[r6,#0x18]
+        ldr      lr,[r7,#0x50]
+        mov      r1,r0,lsl #1
+        ldr      r0,[r6,#0x14]
+        smull    r5,r4,lr,r1
+        mov      r3,r0,lsl #1
+        ldr      r0,[r6,#0x10]
+        mov      r12,r0,lsl #1
+        ldr      r0,[r6,#0xc]
+        mov      r2,r0,lsl #1
+        ldr      r0,[r6,#8]
+        str      r4,[r6,#8]
+        ldr      lr,[r7,#0x54]
+        mov      r0,r0,lsl #1
+        smull    r5,r4,lr,r3
+        ldr      lr,[r7,#0x58]
+        str      r4,[r6,#0xc]
+        smull    r5,r4,lr,r12
+        ldr      lr,[r7,#0x5c]
+        str      r4,[r6,#0x10]
+        smull    r5,r4,lr,r2
+        ldr      lr,[r7,#0x60]
+        str      r4,[r6,#0x14]
+        smull    r5,r4,lr,r0
+        ldr      lr,[r7,#0x74]
+        str      r4,[r6,#0x18]
+        smull    r4,r0,lr,r0
+        ldr      lr,[r7,#0x78]
+        str      r0,[r6,#0x2c]
+        smull    r0,r2,lr,r2
+        ldr      r0,[r7,#0x7c]
+        str      r2,[r6,#0x30]
+        smull    r12,r2,r0,r12
+        ldr      r0,[r7,#0x80]
+        str      r2,[r6,#0x34]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x84]
+        str      r2,[r6,#0x38]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x3c]
+        ldmfd    sp!,{r4-r11,pc}
+table:
+        .word      constdata$1
+
+@------------------------------------------------------------------------------
+
+constdata$1:
+cosTerms_dct18:
+        .word      0x0807d2b0
+        .word      0x08483ee0
+        .word      0x08d3b7d0
+        .word      0x09c42570
+        .word      0x0b504f30
+        .word      0x0df29440
+        .word      0x12edfb20
+        .word      0x1ee8dd40
+        .word      0x5bca2a00
+cosTerms_1_ov_cos_phi:
+        .word      0x400f9c00
+        .word      0x408d6080
+        .word      0x418dcb80
+        .word      0x431b1a00
+        .word      0x4545ea00
+        .word      0x48270680
+        .word      0x4be25480
+        .word      0x50ab9480
+        .word      0x56ce4d80
+        .word      0x05ebb630
+        .word      0x06921a98
+        .word      0x0771d3a8
+        .word      0x08a9a830
+        .word      0x0a73d750
+        .word      0x0d4d5260
+        .word      0x127b1ca0
+        .word      0x1ea52b40
+        .word      0x5bb3cc80
+
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_wm.asm b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_wm.asm
new file mode 100644
index 0000000..5be75d4
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_wm.asm
@@ -0,0 +1,366 @@
+; ------------------------------------------------------------------
+; Copyright (C) 1998-2009 PacketVideo
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+; express or implied.
+; See the License for the specific language governing permissions
+; and limitations under the License.
+; -------------------------------------------------------------------
+
+;
+;
+;   Filename: pvmp3_dct_18.s
+;
+;------------------------------------------------------------------------------
+; REVISION HISTORY
+;
+;
+; Who:                                   Date: MM/DD/YYYY
+; Description: 
+;
+;------------------------------------------------------------------------------
+
+        EXPORT |pvmp3_mdct_18|
+
+        IMPORT pvmp3_dct_9
+
+
+;------------------------------------------------------------------------------
+
+ AREA |.text|, CODE, READONLY, ALIGN=2
+
+
+;------------------------------------------------------------------------------
+
+|pvmp3_mdct_18| PROC
+        stmfd    sp!,{r4-r10,lr}
+        mov      r7,r2
+        ldr      r2,table
+        mov      r6,r1
+        add      r3,r2,#0x24
+        add      r12,r3,#0x44
+        add      r1,r0,#0x44
+        mov      r5,r0
+
+;    for ( i=9; i!=0; i--)
+;    {
+
+        mov      r4,#9
+Loop_1
+
+;       tmp  = *(pt_vec);
+;		tmp1 = *(pt_vec_o);
+
+        ldr      lr,[r0]		;; tmp  == lr
+        ldr      r8,[r3],#4		;; tmp1 == r8
+
+;        tmp  = fxp_mul32_Q32( tmp<<1,  *(pt_cos++  ));
+;        tmp1 = fxp_mul32_Q27( tmp1, *(pt_cos_x--));
+
+        mov      lr,lr,lsl #1
+        smull    r10,lr,r8,lr
+        ldr      r8,[r12],#-4
+        ldr      r9,[r1]
+        subs     r4,r4,#1
+        smull    r9,r10,r8,r9
+        mov      r8,r9,lsr #27
+        add      r8,r8,r10,lsl #5
+
+;        *(pt_vec++)   =   tmp + tmp1 ;
+;        *(pt_vec_o--) = fxp_mul32_Q28( (tmp - tmp1), *(pt_cos_split++));
+
+        add      r9,lr,r8
+        sub      r8,lr,r8
+        ldr      lr,[r2],#4
+        str      r9,[r0],#4
+        smull    r8,r9,lr,r8
+        mov      lr,r8,lsr #28
+        add      lr,lr,r9,lsl #4
+        str      lr,[r1],#-4
+        bne      Loop_1
+
+;		}
+
+        mov      r0,r5			;; r0 = vec
+        bl       pvmp3_dct_9
+        add      r0,r5,#0x24	;; r0 = &vec[9]
+        bl       pvmp3_dct_9
+
+        ldr      r0,[r5,#0x20]
+        ldr      r2,[r5,#0x40]
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x1c]
+        ldr      r3,[r5,#0x38]
+        str      r0,[r5,#0x38]
+        ldr      r1,[r5,#0x18]
+        ldr      r0,[r5,#0x30]
+        str      r1,[r5,#0x30]
+        ldr      r12,[r5,#0x14]
+        ldr      r1,[r5,#0x28]
+        str      r12,[r5,#0x28]
+        ldr      r12,[r5,#0x10]
+        str      r12,[r5,#0x20]
+        ldr      r12,[r5,#0xc]
+        str      r12,[r5,#0x18]
+        ldr      r12,[r5,#8]
+        str      r12,[r5,#0x10]
+        ldr      r12,[r5,#4]
+        str      r12,[r5,#8]
+        ldr      r12,[r5,#0x24]
+        sub      r12,r12,r1
+        str      r12,[r5,#4]
+        ldr      r12,[r5,#0x2c]
+        sub      r1,r12,r1
+        str      r1,[r5,#0xc]
+        sub      r1,r12,r0
+        str      r1,[r5,#0x14]
+        ldr      r1,[r5,#0x34]
+        sub      r0,r1,r0
+        str      r0,[r5,#0x1c]
+        sub      r0,r1,r3
+        str      r0,[r5,#0x24]
+        ldr      r1,[r5,#0x3c]
+        sub      r3,r1,r3
+        sub      r1,r1,r2
+        str      r1,[r5,#0x34]
+        str      r3,[r5,#0x2c]
+        ldr      r1,[r5,#0x44]
+        sub      r1,r1,r2
+        str      r1,[r5,#0x3c]
+        ldr      r12,[r5,#0]
+
+Loop_2
+        add      r1,r5,r4,lsl #2
+        ldr      r2,[r1,#0x28]
+        ldr      r3,[r6,r4,lsl #2]
+        add      r0,r0,r2
+        str      r0,[r1,#0x28]
+        ldr      lr,[r7,r4,lsl #2]
+        ldr      r1,[r1,#4]
+        smlal    r0,r3,lr,r0
+        mov      r0,r2
+        add      r2,r12,r1
+        rsb      r2,r2,#0
+        str      r3,[r5,r4,lsl #2]
+        str      r2,[r6,r4,lsl #2]
+        add      r4,r4,#1
+        cmp      r4,#6
+        mov      r12,r1
+
+        blt      Loop_2
+
+        ldr      r1,[r5,#0x40]
+        ldr      r2,[r6,#0x18]
+        add      r3,r0,r1
+        str      r3,[r5,#0x40]
+        ldr      lr,[r7,r4,lsl #2]
+        mov      r3,r3,lsl #1
+        ldr      r0,[r5,#0x1c]
+        smlal    r3,r2,lr,r3
+        add      r3,r12,r0
+        str      r2,[r5,#0x18]
+        ldr      r2,[r6,#0x1c]
+        rsb      r3,r3,#0
+        str      r3,[r6,#0x18]
+        ldr      r3,[r5,#0x20]
+        add      r0,r3,r0
+        rsb      r0,r0,#0
+        str      r0,[r6,#0x1c]
+        ldr      r3,[r5,#0x44]
+        ldr      r0,[r6,#0x20]
+        add      r3,r3,r1
+        mov      r1,r2
+        ldr      r10,[r7,#0x1c]
+        mov      r2,r3,lsl #1
+        smlal    r12,r1,r10,r2
+        str      r1,[r5,#0x1c]
+        ldr      r1,[r5,#0x20]
+        ldr      r3,[r5,#0x24]
+        add      r1,r1,r3
+        rsb      r1,r1,#0
+        str      r1,[r6,#0x20]
+        ldr      r1,[r5,#0x44]
+        ldr      r3,[r7,#0x20]
+        mov      r1,r1,lsl #1
+        smlal    r12,r0,r3,r1
+        ldr      lr,[r7,#0x24]
+        ldr      r3,[r6,#0x24]
+        str      r0,[r5,#0x20]
+        smlal    r1,r3,lr,r1
+        ldr      r0,[r6,#0x40]
+        ldr      r12,[r6,#0x44]
+        str      r3,[r5,#0x24]
+        ldr      r1,[r5,#0x28]
+        ldr      r3,[r7,#0x44]
+        mov      r1,r1,lsl #1
+        smlal    r1,r12,r3,r1
+        ldr      r1,[r5,#0x40]
+        str      r12,[r5,#0x44]
+        rsb      r8,r1,#0
+        str      r8,[r5,#0x28]
+        ldr      r1,[r5,#0x2c]
+        ldr      r3,[r7,#0x40]
+        mov      r1,r1,lsl #1
+        smlal    r1,r0,r3,r1
+        str      r0,[r5,#0x40]
+        ldr      r0,[r5,#0x3c]
+        ldr      r1,[r6,#0x38]
+        ldr      r3,[r6,#0x3c]
+        rsb      r9,r0,#0
+        str      r9,[r5,#0x2c]
+        ldr      r0,[r5,#0x30]
+        ldr      r12,[r7,#0x3c]
+        mov      r0,r0,lsl #1
+        smlal    r0,r3,r12,r0
+        str      r3,[r5,#0x3c]
+        ldr      r0,[r5,#0x38]
+        rsb      r0,r0,#0
+        str      r0,[r5,#0x30]
+        ldr      r3,[r5,#0x34]
+        ldr      r12,[r7,#0x38]
+        mov      r3,r3,lsl #1
+        smlal    r3,r1,r12,r3
+        mov      r0,r0,lsl #1
+        str      r1,[r5,#0x38]
+        ldr      r4,[r7,#0x34]
+        ldr      r1,[r6,#0x34]
+        ldr      r3,[r6,#0x30]
+        smlal    r0,r1,r4,r0
+        ldr      r12,[r6,#0x2c]
+        ldr      lr,[r6,#0x28]
+        str      r1,[r5,#0x34]
+        ldr      r1,[r7,#0x30]
+        mov      r0,r9,lsl #1
+        smlal    r0,r3,r1,r0
+        mov      r0,r8,lsl #1
+        ldr      r1,[r7,#0x2c]
+        str      r3,[r5,#0x30]
+        smlal    r0,r12,r1,r0
+        ldr      r0,[r7,#0x28]
+        str      r12,[r5,#0x2c]
+        smlal    r2,lr,r0,r2
+        str      lr,[r5,#0x28]
+        ldr      r1,[r6,#4]
+        ldr      r12,[r7,#0x48]
+        mov      r2,r1,lsl #1
+        ldr      r1,[r6,#0x20]
+        ldr      r0,[r6]
+        mov      r1,r1,lsl #1
+        smull    r4,lr,r12,r1
+        ldr      r3,[r6,#0x1c]
+        str      lr,[r6]
+        ldr      r12,[r7,#0x4c]
+        mov      r3,r3,lsl #1
+        smull    r4,lr,r12,r3
+        mov      r0,r0,lsl #1
+        ldr      r12,[r7,#0x64]
+        str      lr,[r6,#4]
+        smull    r4,lr,r12,r2
+        ldr      r12,[r7,#0x68]
+        str      lr,[r6,#0x1c]
+        smull    r4,lr,r12,r0
+        ldr      r12,[r7,#0x6c]
+        str      lr,[r6,#0x20]
+        smull    lr,r0,r12,r0
+        ldr      r12,[r7,#0x70]
+        str      r0,[r6,#0x24]
+        smull    r0,r2,r12,r2
+        ldr      r0,[r7,#0x88]
+        str      r2,[r6,#0x28]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x8c]
+        str      r2,[r6,#0x40]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x44]
+        ldr      r0,[r6,#0x18]
+        ldr      lr,[r7,#0x50]
+        mov      r1,r0,lsl #1
+        ldr      r0,[r6,#0x14]
+        smull    r5,r4,lr,r1
+        ldr      r12,[r6,#0x10]
+        mov      r3,r0,lsl #1
+        ldr      r0,[r6,#0xc]
+        mov      r12,r12,lsl #1
+        mov      r2,r0,lsl #1
+        ldr      r0,[r6,#8]
+        str      r4,[r6,#8]
+        ldr      lr,[r7,#0x54]
+        mov      r0,r0,lsl #1
+        smull    r5,r4,lr,r3
+        ldr      lr,[r7,#0x58]
+        str      r4,[r6,#0xc]
+        smull    r5,r4,lr,r12
+        ldr      lr,[r7,#0x5c]
+        str      r4,[r6,#0x10]
+        smull    r5,r4,lr,r2
+        ldr      lr,[r7,#0x60]
+        str      r4,[r6,#0x14]
+        smull    r5,r4,lr,r0
+        ldr      lr,[r7,#0x74]
+        str      r4,[r6,#0x18]
+        smull    r4,r0,lr,r0
+        ldr      lr,[r7,#0x78]
+        str      r0,[r6,#0x2c]
+        smull    r0,r2,lr,r2
+        ldr      r0,[r7,#0x7c]
+        str      r2,[r6,#0x30]
+        smull    r12,r2,r0,r12
+        ldr      r0,[r7,#0x80]
+        str      r2,[r6,#0x34]
+        smull    r3,r2,r0,r3
+        ldr      r0,[r7,#0x84]
+        str      r2,[r6,#0x38]
+        smull    r2,r1,r0,r1
+        str      r1,[r6,#0x3c]
+        ldmfd    sp!,{r4-r10,pc}
+table
+        DCD      cosTerms_dct18
+        ENDP
+
+;------------------------------------------------------------------------------
+
+ AREA |.constdata|, DATA, READONLY, ALIGN=2
+
+;------------------------------------------------------------------------------
+
+cosTerms_dct18
+        DCD      0x0807d2b0
+        DCD      0x08483ee0
+        DCD      0x08d3b7d0
+        DCD      0x09c42570
+        DCD      0x0b504f30
+        DCD      0x0df29440
+        DCD      0x12edfb20
+        DCD      0x1ee8dd40
+        DCD      0x5bca2a00
+cosTerms_1_ov_cos_phi
+        DCD      0x400f9c00
+        DCD      0x408d6080
+        DCD      0x418dcb80
+        DCD      0x431b1a00
+        DCD      0x4545ea00
+        DCD      0x48270680
+        DCD      0x4be25480
+        DCD      0x50ab9480
+        DCD      0x56ce4d80
+        DCD      0x05ebb630
+        DCD      0x06921a98
+        DCD      0x0771d3a8
+        DCD      0x08a9a830
+        DCD      0x0a73d750
+        DCD      0x0d4d5260
+        DCD      0x127b1ca0
+        DCD      0x1ea52b40
+        DCD      0x5bb3cc80
+
+
+
+        END
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_arm.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_arm.s
new file mode 100644
index 0000000..abec599
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_arm.s
@@ -0,0 +1,237 @@
+; ------------------------------------------------------------------
+; Copyright (C) 1998-2009 PacketVideo
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+; express or implied.
+; See the License for the specific language governing permissions
+; and limitations under the License.
+; -------------------------------------------------------------------
+
+;
+;
+;   Filename: pvmp3_polyphase_filter_window.s
+;
+;------------------------------------------------------------------------------
+; REVISION HISTORY
+;
+;
+; Who:                                   Date: MM/DD/YYYY
+; Description: 
+;
+;------------------------------------------------------------------------------
+
+        EXPORT pvmp3_polyphase_filter_window
+
+        IMPORT ||Lib$$Request$$armlib|| [WEAK]
+        IMPORT ||Lib$$Request$$cpplib|| [WEAK]
+        IMPORT pqmfSynthWin
+
+
+
+;------------------------------------------------------------------------------
+
+ AREA |.text|, CODE, READONLY, ALIGN=2
+
+
+;------------------------------------------------------------------------------
+
+|pvmp3_polyphase_filter_window| PROC
+
+        stmfd    sp!,{r0-r2,r4-r11,lr}
+
+        sub      sp,sp,#4
+        ldr      r2,[sp,#0xc]
+        ldr      r1,PolyPh_filter_coeff
+		
+        sub      r2,r2,#1
+        mov      r10,#1
+        str      r2,[sp]
+
+; Accumulators r9, r11::> Initialization
+
+Loop_j
+        mov      r9,  #0x20
+        mov      r11, #0x20
+        mov      r4,  #0x10
+Loop_i
+        add      r2,r4,r10
+        add      r3,r0,r2,lsl #2
+        sub      r2,r4,r10
+        ldr      r5,[r3]
+        ldr      lr,[r1]
+        add      r12,r0,r2,lsl #2
+        ldr      r6,[r12,#0x780]
+        smlal    r2,r9,lr,r5
+        smlal    r2,r11,lr,r6
+        ldr      r2,[r1,#4]
+        ldr      r7,[r12,#0x80]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        sub      r9,r9,r5
+        ldr      r5,[r1,#8]
+        ldr      r8,[r3,#0x700]
+        add      r4,r4,#0x200
+        smlal    r6,r9,r5,r7
+        smull    r6,r2,r5,r8
+        ldr      r5,[r1,#0xc]
+        sub      r11,r11,r2
+        smlal    r8,r9,r5,r8
+        smlal    r7,r11,r5,r7
+        ldr      r5,[r3,#0x100]
+        ldr      r2,[r1,#0x10]
+        ldr      r6,[r12,#0x680]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x14]
+        ldr      r7,[r12,#0x180]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x18]
+        ldr      r8,[r3,#0x600]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x1c]
+        sub      r11,r11,r5
+        smlal    r8,r9,r6,r8
+        ldr      r2,[r1,#0x20]
+        ldr      r5,[r3,#0x200]
+        smlal    r7,r11,r6,r7
+        ldr      r6,[r12,#0x580]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x24]
+        ldr      r7,[r12,#0x280]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x28]
+        ldr      r8,[r3,#0x500]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x2c]
+        sub      r11,r11,r5
+
+        smlal    r8,r9,r6,r8
+        smlal    r7,r11,r6,r7
+        ldr      r5,[r3,#0x300]
+        ldr      r8,[r1,#0x30]
+        ldr      r6,[r12,#0x480]
+        smlal    r7,r9,r8,r5
+        smlal    r7,r11,r8,r6
+        ldr      r8,[r1,#0x34]
+        ldr      r12,[r12,#0x380]
+        smlal    r5,r11,r8,r5
+        smull    r6,r5,r8,r6
+        ldr      r6,[r1,#0x38]
+
+
+        ldr      r3,[r3,#0x400]
+        sub      r9,r9,r5
+        smlal    r7,r9,r6,r12
+        smull    r8,r7,r6,r3
+        cmp      r4,#0x210
+        sub      r11,r11,r7
+
+        ldr      r2,[r1,#0x3c]
+        add      r1,r1,#0x40
+        smlal    r3,r9,r2,r3
+        smlal    r12,r11,r2,r12
+
+        blt      Loop_i
+
+        mov      r3,r9, asr #6
+        mov      r4,r3, asr #15
+        teq      r4,r3, asr #31
+        ldr      r12,LOW_16BITS
+        ldr      r2,[sp]
+        eorne    r3,r12,r3,asr #31
+        ldr      r4,[sp,#8]
+        mov      r2,r10,lsl r2
+        add      r4,r4,r2,lsl #1
+        strh     r3,[r4]
+
+        mov      r3,r11,asr #6
+        mov      r4,r3,asr #15
+        teq      r4,r3,asr #31
+        eorne    r3,r12,r3,asr #31
+        ldr      r12,[sp,#0xc]
+        ldr      r11,[sp,#8]
+        rsb      r2,r2,r12,lsl #5
+        add      r2,r11,r2,lsl #1
+        strh     r3,[r2]
+
+        add      r10,r10,#1
+        cmp      r10,#0x10
+        blt      Loop_j
+
+; Accumulators r4, r5 Initialization
+
+        mov      r4,#0x20
+        mov      r5,#0x20
+        mov      r3,#0x10
+PolyPh_filter_loop2
+        add      r2,r0,r3,lsl #2
+        ldr      r12,[r2]
+        ldr      r8,[r1]
+        ldr      r6,[r2,#0x80]
+        smlal    r12,r4,r8,r12
+        ldr      r12,[r1,#4]
+        ldr      r7,[r2,#0x40]
+        smlal    r6,r4,r12,r6
+
+        ldr      r12,[r1,#8]
+        ldr      r6,[r2,#0x180]
+        smlal    r7,r5,r12,r7
+        ldr      r12,[r2,#0x100]
+        ldr      r7,[r1,#0xc]
+        ldr      r2,[r2,#0x140]
+        smlal    r12,r4,r7,r12
+        ldr      r12,[r1,#0x10]
+        add      r3,r3,#0x80
+        smlal    r6,r4,r12,r6
+        ldr      r6,[r1,#0x14]
+        cmp      r3,#0x210
+        smlal    r2,r5,r6,r2
+        add      r1,r1,#0x18
+
+        blt      PolyPh_filter_loop2
+        mov      r0,r4,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r1,[sp,#8]
+        eorne    r0,r12,r0,asr #31
+        strh     r0,[r1,#0]
+        mov      r0,r5,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r2,[sp]
+        mov      r1,#0x10
+        eorne    r0,r12,r0,asr #31
+        ldr      r12,[sp,#8]
+        mov      r1,r1,lsl r2
+        add      r1,r12,r1,lsl #1
+        strh     r0,[r1]
+        add      sp,sp,#0x10
+        ldmfd    sp!,{r4-r11,pc}
+
+
+PolyPh_filter_coeff
+        DCD      pqmfSynthWin
+LOW_16BITS
+        DCD      0x00007fff
+
+        ENDP
+
+
+        END
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s
new file mode 100644
index 0000000..4f45737
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s
@@ -0,0 +1,230 @@
+@ ------------------------------------------------------------------
+@ Copyright (C) 1998-2009 PacketVideo
+@
+@ Licensed under the Apache License, Version 2.0 (the "License");
+@ you may not use this file except in compliance with the License.
+@ You may obtain a copy of the License at
+@
+@      http://www.apache.org/licenses/LICENSE-2.0
+@
+@ Unless required by applicable law or agreed to in writing, software
+@ distributed under the License is distributed on an "AS IS" BASIS,
+@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+@ express or implied.
+@ See the License for the specific language governing permissions
+@ and limitations under the License.
+@ -------------------------------------------------------------------
+
+@
+@
+@   Filename: pvmp3_polyphase_filter_window.s
+@
+@------------------------------------------------------------------------------
+@ REVISION HISTORY
+@
+@
+@ Who:                                   Date: MM/DD/YYYY
+@ Description: 
+@
+@------------------------------------------------------------------------------
+
+.arm
+
+.align 4
+
+.text
+
+.extern pqmfSynthWin
+
+
+
+@------------------------------------------------------------------------------
+
+.global pvmp3_polyphase_filter_window
+
+pvmp3_polyphase_filter_window:
+        stmfd    sp!,{r0-r2,r4-r11,lr}
+
+        sub      sp,sp,#4
+        ldr      r2,[sp,#0xc]
+        ldr      r1,PolyPh_filter_coeff
+		
+        sub      r2,r2,#1
+        mov      r10,#1
+        str      r2,[sp]
+
+@ Accumulators r9, r11::> Initialization
+
+Loop_j:
+        mov      r9,  #0x20
+        mov      r11, #0x20
+        mov      r4,  #0x10
+Loop_i:
+        add      r2,r4,r10
+        add      r3,r0,r2,lsl #2
+        sub      r2,r4,r10
+        ldr      r5,[r3]
+        ldr      lr,[r1]
+        add      r12,r0,r2,lsl #2
+        ldr      r6,[r12,#0x780]
+        smlal    r2,r9,lr,r5
+        smlal    r2,r11,lr,r6
+        ldr      r2,[r1,#4]
+        ldr      r7,[r12,#0x80]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        sub      r9,r9,r5
+        ldr      r5,[r1,#8]
+        ldr      r8,[r3,#0x700]
+        add      r4,r4,#0x200
+        smlal    r6,r9,r5,r7
+        smull    r6,r2,r5,r8
+        ldr      r5,[r1,#0xc]
+        sub      r11,r11,r2
+        smlal    r8,r9,r5,r8
+        smlal    r7,r11,r5,r7
+        ldr      r5,[r3,#0x100]
+        ldr      r2,[r1,#0x10]
+        ldr      r6,[r12,#0x680]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x14]
+        ldr      r7,[r12,#0x180]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x18]
+        ldr      r8,[r3,#0x600]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x1c]
+        sub      r11,r11,r5
+        smlal    r8,r9,r6,r8
+        ldr      r2,[r1,#0x20]
+        ldr      r5,[r3,#0x200]
+        smlal    r7,r11,r6,r7
+        ldr      r6,[r12,#0x580]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x24]
+        ldr      r7,[r12,#0x280]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x28]
+        ldr      r8,[r3,#0x500]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x2c]
+        sub      r11,r11,r5
+
+        smlal    r8,r9,r6,r8
+        smlal    r7,r11,r6,r7
+        ldr      r5,[r3,#0x300]
+        ldr      r8,[r1,#0x30]
+        ldr      r6,[r12,#0x480]
+        smlal    r7,r9,r8,r5
+        smlal    r7,r11,r8,r6
+        ldr      r8,[r1,#0x34]
+        ldr      r12,[r12,#0x380]
+        smlal    r5,r11,r8,r5
+        smull    r6,r5,r8,r6
+        ldr      r6,[r1,#0x38]
+
+
+        ldr      r3,[r3,#0x400]
+        sub      r9,r9,r5
+        smlal    r7,r9,r6,r12
+        smull    r8,r7,r6,r3
+        cmp      r4,#0x210
+        sub      r11,r11,r7
+
+        ldr      r2,[r1,#0x3c]
+        add      r1,r1,#0x40
+        smlal    r3,r9,r2,r3
+        smlal    r12,r11,r2,r12
+
+        blt      Loop_i
+
+        mov      r3,r9, asr #6
+        mov      r4,r3, asr #15
+        teq      r4,r3, asr #31
+        ldr      r12,LOW_16BITS
+        ldr      r2,[sp]
+        eorne    r3,r12,r3,asr #31
+        ldr      r4,[sp,#8]
+        mov      r2,r10,lsl r2
+        add      r4,r4,r2,lsl #1
+        strh     r3,[r4]
+
+        mov      r3,r11,asr #6
+        mov      r4,r3,asr #15
+        teq      r4,r3,asr #31
+        eorne    r3,r12,r3,asr #31
+        ldr      r12,[sp,#0xc]
+        ldr      r11,[sp,#8]
+        rsb      r2,r2,r12,lsl #5
+        add      r2,r11,r2,lsl #1
+        strh     r3,[r2]
+
+        add      r10,r10,#1
+        cmp      r10,#0x10
+        blt      Loop_j
+
+@ Accumulators r4, r5 Initialization
+
+        mov      r4,#0x20
+        mov      r5,#0x20
+        mov      r3,#0x10
+PolyPh_filter_loop2:
+        add      r2,r0,r3,lsl #2
+        ldr      r12,[r2]
+        ldr      r8,[r1]
+        ldr      r6,[r2,#0x80]
+        smlal    r12,r4,r8,r12
+        ldr      r12,[r1,#4]
+        ldr      r7,[r2,#0x40]
+        smlal    r6,r4,r12,r6
+
+        ldr      r12,[r1,#8]
+        ldr      r6,[r2,#0x180]
+        smlal    r7,r5,r12,r7
+        ldr      r12,[r2,#0x100]
+        ldr      r7,[r1,#0xc]
+        ldr      r2,[r2,#0x140]
+        smlal    r12,r4,r7,r12
+        ldr      r12,[r1,#0x10]
+        add      r3,r3,#0x80
+        smlal    r6,r4,r12,r6
+        ldr      r6,[r1,#0x14]
+        cmp      r3,#0x210
+        smlal    r2,r5,r6,r2
+        add      r1,r1,#0x18
+
+        blt      PolyPh_filter_loop2
+        mov      r0,r4,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r1,[sp,#8]
+        eorne    r0,r12,r0,asr #31
+        strh     r0,[r1,#0]
+        mov      r0,r5,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r2,[sp]
+        mov      r1,#0x10
+        eorne    r0,r12,r0,asr #31
+        ldr      r12,[sp,#8]
+        mov      r1,r1,lsl r2
+        add      r1,r12,r1,lsl #1
+        strh     r0,[r1]
+        add      sp,sp,#0x10
+        ldmfd    sp!,{r4-r11,pc}
+
+PolyPh_filter_coeff:
+        .word      pqmfSynthWin
+LOW_16BITS:
+        .word      0x00007fff
+
diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_wm.asm b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_wm.asm
new file mode 100644
index 0000000..f957267
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_wm.asm
@@ -0,0 +1,231 @@
+; ------------------------------------------------------------------
+; Copyright (C) 1998-2009 PacketVideo
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+; express or implied.
+; See the License for the specific language governing permissions
+; and limitations under the License.
+; -------------------------------------------------------------------
+
+;
+;
+;   Filename: pvmp3_polyphase_filter_window.s
+;
+;------------------------------------------------------------------------------
+; REVISION HISTORY
+;
+;
+; Who:                                   Date: MM/DD/YYYY
+; Description: 
+;
+;------------------------------------------------------------------------------
+
+	CODE32
+
+	AREA	|.drectve|, DRECTVE
+
+	EXPORT	|pvmp3_polyphase_filter_window|
+	IMPORT	|pqmfSynthWin|
+
+	AREA	|.pdata|, PDATA
+
+	AREA	|.text|, CODE, ARM
+
+|pvmp3_polyphase_filter_window| PROC
+        stmfd    sp!,{r0-r2,r4-r11,lr}
+
+        sub      sp,sp,#4
+        ldr      r2,[sp,#0xc]
+        ldr      r1,PolyPh_filter_coeff
+		
+        sub      r2,r2,#1
+        mov      r10,#1
+        str      r2,[sp]
+
+; Accumulators r9, r11::> Initialization
+
+Loop_j
+        mov      r9,  #0x20
+        mov      r11, #0x20
+        mov      r4,  #0x10
+Loop_i
+        add      r2,r4,r10
+        add      r3,r0,r2,lsl #2
+        sub      r2,r4,r10
+        ldr      r5,[r3]
+        ldr      lr,[r1]
+        add      r12,r0,r2,lsl #2
+        ldr      r6,[r12,#0x780]
+        smlal    r2,r9,lr,r5
+        smlal    r2,r11,lr,r6
+        ldr      r2,[r1,#4]
+        ldr      r7,[r12,#0x80]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        sub      r9,r9,r5
+        ldr      r5,[r1,#8]
+        ldr      r8,[r3,#0x700]
+        add      r4,r4,#0x200
+        smlal    r6,r9,r5,r7
+        smull    r6,r2,r5,r8
+        ldr      r5,[r1,#0xc]
+        sub      r11,r11,r2
+        smlal    r8,r9,r5,r8
+        smlal    r7,r11,r5,r7
+        ldr      r5,[r3,#0x100]
+        ldr      r2,[r1,#0x10]
+        ldr      r6,[r12,#0x680]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x14]
+        ldr      r7,[r12,#0x180]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x18]
+        ldr      r8,[r3,#0x600]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x1c]
+        sub      r11,r11,r5
+        smlal    r8,r9,r6,r8
+        ldr      r2,[r1,#0x20]
+        ldr      r5,[r3,#0x200]
+        smlal    r7,r11,r6,r7
+        ldr      r6,[r12,#0x580]
+        smlal    lr,r9,r2,r5
+        smlal    lr,r11,r2,r6
+        ldr      r2,[r1,#0x24]
+        ldr      r7,[r12,#0x280]
+        smlal    r5,r11,r2,r5
+        smull    r6,r5,r2,r6
+        ldr      r6,[r1,#0x28]
+        ldr      r8,[r3,#0x500]
+        sub      r9,r9,r5
+        smlal    r5,r9,r6,r7
+        smull    r2,r5,r6,r8
+        ldr      r6,[r1,#0x2c]
+        sub      r11,r11,r5
+
+        smlal    r8,r9,r6,r8
+        smlal    r7,r11,r6,r7
+        ldr      r5,[r3,#0x300]
+        ldr      r8,[r1,#0x30]
+        ldr      r6,[r12,#0x480]
+        smlal    r7,r9,r8,r5
+        smlal    r7,r11,r8,r6
+        ldr      r8,[r1,#0x34]
+        ldr      r12,[r12,#0x380]
+        smlal    r5,r11,r8,r5
+        smull    r6,r5,r8,r6
+        ldr      r6,[r1,#0x38]
+
+
+        ldr      r3,[r3,#0x400]
+        sub      r9,r9,r5
+        smlal    r7,r9,r6,r12
+        smull    r8,r7,r6,r3
+        cmp      r4,#0x210
+        sub      r11,r11,r7
+
+        ldr      r2,[r1,#0x3c]
+        add      r1,r1,#0x40
+        smlal    r3,r9,r2,r3
+        smlal    r12,r11,r2,r12
+
+        blt      Loop_i
+
+        mov      r3,r9, asr #6
+        mov      r4,r3, asr #15
+        teq      r4,r3, asr #31
+        ldr      r12,LOW_16BITS
+        ldr      r2,[sp]
+        eorne    r3,r12,r3,asr #31
+        ldr      r4,[sp,#8]
+        mov      r2,r10,lsl r2
+        add      r4,r4,r2,lsl #1
+        strh     r3,[r4]
+
+        mov      r3,r11,asr #6
+        mov      r4,r3,asr #15
+        teq      r4,r3,asr #31
+        eorne    r3,r12,r3,asr #31
+        ldr      r12,[sp,#0xc]
+        ldr      r11,[sp,#8]
+        rsb      r2,r2,r12,lsl #5
+        add      r2,r11,r2,lsl #1
+        strh     r3,[r2]
+
+        add      r10,r10,#1
+        cmp      r10,#0x10
+        blt      Loop_j
+
+; Accumulators r4, r5 Initialization
+
+        mov      r4,#0x20
+        mov      r5,#0x20
+        mov      r3,#0x10
+PolyPh_filter_loop2
+        add      r2,r0,r3,lsl #2
+        ldr      r12,[r2]
+        ldr      r8,[r1]
+        ldr      r6,[r2,#0x80]
+        smlal    r12,r4,r8,r12
+        ldr      r12,[r1,#4]
+        ldr      r7,[r2,#0x40]
+        smlal    r6,r4,r12,r6
+
+        ldr      r12,[r1,#8]
+        ldr      r6,[r2,#0x180]
+        smlal    r7,r5,r12,r7
+        ldr      r12,[r2,#0x100]
+        ldr      r7,[r1,#0xc]
+        ldr      r2,[r2,#0x140]
+        smlal    r12,r4,r7,r12
+        ldr      r12,[r1,#0x10]
+        add      r3,r3,#0x80
+        smlal    r6,r4,r12,r6
+        ldr      r6,[r1,#0x14]
+        cmp      r3,#0x210
+        smlal    r2,r5,r6,r2
+        add      r1,r1,#0x18
+
+        blt      PolyPh_filter_loop2
+        mov      r0,r4,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r1,[sp,#8]
+        eorne    r0,r12,r0,asr #31
+        strh     r0,[r1,#0]
+        mov      r0,r5,asr #6
+        mov      r2,r0,asr #15
+        teq      r2,r0,asr #31
+        ldrne    r12,LOW_16BITS
+        ldr      r2,[sp]
+        mov      r1,#0x10
+        eorne    r0,r12,r0,asr #31
+        ldr      r12,[sp,#8]
+        mov      r1,r1,lsl r2
+        add      r1,r12,r1,lsl #1
+        strh     r0,[r1]
+        add      sp,sp,#0x10
+        ldmfd    sp!,{r4-r11,pc}
+
+
+PolyPh_filter_coeff
+        DCD      pqmfSynthWin
+LOW_16BITS
+        DCD      0x00007fff
+	
+		ENDP  ; |pvmp3_polyphase_filter_window|
+		END
+
diff --git a/media/libstagefright/codecs/mp3dec/src/mp3_mem_funcs.h b/media/libstagefright/codecs/mp3dec/src/mp3_mem_funcs.h
new file mode 100644
index 0000000..46e80223
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/mp3_mem_funcs.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: mp3_mem_funcs.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+------------------------------------------------------------------------------
+
+
+----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#ifndef MP3_MEM_FUNCS_H
+#define MP3_MEM_FUNCS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include <string.h>
+
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+#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)
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+
+#endif
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3_huffman.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3_huffman.h
new file mode 100644
index 0000000..31102ea
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3_huffman.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pv_mp3_huffman.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+*/
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#ifndef PV_MP3_HUFFMAN_H
+#define PV_MP3_HUFFMAN_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.h"
+#include "s_tmp3dec_file.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    int32 pvmp3_huffman_parsing(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    granuleInfo *grInfo,
+    tmp3dec_file   *pVars,
+    int32 part2_start,
+    mp3Header *info);
+
+
+    void pvmp3_huffman_quad_decoding(struct huffcodetab *h,
+                                     int32 *is,
+                                     tmp3Bits *pMainData);
+
+    void pvmp3_huffman_pair_decoding(struct huffcodetab *h,
+                                     int32 *is,
+                                     tmp3Bits *pMainData);
+
+
+    void pvmp3_huffman_pair_decoding_linbits(struct huffcodetab *h,
+            int32 *is,
+            tmp3Bits *pMainData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op.h
new file mode 100644
index 0000000..f14e2de
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op.h
@@ -0,0 +1,84 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pv_mp3dec_fxd_op.h
+
+     Date: 09/21/2007
+
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file select the associated fixed point functions with the OS/ARCH.
+
+
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_MP3DEC_FXD_OP_H
+#define PV_MP3DEC_FXD_OP_H
+
+#include "pvmp3_audio_type_defs.h"
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
+
+#include "pv_mp3dec_fxd_op_arm.h"
+
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+#include "pv_mp3dec_fxd_op_arm_gcc.h"
+
+#elif (defined(PV_ARM_MSC_EVC_V5)||defined(PV_ARM_MSC_EVC_V4))
+
+#include "pv_mp3dec_fxd_op_msc_evc.h"
+
+#else
+
+#ifndef C_EQUIVALENT
+#define C_EQUIVALENT
+#endif
+
+#include "pv_mp3dec_fxd_op_c_equivalent.h"
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif  /* PV_MP3DEC_FXD_OP_H */
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm.h
new file mode 100644
index 0000000..76a8229
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm.h
+
+     Date: 08/20/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file select the associated fixed point functions with the OS/ARCH.
+
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_MP3DEC_FXD_OP_ARM
+#define PV_MP3DEC_FXD_OP_ARM
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "pvmp3_audio_type_defs.h"
+
+
+#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
+
+
+    __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
+    {
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov   result64_lo, result64_lo, lsr #30
+            add   result64_hi, result64_lo, result64_hi, asl  #2
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            add L_add, L_add, result64_hi, asl  #2
+            add L_add, L_add, result64_lo, lsr  #30
+        }
+        return (L_add);
+    }
+
+
+
+#define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+
+
+    __inline  Int32 fxp_mul32_Q32(Int32 L_var1, const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        __asm
+        {
+            smull L_var1, result64_hi, L_var2, L_var1
+        }
+        return (result64_hi);
+    }
+
+    __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
+    {
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov   result64_lo, result64_lo, lsr #28
+            add   result64_hi, result64_lo, result64_hi, asl  #4
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
+    {
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov   result64_lo, result64_lo, lsr #27
+            add   result64_hi, result64_lo, result64_hi, asl  #5
+        }
+        return (result64_hi);
+    }
+
+
+    __inline  Int32 fxp_mul32_Q26(Int32 L_var1,  Int32 L_var2)
+    {
+
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov   result64_lo, result64_lo, lsr #26
+            add   result64_hi, result64_lo, result64_hi, asl  #6
+        }
+        return (result64_hi);
+    }
+
+
+
+    __inline  Int32 fxp_mac32_Q32(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
+    {
+        __asm
+        {
+            smlal L_var1, L_add, L_var2, L_var1
+        }
+        return L_add;
+    }
+
+
+    __inline  Int32 fxp_msb32_Q32(Int32 L_sub,  Int32 L_var1, Int32 L_var2)
+    {
+
+        __asm
+        {
+            smull  L_var2, L_var1, L_var2, L_var1
+            sub  L_sub, L_sub, L_var1
+        }
+        return L_sub;
+    }
+
+
+    __inline  Int32 fxp_mul32_Q29(const Int32 L_var1,  const Int32 L_var2)
+    {
+        Int32 result64_hi;
+        Int32 result64_lo;
+        __asm
+        {
+            smull result64_lo, result64_hi, L_var2, L_var1
+            mov   result64_lo, result64_lo, lsr #29
+            add   result64_hi, result64_lo, result64_hi, asl  #3
+        }
+        return (result64_hi);
+    }
+
+
+    __inline int32 pv_abs(int32 a)
+    {
+        Int32 b;
+        /*
+            b = a - (a<0);
+            a = b ^ sign(b)
+         */
+        __asm
+        {
+            sub  b, a, a, lsr #31
+            eor  a, b, b, asr #31
+        }
+        return (a);
+    }
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  PV_MP3DEC_FXD_OP_ARM  */
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm_gcc.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm_gcc.h
new file mode 100644
index 0000000..71fbd20
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_arm_gcc.h
@@ -0,0 +1,252 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm_gcc.h
+
+     Date: 08/20/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file select the associated fixed point functions with the OS/ARCH.
+
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_MP3DEC_FXD_OP_ARM_GCC_H
+#define PV_MP3DEC_FXD_OP_ARM_GCC_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "pvmp3_audio_type_defs.h"
+
+
+#if (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+#define Qfmt_31(a)   (int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+#define Qfmt15(x)   (Int16)(x*((int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+    static inline int32 fxp_mul32_Q30(const int32 a, const int32 b)
+    {
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov   %1, %1, lsr #30\n\t"
+                     "add   %0, %1, %0, asl #2"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+    }
+
+
+    static inline int32 fxp_mac32_Q30(const int32 a, const int32 b, int32 L_add)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        register int32 rc = (int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %4, %4, %0, asl #2\n\t"
+                     "add %0, %4, %1, lsr #30"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+
+
+    static inline int32 fxp_mul32_Q32(const int32 a, const int32 b)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile(
+            "smull %1, %0, %2, %3"
+    : "=&r*i"(result64_hi),
+            "=&r*i"(result64_lo)
+                    : "r"(ra),
+                    "r"(rb));
+
+        return (result64_hi);
+    }
+
+
+    static inline int32 fxp_mul32_Q29(const int32 a, const int32 b)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov   %1, %1, lsr #29\n\t"
+                     "add   %0, %1, %0, asl #3"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+
+    }
+
+    static inline int32 fxp_mul32_Q28(const int32 a, const int32 b)
+{
+
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov   %1, %1, lsr #28\n\t"
+                     "add   %0, %1, %0, asl #4"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+
+    }
+
+
+    static inline int32 fxp_mul32_Q27(const int32 a, const int32 b)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov   %1, %1, lsr #27\n\t"
+                     "add   %0, %1, %0, asl #5"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+
+    }
+
+
+    static inline int32 fxp_mul32_Q26(const int32 a, const int32 b)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "mov   %1, %1, lsr #26\n\t"
+                     "add   %0, %1, %0, asl #6"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb));
+        return (result64_hi);
+
+    }
+
+
+
+    static inline int32 fxp_mac32_Q32(int32 L_add, const int32 a, const int32 b)
+{
+
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        register int32 rc = (int32)L_add;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "add %0, %0, %4"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+        return (result64_hi);
+    }
+
+    static inline int32 fxp_msb32_Q32(int32 L_sub, const int32 a, const int32 b)
+{
+        int32 result64_hi;
+        int32 result64_lo;
+        register int32 ra = (int32)a;
+        register int32 rb = (int32)b;
+        register int32 rc = (int32)L_sub;
+
+        asm volatile("smull %1, %0, %2, %3\n\t"
+                     "sub %0, %4, %0"
+             : "=&r*i"(result64_hi),
+                     "=&r*i"(result64_lo)
+                             : "r"(ra),
+                             "r"(rb),
+                             "r"(rc));
+
+
+        return (result64_hi);
+    }
+
+
+    __inline int32 pv_abs(int32 x)
+{
+        register int32 z;
+        register int32 y;
+        register int32 ra = x;
+        asm volatile(
+            "sub  %0, %2, %2, lsr #31\n\t"
+            "eor  %1, %0, %0, asr #31"
+    : "=&r*i"(z),
+            "=&r*i"(y)
+                    : "r"(ra));
+
+        return (y);
+    }
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  PV_MP3DEC_FXD_OP_ARM_GCC_H  */
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_c_equivalent.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_c_equivalent.h
new file mode 100644
index 0000000..ba43820
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_c_equivalent.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./cpp/include/pv_mp3dec_fxd_op_c_equivalent.h
+
+     Date: 12/06/2005
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_MP3DEC_FXD_OP_C_EQUIVALENT
+#define PV_MP3DEC_FXD_OP_C_EQUIVALENT
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "pvmp3_audio_type_defs.h"
+#define Qfmt_31(a)   (Int32)((float)a*0x7FFFFFFF)
+
+#define Qfmt15(x)   (Int16)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+
+
+    __inline int32 pv_abs(int32 a)
+    {
+        int32 b = (a < 0) ? -a : a;
+        return b;
+    }
+
+
+
+
+    __inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 30);
+    }
+
+    __inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 30));
+    }
+
+    __inline Int32 fxp_mul32_Q32(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 32);
+    }
+
+
+    __inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 28);
+    }
+
+    __inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 27);
+    }
+
+    __inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 26);
+    }
+
+
+    __inline Int32 fxp_mac32_Q32(Int32 L_add, const Int32 a, const Int32 b)
+    {
+        return (L_add + (Int32)(((int64)(a) * b) >> 32));
+    }
+
+    __inline Int32 fxp_msb32_Q32(Int32 L_sub, const Int32 a, const Int32 b)
+    {
+        return (L_sub - ((Int32)(((int64)(a) * b) >> 32)));
+    }
+
+
+    __inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
+    {
+        return (Int32)(((int64)(a) * b) >> 29);
+    }
+
+
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  PV_MP3DEC_FXD_OP_C_EQUIVALENT  */
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_msc_evc.h b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_msc_evc.h
new file mode 100644
index 0000000..271e6b7
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pv_mp3dec_fxd_op_msc_evc.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./cpp/include/pv_mp3dec_fxd_op_msc_evc.h
+
+     Date: 08/20/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This file select the associated fixed point functions with the OS/ARCH.
+
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PV_MP3DEC_FXD_OP_MSC_EVC_H
+#define PV_MP3DEC_FXD_OP_MSC_EVC_H
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include "pvmp3_audio_type_defs.h"
+
+
+#if (defined(PV_ARM_MSC_EVC_V5)||defined(PV_ARM_MSC_EVC_V4))
+#include "armintr.h"
+#include "cmnintrin.h"
+
+
+    __inline int32 fxp_mul32_Q30(const int32 a, const int32 b)
+    {
+        return (int32)(((int64)(a) * b) >> 30);
+    }
+
+
+    __inline int32 fxp_mac32_Q30(const int32 a, const int32 b, int32 L_add)
+    {
+        return (L_add + (int32)(((int64)(a) * b) >> 30));
+    }
+
+
+#define Qfmt_31(a)   (int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
+
+#define Qfmt15(x)   (Int16)(x*((int32)1<<15) + (x>=0?0.5F:-0.5F))
+
+#define fxp_mul32_Q32( a,  b)   _MulHigh( b, a)
+
+
+
+    __inline int32 fxp_mul32_Q28(const int32 a, const int32 b)
+    {
+        return (int32)(((int64)(a) * b) >> 28);
+    }
+
+
+    __inline int32 fxp_mul32_Q27(const int32 a, const int32 b)
+    {
+        return (int32)(((int64)(a) * b) >> 27);
+    }
+
+
+
+    __inline int32 fxp_mul32_Q26(const int32 a, const int32 b)
+    {
+        return (int32)(((int64)(a) * b) >> 26);
+    }
+
+
+    __inline int32 fxp_mac32_Q32(int32 L_add, const int32 a, const int32 b)
+    {
+        return (L_add + _MulHigh(b, a));
+    }
+
+
+    __inline int32 fxp_msb32_Q32(int32 L_sub, const int32 a, const int32 b)
+    {
+        return (L_sub - _MulHigh(b, a));
+    }
+
+
+
+    __inline int32 fxp_mul32_Q29(const int32 a, const int32 b)
+    {
+        return (int32)(((int64)(a) * b) >> 29);
+    }
+
+
+
+    __inline int32 pv_abs(int32 a)
+    {
+        int32 b = (a < 0) ? -a : a;
+        return b;
+    }
+
+
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif   /*  PV_MP3DEC_FXD_OP_MSC_EVC_H  */
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.cpp
new file mode 100644
index 0000000..32c76c6
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_alias_reduction.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    int32 *input_buffer,          Ptr to fequency lines of current channel
+    struct gr_info_s *gr_info,    structure with granuke information for the
+                                  input
+    mp3Header *info               mp3 header information
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Alias Reduction
+
+
+
+    Alias reduction before processing by the IMDCT
+
+                   Csi  +
+     >---------0---------0-------->
+                \       / -
+             Cai \     /
+                  \   /
+                   \ /
+                    \
+                  /  \
+             Cai /    \
+               /       \  +
+     >--------0---------0---------->
+                  Csi  +
+
+      Aliasing Butterfly
+      Alias reduction is not applied to short blocks
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+                1                                ci
+  csi = ----------------           csi = ----------------
+        sqrt( 1 + (ci^2))                sqrt( 1 + (ci^2))
+
+
+  ci = -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037
+
+ ------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_alias_reduction.h"
+#include "pv_mp3dec_fxd_op.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define NUM_BUTTERFLIES 8
+
+#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*a))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int32 c_signal [ NUM_BUTTERFLIES ] =
+{
+
+    Q31_fmt(0.85749292571254f), Q31_fmt(0.88174199731771f),
+    Q31_fmt(0.94962864910273f), Q31_fmt(0.98331459249179f),
+    Q31_fmt(0.99551781606759f), Q31_fmt(0.99916055817815f),
+    Q31_fmt(0.99989919524445f), Q31_fmt(0.99999315507028f)
+
+};
+
+
+const int32 c_alias [ NUM_BUTTERFLIES ] =
+{
+
+    Q31_fmt(-0.51449575542753f), Q31_fmt(-0.47173196856497f),
+    Q31_fmt(-0.31337745420390f), Q31_fmt(-0.18191319961098f),
+    Q31_fmt(-0.09457419252642f), Q31_fmt(-0.04096558288530f),
+    Q31_fmt(-0.01419856857247f), Q31_fmt(-0.00369997467376f)
+};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_alias_reduction(int32 *input_buffer,         /* Ptr to spec values of current channel */
+                           granuleInfo *gr_info,
+                           int32  *used_freq_lines,
+                           mp3Header *info)
+{
+    int32 *ptr1;
+    int32 *ptr2;
+    int32 *ptr3;
+    int32 *ptr4;
+    const int32 *ptr_csi;
+    const int32 *ptr_csa;
+    int32  sblim;
+
+    int32 i, j;
+
+    *used_freq_lines = fxp_mul32_Q32(*used_freq_lines << 16, (int32)(0x7FFFFFFF / (float)18 - 1.0f)) >> 15;
+
+
+    if (gr_info->window_switching_flag &&  gr_info->block_type == 2)
+    {
+        if (gr_info->mixed_block_flag)
+        {
+            sblim = ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2)) ? 3 : 1;
+        }
+        else
+        {
+            return;  /* illegal parameter */
+        }
+    }
+    else
+    {
+        sblim = *used_freq_lines + 1;
+
+        if (sblim > SUBBANDS_NUMBER - 1)
+        {
+            sblim = SUBBANDS_NUMBER - 1;  /* default */
+        }
+
+    }
+
+
+    ptr3 = &input_buffer[17];
+    ptr4 = &input_buffer[18];
+    ptr_csi = c_signal;
+    ptr_csa = c_alias;
+
+    /*   NUM_BUTTERFLIES (=8) butterflies between each pair of sub-bands*/
+
+    for (i = NUM_BUTTERFLIES >> 1; i != 0; i--)
+    {
+        int32 csi1  = *ptr_csi++;
+        int32 csi2  = *ptr_csi++;
+        int32 csa1  = *ptr_csa++;
+        int32 csa2  = *ptr_csa++;
+
+        ptr1 = ptr3;
+        ptr3 -= 2;
+        ptr2 = ptr4;
+        ptr4 += 2;
+
+        /*
+         *  "sblim"  alias-reduction operations between each
+         *  pair of sub-bands
+         */
+
+        for (j = sblim >> 1; j != 0; j--)
+        {
+            int32 y = *ptr2;
+            int32 x = *ptr1 << 1;
+            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
+            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
+            y = *ptr2;
+            x = *ptr1 << 1;
+            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
+            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
+            ptr1 += 19;
+            ptr2 += 17;
+            y = *ptr2;
+            x = *ptr1 << 1;
+            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
+            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
+            y = *ptr2;
+            x = *ptr1 << 1;
+            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
+            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
+            ptr1 += 19;
+            ptr2 += 17;
+
+        }
+
+        if (sblim & 1)
+        {
+            int32 x = *ptr1 << 1;
+            int32 y = *ptr2;
+            *ptr1--  = fxp_msb32_Q32(fxp_mul32_Q32(x, csi1), y << 1, csa1);
+            *ptr2++  = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi1), x, csa1);
+
+            x = *ptr1 << 1;
+            y = *ptr2;
+            *ptr1    = fxp_msb32_Q32(fxp_mul32_Q32(x, csi2), y << 1, csa2);
+            *ptr2    = fxp_mac32_Q32(fxp_mul32_Q32(y << 1, csi2), x, csa2);
+        }
+    }
+
+}
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.h
new file mode 100644
index 0000000..2292d5f
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_alias_reduction.h
@@ -0,0 +1,100 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_alias_reduction.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_ALIAS_REDUCTION_H
+#define PVMP3_ALIAS_REDUCTION_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_alias_reduction(int32 *input_buffer,
+    granuleInfo *gr_info,
+    int32 *used_freq_lines,
+    mp3Header *info);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.cpp
new file mode 100644
index 0000000..20d0d82
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.cpp
@@ -0,0 +1,161 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_crc.cpp
+
+   Functions:
+        getbits_crc
+        calculate_crc
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+getbits_crc
+
+Input
+    tbits *inputStream,     bit stream structure
+    int32 neededBits,       number of bits to read from the bit stream
+    uint32 *crc,            memory location holding calculated crc value
+    uint32 crc_enabled      flag to enable/disable crc checking
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+calculate_crc
+
+Input
+    uint32 data,            data vector
+    uint32 length,          number of element upon the crc will be calculated
+    uint32 *crc,            memory location holding calculated crc value
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+ ------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_getbits.h"
+#include "pvmp3_crc.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
+----------------------------------------------------------------------------*/
+
+uint32 getbits_crc(tmp3Bits *inputStream,  /* bit stream structure */
+                   int32 neededBits, /* number of bits to read from the bit stream */
+                   uint32 *crc,
+                   uint32 crc_enabled)
+{
+    uint32 bits = getNbits(inputStream, neededBits);
+
+    if (crc_enabled)
+    {
+        calculate_crc(bits, neededBits, crc);
+    }
+    return(bits);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void calculate_crc(uint32 data,
+                   uint32 length,
+                   uint32 *crc)
+{
+    uint32  carry;
+    uint32  masking = 1 << length;
+
+    while ((masking >>= 1))
+    {
+        carry = *crc & 0x8000;
+        *crc <<= 1;
+        if (!carry ^ !(data & masking))
+        {
+            *crc ^= CRC16_POLYNOMIAL;
+        }
+    }
+    *crc &= 0xffff;
+}
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.h
new file mode 100644
index 0000000..b7c277a
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_crc.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_crc.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_CRC_H
+#define PVMP3_CRC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.h"
+#include "pvmp3decoder_api.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define         CRC16_POLYNOMIAL        0x8005
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    uint32 getbits_crc(tmp3Bits *inputStream,
+    int32 neededBits,
+    uint32 *crc,
+    uint32 crc_enabled);
+
+
+    void calculate_crc(uint32 data,
+                       uint32 length,
+                       uint32 *crc);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.cpp
new file mode 100644
index 0000000..a71efc4
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.cpp
@@ -0,0 +1,410 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dct_16.cpp
+
+   Functions:
+    dct_16
+    pv_merge_in_place_N32
+    pv_split
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    dct_16
+
+Input
+    int32 vec[],        input vector length 16
+    Int flag            processing direction: forward (1), backward ( 0)
+ Returns
+
+    int32 vec[],        dct length 16
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    pv_merge_in_place_N32
+
+Input
+    int32 vec[],        input vector length 16
+
+ Returns
+
+    int32 vec[],        merged  output of two dct 16 to create a dct 32
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+    pv_split
+
+Input
+    int32 vec[],        input vector length 16
+
+ Returns
+
+    int32 vec[],        splitted even/odd and pre processing rotation
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    dct 16 and tools to assemble a dct32 output
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) )
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dct_16.h"
+#include "pv_mp3dec_fxd_op.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define Qfmt(a)   (int32)(a*((int32)1<<27))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int32 CosTable_dct32[16] =
+{
+    Qfmt_31(0.50060299823520F) ,  Qfmt_31(0.50547095989754F) ,
+    Qfmt_31(0.51544730992262F) ,  Qfmt_31(0.53104259108978F) ,
+    Qfmt_31(0.55310389603444F) ,  Qfmt_31(0.58293496820613F) ,
+    Qfmt_31(0.62250412303566F) ,  Qfmt_31(0.67480834145501F) ,
+    Qfmt_31(0.74453627100230F) ,  Qfmt_31(0.83934964541553F) ,
+
+    Qfmt(0.97256823786196F) ,  Qfmt(1.16943993343288F) ,
+    Qfmt(1.48416461631417F) ,  Qfmt(2.05778100995341F) ,
+    Qfmt(3.40760841846872F) ,  Qfmt(10.19000812354803F)
+};
+
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_dct_16(int32 vec[], int32 flag)
+{
+    int32 tmp0;
+    int32 tmp1;
+    int32 tmp2;
+    int32 tmp3;
+    int32 tmp4;
+    int32 tmp5;
+    int32 tmp6;
+    int32 tmp7;
+    int32 tmp_o0;
+    int32 tmp_o1;
+    int32 tmp_o2;
+    int32 tmp_o3;
+    int32 tmp_o4;
+    int32 tmp_o5;
+    int32 tmp_o6;
+    int32 tmp_o7;
+    int32 itmp_e0;
+    int32 itmp_e1;
+    int32 itmp_e2;
+
+    /*  split input vector */
+
+    tmp_o0 = fxp_mul32_Q32((vec[ 0] - vec[15]), Qfmt_31(0.50241928618816F));
+    tmp0   =  vec[ 0] + vec[15];
+
+    tmp_o7 = fxp_mul32_Q32((vec[ 7] - vec[ 8]) << 3, Qfmt_31(0.63764357733614F));
+    tmp7   =  vec[ 7] + vec[ 8];
+
+    itmp_e0    = fxp_mul32_Q32((tmp0 - tmp7), Qfmt_31(0.50979557910416F));
+    tmp7 = (tmp0 + tmp7);
+
+    tmp_o1 = fxp_mul32_Q32((vec[ 1] - vec[14]), Qfmt_31(0.52249861493969F));
+    tmp1   =  vec[ 1] + vec[14];
+
+    tmp_o6 = fxp_mul32_Q32((vec[ 6] - vec[ 9]) << 1, Qfmt_31(0.86122354911916F));
+    tmp6   =  vec[ 6] + vec[ 9];
+
+
+
+    itmp_e1 = (tmp1 + tmp6);
+    tmp6    = fxp_mul32_Q32((tmp1 - tmp6), Qfmt_31(0.60134488693505F));
+
+
+
+    tmp_o2 = fxp_mul32_Q32((vec[ 2] - vec[13]), Qfmt_31(0.56694403481636F));
+    tmp2   =  vec[ 2] + vec[13];
+    tmp_o5 = fxp_mul32_Q32((vec[ 5] - vec[10]) << 1, Qfmt_31(0.53033884299517F));
+    tmp5   =  vec[ 5] + vec[10];
+
+    itmp_e2 = (tmp2 + tmp5);
+    tmp5    = fxp_mul32_Q32((tmp2 - tmp5), Qfmt_31(0.89997622313642F));
+
+    tmp_o3 = fxp_mul32_Q32((vec[ 3] - vec[12]), Qfmt_31(0.64682178335999F));
+    tmp3   =  vec[ 3] + vec[12];
+    tmp_o4 = fxp_mul32_Q32((vec[ 4] - vec[11]), Qfmt_31(0.78815462345125F));
+    tmp4   =  vec[ 4] + vec[11];
+
+    tmp1   = (tmp3 + tmp4);
+    tmp4   =  fxp_mul32_Q32((tmp3 - tmp4) << 2, Qfmt_31(0.64072886193538F));
+
+    /*  split even part of tmp_e */
+
+    tmp0 = (tmp7 + tmp1);
+    tmp1 = fxp_mul32_Q32((tmp7 - tmp1), Qfmt_31(0.54119610014620F));
+
+    tmp3 = fxp_mul32_Q32((itmp_e1 - itmp_e2) << 1, Qfmt_31(0.65328148243819F));
+    tmp7 = (itmp_e1 + itmp_e2);
+
+    vec[ 0]  = (tmp0 + tmp7) >> 1;
+    vec[ 8]  = fxp_mul32_Q32((tmp0 - tmp7), Qfmt_31(0.70710678118655F));
+    tmp0     = fxp_mul32_Q32((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 4]  =  tmp1 + tmp3 + tmp0;
+    vec[12]  =  tmp0;
+
+    /*  split odd part of tmp_e */
+
+    tmp1 = fxp_mul32_Q32((itmp_e0 - tmp4) << 1, Qfmt_31(0.54119610014620F));
+    tmp7 = itmp_e0 + tmp4;
+
+    tmp3  = fxp_mul32_Q32((tmp6 - tmp5) << 2, Qfmt_31(0.65328148243819F));
+    tmp6 += tmp5;
+
+    tmp4  = fxp_mul32_Q32((tmp7 - tmp6) << 1, Qfmt_31(0.70710678118655F));
+    tmp6 += tmp7;
+    tmp7  = fxp_mul32_Q32((tmp1 - tmp3) << 1, Qfmt_31(0.70710678118655F));
+
+    tmp1    +=  tmp3 + tmp7;
+    vec[ 2]  =  tmp1 + tmp6;
+    vec[ 6]  =  tmp1 + tmp4;
+    vec[10]  =  tmp7 + tmp4;
+    vec[14]  =  tmp7;
+
+
+    // dct8;
+
+    tmp1 = fxp_mul32_Q32((tmp_o0 - tmp_o7) << 1, Qfmt_31(0.50979557910416F));
+    tmp7 = tmp_o0 + tmp_o7;
+
+    tmp6   = tmp_o1 + tmp_o6;
+    tmp_o1 = fxp_mul32_Q32((tmp_o1 - tmp_o6) << 1, Qfmt_31(0.60134488693505F));
+
+    tmp5   = tmp_o2 + tmp_o5;
+    tmp_o5 = fxp_mul32_Q32((tmp_o2 - tmp_o5) << 1, Qfmt_31(0.89997622313642F));
+
+    tmp0 = fxp_mul32_Q32((tmp_o3 - tmp_o4) << 3, Qfmt_31(0.6407288619354F));
+    tmp4 = tmp_o3 + tmp_o4;
+
+    if (!flag)
+    {
+        tmp7   = -tmp7;
+        tmp1   = -tmp1;
+        tmp6   = -tmp6;
+        tmp_o1 = -tmp_o1;
+        tmp5   = -tmp5;
+        tmp_o5 = -tmp_o5;
+        tmp4   = -tmp4;
+        tmp0   = -tmp0;
+    }
+
+
+    tmp2     =  fxp_mul32_Q32((tmp1 -   tmp0) << 1, Qfmt_31(0.54119610014620F));
+    tmp0    +=  tmp1;
+    tmp1     =  fxp_mul32_Q32((tmp7 -   tmp4) << 1, Qfmt_31(0.54119610014620F));
+    tmp7    +=  tmp4;
+    tmp4     =  fxp_mul32_Q32((tmp6 -   tmp5) << 2, Qfmt_31(0.65328148243819F));
+    tmp6    +=  tmp5;
+    tmp5     =  fxp_mul32_Q32((tmp_o1 - tmp_o5) << 2, Qfmt_31(0.65328148243819F));
+    tmp_o1  += tmp_o5;
+
+
+    vec[13]  =  fxp_mul32_Q32((tmp1 -   tmp4) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 5]  =  tmp1 + tmp4 + vec[13];
+
+    vec[ 9]  =  fxp_mul32_Q32((tmp7 -   tmp6) << 1, Qfmt_31(0.70710678118655F));
+    vec[ 1]  =  tmp7 + tmp6;
+
+    tmp4     =  fxp_mul32_Q32((tmp0 - tmp_o1) << 1, Qfmt_31(0.70710678118655F));
+    tmp0    +=  tmp_o1;
+    tmp6     =  fxp_mul32_Q32((tmp2 -   tmp5) << 1, Qfmt_31(0.70710678118655F));
+    tmp2    +=  tmp5 + tmp6;
+    tmp0    +=  tmp2;
+
+    vec[ 1] += tmp0;
+    vec[ 3]  = tmp0 + vec[ 5];
+    tmp2    += tmp4;
+    vec[ 5]  = tmp2 + vec[ 5];
+    vec[ 7]  = tmp2 + vec[ 9];
+    tmp4    += tmp6;
+    vec[ 9]  = tmp4 + vec[ 9];
+    vec[11]  = tmp4 + vec[13];
+    vec[13]  = tmp6 + vec[13];
+    vec[15]  = tmp6;
+
+}
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void pvmp3_merge_in_place_N32(int32 vec[])
+{
+
+
+    int32 temp0;
+    int32 temp1;
+    int32 temp2;
+    int32 temp3;
+
+    temp0   = vec[14];
+    vec[14] = vec[ 7];
+    temp1   = vec[12];
+    vec[12] = vec[ 6];
+    temp2   = vec[10];
+    vec[10] = vec[ 5];
+    temp3   = vec[ 8];
+    vec[ 8] = vec[ 4];
+    vec[ 6] = vec[ 3];
+    vec[ 4] = vec[ 2];
+    vec[ 2] = vec[ 1];
+
+    vec[ 1] = (vec[16] + vec[17]);
+    vec[16] = temp3;
+    vec[ 3] = (vec[18] + vec[17]);
+    vec[ 5] = (vec[19] + vec[18]);
+    vec[18] = vec[9];
+
+    vec[ 7] = (vec[20] + vec[19]);
+    vec[ 9] = (vec[21] + vec[20]);
+    vec[20] = temp2;
+    temp2   = vec[13];
+    temp3   = vec[11];
+    vec[11] = (vec[22] + vec[21]);
+    vec[13] = (vec[23] + vec[22]);
+    vec[22] = temp3;
+    temp3   = vec[15];
+
+    vec[15] = (vec[24] + vec[23]);
+    vec[17] = (vec[25] + vec[24]);
+    vec[19] = (vec[26] + vec[25]);
+    vec[21] = (vec[27] + vec[26]);
+    vec[23] = (vec[28] + vec[27]);
+    vec[24] = temp1;
+    vec[25] = (vec[29] + vec[28]);
+    vec[26] = temp2;
+    vec[27] = (vec[30] + vec[29]);
+    vec[28] = temp0;
+    vec[29] = (vec[30] + vec[31]);
+    vec[30] = temp3;
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+void pvmp3_split(int32 *vect)
+{
+
+    int32 i;
+    const int32 *pt_cosTerms = &CosTable_dct32[15];
+    int32 *pt_vect   = vect;
+    int32 *pt_vect_2 = pt_vect - 1;
+
+    for (i = 3; i != 0; i--)
+    {
+        int32 tmp2 = *(pt_vect);
+        int32 tmp1 = *(pt_vect_2);
+        int32 cosx = *(pt_cosTerms--);
+        *(pt_vect_2--) = (tmp1  + tmp2);
+        *(pt_vect++)   = fxp_mul32_Q27((tmp1 - tmp2), cosx);
+
+        tmp2 = *(pt_vect);
+        tmp1 = *(pt_vect_2);
+        cosx = *(pt_cosTerms--);
+        *(pt_vect_2--) = (tmp1  + tmp2);
+        *(pt_vect++)   = fxp_mul32_Q27((tmp1 - tmp2), cosx);
+
+    }
+
+    for (i = 5; i != 0; i--)
+    {
+        int32 tmp2 = *(pt_vect);
+        int32 tmp1 = *(pt_vect_2);
+        int32 cosx = *(pt_cosTerms--);
+        *(pt_vect_2--) = (tmp1  + tmp2);
+        *(pt_vect++) = fxp_mul32_Q32((tmp1 - tmp2) << 1, cosx);
+
+        tmp2 = *(pt_vect);
+        tmp1 = *(pt_vect_2);
+        cosx = *(pt_cosTerms--);
+        *(pt_vect_2--) = (tmp1  + tmp2);
+        *(pt_vect++) = fxp_mul32_Q32((tmp1 - tmp2) << 1, cosx);
+    }
+
+}
+
+#endif
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.h
new file mode 100644
index 0000000..e8bf76e
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_16.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dct_16.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_DCT_16_H
+#define PVMP3_DCT_16_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_dct_16(int32 vec[], int32 flag);
+
+    void pvmp3_merge_in_place_N32(int32 vec[]);
+
+    void pvmp3_split(int32 *vect);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_6.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_6.cpp
new file mode 100644
index 0000000..4c5fb03
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_6.cpp
@@ -0,0 +1,152 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dct6.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    Int32  vec[]             vector of 6  32-bit integers
+Returns
+    Int32  vec[]             dct computation in-place
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns the dct of length 6 of the input vector
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_mdct_6.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define Qfmt30(a)   (Int32)(a*((Int32)1<<30) + (a>=0?0.5F:-0.5F))
+
+#define cos_pi_6     Qfmt30(  0.86602540378444f)
+#define cos_2_pi_6   Qfmt30(  0.5f)
+#define cos_7_pi_12  Qfmt30( -0.25881904510252f)
+#define cos_3_pi_12  Qfmt30(  0.70710678118655f)
+#define cos_11_pi_12 Qfmt30( -0.96592582628907f)
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_dct_6(int32 vec[])
+{
+
+    Int32 tmp0;
+    Int32 tmp1;
+    Int32 tmp2;
+    Int32 tmp3;
+    Int32 tmp4;
+    Int32 tmp5;
+
+
+    /*  split input vector */
+
+    tmp0 =  vec[5] + vec[0];
+    tmp5 =  vec[5] - vec[0];
+    tmp1 =  vec[4] + vec[1];
+    tmp4 =  vec[4] - vec[1];
+    tmp2 =  vec[3] + vec[2];
+    tmp3 =  vec[3] - vec[2];
+
+    vec[0]  = tmp0 + tmp2 ;
+    vec[2]  = fxp_mul32_Q30(tmp0 - tmp2,   cos_pi_6);
+    vec[4]  = (vec[0] >> 1) - tmp1;
+    vec[0] += tmp1;
+
+    tmp0    =  fxp_mul32_Q30(tmp3,  cos_7_pi_12);
+    tmp0    =  fxp_mac32_Q30(tmp4,  -cos_3_pi_12, tmp0);
+    vec[1]  =  fxp_mac32_Q30(tmp5,  cos_11_pi_12, tmp0);
+
+    vec[3]  =  fxp_mul32_Q30((tmp3 + tmp4  - tmp5), cos_3_pi_12);
+    tmp0    =  fxp_mul32_Q30(tmp3, cos_11_pi_12);
+    tmp0    =  fxp_mac32_Q30(tmp4,  cos_3_pi_12, tmp0);
+    vec[5]  =  fxp_mac32_Q30(tmp5,  cos_7_pi_12, tmp0);
+
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_9.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_9.cpp
new file mode 100644
index 0000000..ce3ec64
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dct_9.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dct_9.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    int32  vec[]             vector of 9  32-bit integers
+Returns
+    int32  vec[]             dct computation in-place
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns the dct of length 9 of the input vector
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_mdct_18.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define Qfmt31(a)   (int32)(a*(0x7FFFFFFF))
+
+#define cos_pi_9    Qfmt31( 0.93969262078591f)
+#define cos_2pi_9   Qfmt31( 0.76604444311898f)
+#define cos_4pi_9   Qfmt31( 0.17364817766693f)
+#define cos_5pi_9   Qfmt31(-0.17364817766693f)
+#define cos_7pi_9   Qfmt31(-0.76604444311898f)
+#define cos_8pi_9   Qfmt31(-0.93969262078591f)
+#define cos_pi_6    Qfmt31( 0.86602540378444f)
+#define cos_5pi_6   Qfmt31(-0.86602540378444f)
+#define cos_5pi_18  Qfmt31( 0.64278760968654f)
+#define cos_7pi_18  Qfmt31( 0.34202014332567f)
+#define cos_11pi_18 Qfmt31(-0.34202014332567f)
+#define cos_13pi_18 Qfmt31(-0.64278760968654f)
+#define cos_17pi_18 Qfmt31(-0.98480775301221f)
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_dct_9(int32 vec[])
+{
+
+    /*  split input vector */
+
+    int32 tmp0 =  vec[8] + vec[0];
+    int32 tmp8 =  vec[8] - vec[0];
+    int32 tmp1 =  vec[7] + vec[1];
+    int32 tmp7 =  vec[7] - vec[1];
+    int32 tmp2 =  vec[6] + vec[2];
+    int32 tmp6 =  vec[6] - vec[2];
+    int32 tmp3 =  vec[5] + vec[3];
+    int32 tmp5 =  vec[5] - vec[3];
+
+    vec[0]  = (tmp0 + tmp2 + tmp3)     + (tmp1 + vec[4]);
+    vec[6]  = ((tmp0 + tmp2 + tmp3) >> 1) - (tmp1 + vec[4]);
+    vec[2]  = (tmp1 >> 1) - vec[4];
+    vec[4]  =  -vec[2];
+    vec[8]  =  -vec[2];
+    vec[4]  = fxp_mac32_Q32(vec[4], tmp0 << 1, cos_2pi_9);
+    vec[8]  = fxp_mac32_Q32(vec[8], tmp0 << 1, cos_4pi_9);
+    vec[2]  = fxp_mac32_Q32(vec[2], tmp0 << 1, cos_pi_9);
+    vec[2]  = fxp_mac32_Q32(vec[2], tmp2 << 1, cos_5pi_9);
+    vec[4]  = fxp_mac32_Q32(vec[4], tmp2 << 1, cos_8pi_9);
+    vec[8]  = fxp_mac32_Q32(vec[8], tmp2 << 1, cos_2pi_9);
+    vec[8]  = fxp_mac32_Q32(vec[8], tmp3 << 1, cos_8pi_9);
+    vec[4]  = fxp_mac32_Q32(vec[4], tmp3 << 1, cos_4pi_9);
+    vec[2]  = fxp_mac32_Q32(vec[2], tmp3 << 1, cos_7pi_9);
+
+    vec[1]  = fxp_mul32_Q32(tmp5 << 1, cos_11pi_18);
+    vec[1]  = fxp_mac32_Q32(vec[1], tmp6 << 1, cos_13pi_18);
+    vec[1]  = fxp_mac32_Q32(vec[1], tmp7 << 1,   cos_5pi_6);
+    vec[1]  = fxp_mac32_Q32(vec[1], tmp8 << 1, cos_17pi_18);
+    vec[3]  = fxp_mul32_Q32((tmp5 + tmp6  - tmp8) << 1, cos_pi_6);
+    vec[5]  = fxp_mul32_Q32(tmp5 << 1, cos_17pi_18);
+    vec[5]  = fxp_mac32_Q32(vec[5], tmp6 << 1,  cos_7pi_18);
+    vec[5]  = fxp_mac32_Q32(vec[5], tmp7 << 1,    cos_pi_6);
+    vec[5]  = fxp_mac32_Q32(vec[5], tmp8 << 1, cos_13pi_18);
+    vec[7]  = fxp_mul32_Q32(tmp5 << 1, cos_5pi_18);
+    vec[7]  = fxp_mac32_Q32(vec[7], tmp6 << 1, cos_17pi_18);
+    vec[7]  = fxp_mac32_Q32(vec[7], tmp7 << 1,    cos_pi_6);
+    vec[7]  = fxp_mac32_Q32(vec[7], tmp8 << 1, cos_11pi_18);
+
+}
+
+
+
+#endif // If not assembly
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dec_defs.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_dec_defs.h
new file mode 100644
index 0000000..6cf8e3e
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dec_defs.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dec_defs.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file has the mp3 decoder common defines.
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_DEC_DEFS_H
+#define PVMP3_DEC_DEFS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3decoder_api.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+#define module(x, POW2)   ((x)&(POW2-1))
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define BUFSIZE   8192   // big enough to hold 4608 bytes == biggest mp3 frame
+
+#define CHAN           2
+#define GRAN           2
+
+
+#define SUBBANDS_NUMBER        32
+#define FILTERBANK_BANDS       18
+#define HAN_SIZE              512
+
+
+/* MPEG Header Definitions - ID Bit Values */
+
+#define MPEG_1              0
+#define MPEG_2              1
+#define MPEG_2_5            2
+#define INVALID_VERSION     -1
+
+/* MPEG Header Definitions - Mode Values */
+
+#define MPG_MD_STEREO           0
+#define MPG_MD_JOINT_STEREO     1
+#define MPG_MD_DUAL_CHANNEL     2
+#define MPG_MD_MONO             3
+
+
+
+#define LEFT        0
+#define RIGHT       1
+
+
+#define SYNC_WORD         (int32)0x7ff
+#define SYNC_WORD_LNGTH   11
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /*----------------------------------------------------------------------------
+    ; STRUCTURES TYPEDEF'S
+    ----------------------------------------------------------------------------*/
+
+    /* Header Information Structure */
+
+    typedef struct
+    {
+        int32 version_x;
+        int32 layer_description;
+        int32 error_protection;
+        int32 bitrate_index;
+        int32 sampling_frequency;
+        int32 padding;
+        int32 extension;
+        int32 mode;
+        int32 mode_ext;
+        int32 copyright;
+        int32 original;
+        int32 emphasis;
+    } mp3Header;
+
+
+    /* Layer III side information. */
+
+    typedef  struct
+    {
+        uint32 part2_3_length;
+        uint32 big_values;
+        int32 global_gain;
+        uint32 scalefac_compress;
+        uint32 window_switching_flag;
+        uint32 block_type;
+        uint32 mixed_block_flag;
+        uint32 table_select[3];
+        uint32 subblock_gain[3];
+        uint32 region0_count;
+        uint32 region1_count;
+        uint32 preflag;
+        uint32 scalefac_scale;
+        uint32 count1table_select;
+
+    } granuleInfo;
+
+    typedef  struct
+    {
+        uint32      scfsi[4];
+        granuleInfo gran[2];
+
+    } channelInfo;
+
+    /* Layer III side info. */
+
+    typedef struct
+    {
+        uint32      main_data_begin;
+        uint32      private_bits;
+        channelInfo ch[2];
+
+    } mp3SideInfo;
+
+    /* Layer III scale factors. */
+    typedef struct
+    {
+        int32 l[23];            /* [cb] */
+        int32 s[3][13];         /* [window][cb] */
+
+    } mp3ScaleFactors;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.cpp
new file mode 100644
index 0000000..8b0250a
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_decode_header.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    tbits  *inputStream,        bit stream
+    mp3Header  *info,
+    uint32 *crc
+ Returns
+
+    mp3Header  *info,           structure holding the parsed mp3 header info
+    uint32 *crc                 initialized crc computation
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    gets mp3 header information
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_decode_header.h"
+#include "pvmp3_crc.h"
+#include "pvmp3_getbits.h"
+#include "pvmp3_seek_synch.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
+----------------------------------------------------------------------------*/
+
+ERROR_CODE pvmp3_decode_header(tmp3Bits  *inputStream,
+                               mp3Header  *info,
+                               uint32 *crc)
+{
+
+    ERROR_CODE err = NO_DECODING_ERROR;
+    uint32  temp;
+
+    /*
+     *  Verify that at least the header is complete
+     */
+    if (inputStream->inputBufferCurrentLength < (SYNC_WORD_LNGTH + 21))
+    {
+        return NO_ENOUGH_MAIN_DATA_ERROR;
+    }
+
+    /*
+     *  MPEG Audio Version ID
+     */
+    temp = getUpTo17bits(inputStream, SYNC_WORD_LNGTH);
+    if ((temp & SYNC_WORD) != SYNC_WORD)
+    {
+        err = pvmp3_header_sync(inputStream);
+
+        if (err != NO_DECODING_ERROR)
+        {
+            return err;
+        }
+    }
+
+    temp = getNbits(inputStream, 21);   // to avoid multiple bitstream accesses
+
+
+    switch (temp >> 19)  /* 2 */
+    {
+        case 0:
+            info->version_x = MPEG_2_5;
+            break;
+        case 2:
+            info->version_x = MPEG_2;
+            break;
+        case 3:
+            info->version_x = MPEG_1;
+            break;
+        default:
+            info->version_x = INVALID_VERSION;
+            err = UNSUPPORTED_LAYER;
+            break;
+    }
+
+    info->layer_description  = 4 - ((temp << 13) >> 30);  /* 2 */
+    info->error_protection   =  !((temp << 15) >> 31);  /* 1 */
+
+    if (info->error_protection)
+    {
+        *crc = 0xffff;           /* CRC start value */
+        calculate_crc((temp << 16) >> 16, 16, crc);
+    }
+
+    info->bitrate_index      = (temp << 16) >> 28;  /* 4 */
+    info->sampling_frequency = (temp << 20) >> 30;  /* 2 */
+    info->padding            = (temp << 22) >> 31;  /* 1 */
+    info->extension          = (temp << 23) >> 31;  /* 1 */
+    info->mode               = (temp << 24) >> 30;  /* 2 */
+    info->mode_ext           = (temp << 26) >> 30;  /* 2 */
+    info->copyright          = (temp << 27) >> 31;  /* 1 */
+    info->original           = (temp << 28) >> 31;  /* 1 */
+    info->emphasis           = (temp << 30) >> 30;  /* 2 */
+
+
+    if (!info->bitrate_index || info->sampling_frequency == 3)
+    {
+        err = UNSUPPORTED_FREE_BITRATE;
+    }
+
+    return(err);
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.h
new file mode 100644
index 0000000..2c2e89e
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_header.h
@@ -0,0 +1,101 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_decode_header.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_DECODE_HEADER_H
+#define PVMP3_DECODE_HEADER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3_dec_defs.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    ERROR_CODE pvmp3_decode_header(tmp3Bits  *inputStream,
+    mp3Header  *info,
+    uint32 *crc);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.cpp
new file mode 100644
index 0000000..6e45a18
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.cpp
@@ -0,0 +1,758 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_decode_huff_cw.cpp
+
+ Funtions:
+    pvmp3_decode_huff_cw_tab0
+    pvmp3_decode_huff_cw_tab1
+    pvmp3_decode_huff_cw_tab2
+    pvmp3_decode_huff_cw_tab3
+    pvmp3_decode_huff_cw_tab5
+    pvmp3_decode_huff_cw_tab6
+    pvmp3_decode_huff_cw_tab7
+    pvmp3_decode_huff_cw_tab8
+    pvmp3_decode_huff_cw_tab9
+    pvmp3_decode_huff_cw_tab10
+    pvmp3_decode_huff_cw_tab11
+    pvmp3_decode_huff_cw_tab12
+    pvmp3_decode_huff_cw_tab13
+    pvmp3_decode_huff_cw_tab15
+    pvmp3_decode_huff_cw_tab16
+    pvmp3_decode_huff_cw_tab24
+    pvmp3_decode_huff_cw_tab32
+    pvmp3_decode_huff_cw_tab33
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    BITS          *pMainData = pointer to input mp3 Main data bit stream
+
+
+ Outputs:
+    cw = bit field extracted from a leaf entry of packed mp3 Huffman Tables
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   These functions are used to decode huffman codewords from the input
+   bitstream using combined binary search and look-up table approach.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+ [2] Introduction to Algorithms,
+     Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest.
+     The MIT press, 1990
+
+ [3] "Selecting an Optimal Huffman Decoder for AAC",
+     Vladimir Z. Mesarovic, et al.
+     AES 111th Convention, September 21-24, 2001, New York, USA
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_tables.h"
+#include "pvmp3_getbits.h"
+#include "pvmp3_decode_huff_cw.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
+----------------------------------------------------------------------------*/
+
+uint16 pvmp3_decode_huff_cw_tab0(tmp3Bits *pMainData)
+{
+    OSCL_UNUSED_ARG(pMainData);
+    return(0);
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab1(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 3);    /*  hufftable1  */
+
+    cw = *(huffTable_1 + tmp);
+    pMainData->usedBits -= (3 - (cw & 0xFF));
+    return(cw >> 8);
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab2(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 6);    /*  huffTable_2,3  */
+
+    if (tmp >> 3)
+    {
+        tmp = (tmp >> 3) - 1;
+    }
+    else
+    {
+        tmp = tmp + 7;
+    }
+
+    cw = *(huffTable_2 + tmp);
+    pMainData->usedBits -= (6 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab3(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 6);    /*  huffTable_2,3  */
+
+    if (tmp >> 3)
+    {
+        tmp = (tmp >> 3) - 1;
+    }
+    else
+    {
+        tmp = tmp + 7;
+    }
+
+    cw = *(huffTable_3 + tmp);
+    pMainData->usedBits -= (6 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab5(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 8);    /*  huffTable_5  */
+
+    if ((tmp >> 5))
+    {
+        tmp = (tmp >> 5) - 1;
+    }
+    else if ((tmp >> 1) >= 2)
+    {
+        tmp = (tmp >> 1) - 2 + 7;
+    }
+    else
+    {
+        tmp = (tmp & 3) + 21;
+    }
+
+    cw = *(huffTable_5 + tmp);
+    pMainData->usedBits -= (8 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab6(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 7);    /*  huffTable_6  */
+    if ((tmp >> 3) >= 3)
+    {
+        tmp = (tmp >> 3) - 3;
+    }
+    else if (tmp >> 1)
+    {
+        tmp = (tmp >> 1) - 1 + 13;
+    }
+    else
+    {
+        tmp = tmp + 24;
+    }
+
+    cw = *(huffTable_6 + tmp);
+    pMainData->usedBits -= (7 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab7(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 10);    /*  huffTable_7  */
+    if ((tmp >> 7) >= 2)
+    {
+        tmp = (tmp >> 7) - 2;
+    }
+    else if ((tmp >> 4) >= 7)
+    {
+        tmp = (tmp >> 4) - 7 + 6;
+    }
+    else if ((tmp >> 1) >=  2)
+    {
+        tmp = (tmp >> 1) - 2 + 15;
+    }
+    else
+    {
+        tmp = (tmp & 3) + 69;
+    }
+
+    cw = *(huffTable_7 + tmp);
+    pMainData->usedBits -= (10 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab8(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 11);    /*  huffTable_8  */
+    if ((tmp >> 7) >= 2)
+    {
+        tmp = (tmp >> 7) - 2;
+    }
+    else if ((tmp >> 5) >= 5)
+    {
+        tmp = (tmp >> 5) - 5 + 14;
+    }
+    else if ((tmp >> 2) >= 3)
+    {
+        tmp = (tmp >> 2) - 3 + 17;
+    }
+    else
+    {
+        tmp = (tmp) + 54;
+    }
+
+    cw = *(huffTable_8 + tmp);
+    pMainData->usedBits -= (11 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab9(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo9bits(pMainData, 9);    /*  huffTable_9  */
+    if ((tmp >> 5) >= 5)
+    {
+        tmp = (tmp >> 5) - 5;
+    }
+    else if ((tmp >> 3) >= 6)
+    {
+        tmp = (tmp >> 3) - 6 + 11;
+    }
+    else if ((tmp >> 1) >= 4)
+    {
+        tmp = (tmp >> 1) - 4 + 25;
+    }
+    else
+    {
+        tmp = tmp + 45;
+    }
+
+    cw = *(huffTable_9 + tmp);
+    pMainData->usedBits -= (9 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab10(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 11);    /*  huffTable_10  */
+    if (tmp >> 10)
+    {
+        tmp = (tmp >> 10) - 1;
+    }
+    else if ((tmp >> 7) >= 3)
+    {
+        tmp = (tmp >> 7) - 3 + 1;
+    }
+    else if ((tmp >> 5) >= 8)
+    {
+        tmp = (tmp >> 5) - 8 + 6;
+    }
+    else if ((tmp >> 3) >= 18)
+    {
+        tmp = (tmp >> 3) - 18 + 10;
+    }
+    else if ((tmp >> 2) >= 24)
+    {
+        tmp = (tmp >> 2) - 24 + 24;
+    }
+    else if ((tmp >> 1) >= 12)
+    {
+        tmp = (tmp >> 1) - 12 + 36;
+    }
+    else
+    {
+        tmp = (tmp) + 72;
+    }
+
+    cw = *(huffTable_10 + tmp);
+    pMainData->usedBits -= (11 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab11(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 11);    /*  huffTable_11  */
+    if ((tmp >> 8) >= 3)
+    {
+        tmp = (tmp >> 8) - 3;
+    }
+    else if ((tmp >> 6) >= 7)
+    {
+        tmp = (tmp >> 6) - 7 + 5;
+    }
+    else if ((tmp >> 3) >= 32)
+    {
+        tmp = (tmp >> 3) - 32 + 10;
+    }
+    else if ((tmp >> 2) >= 10)
+    {
+        tmp = (tmp >> 2) - 10 + 34;
+    }
+    else if ((tmp >> 1) >= 8)
+    {
+        tmp = (tmp >> 1) - 8 + 88;
+    }
+    else
+    {
+        tmp = (tmp & 0xFF) + 100;
+    }
+    cw = *(huffTable_11 + tmp);
+    pMainData->usedBits -= (11 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab12(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 10);    /*  huffTable_12  */
+    if ((tmp >> 7) >= 5)
+    {
+        tmp = (tmp >> 7) - 5;
+    }
+    else if ((tmp >> 5) >= 12)
+    {
+        tmp = (tmp >> 5) - 12 + 3;
+    }
+    else if ((tmp >> 4) >= 17)
+    {
+        tmp = (tmp >> 4) - 17 + 11;
+    }
+    else if ((tmp >> 2) >= 32)
+    {
+        tmp = (tmp >> 2) - 32 + 18;
+    }
+    else if ((tmp >> 1) >= 16)
+    {
+        tmp = (tmp >> 1) - 16 + 54;
+    }
+    else
+    {
+        tmp = (tmp & 0x1F) + 102;
+
+    }
+    cw = *(huffTable_12 + tmp);
+    pMainData->usedBits -= (10 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab13(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getNbits(pMainData, 19);    /*  huffTable_13  */
+    if (tmp >> 18)
+    {
+        tmp = 0;
+    }
+    else if ((tmp >> 15) >= 4)
+    {
+        tmp = (tmp >> 15) - 4 + 1;
+    }
+    else if ((tmp >> 11) >= 32)
+    {
+        tmp = (tmp >> 11) - 32 + 5;
+    }
+    else if ((tmp >> 9) >= 64)
+    {
+        tmp = (tmp >> 9) - 64 + 37;
+    }
+    else if ((tmp >> 8) >= 64)
+    {
+        tmp = (tmp >> 8) - 64 + 101;
+    }
+    else if ((tmp >> 7) >= 64)
+    {
+        tmp = (tmp >> 7) - 64 + 165;
+    }
+    else if ((tmp >> 6) >= 32)
+    {
+        tmp = (tmp >> 6) - 32 + 229;
+    }
+    else if ((tmp >> 5) >= 32)
+    {
+        tmp = (tmp >> 5) - 32 + 325;
+    }
+    else if ((tmp >> 4) >= 32)
+    {
+        tmp = (tmp >> 4) - 32 + 357;
+    }
+    else if ((tmp >> 3) >= 32)
+    {
+        tmp = (tmp >> 3) - 32 + 389;
+    }
+    else if ((tmp >> 2) >= 2)
+    {
+        tmp = (tmp >> 2) - 2 + 421;
+    }
+    else
+    {
+        tmp = (tmp & 0x7) + 483;
+    }
+
+    cw = *(huffTable_13 + tmp);
+    pMainData->usedBits -= (19 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab15(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 13);    /*  huffTable_15  */
+    if ((tmp >> 9) >= 10)
+    {
+        tmp = (tmp >> 9) - 10;
+    }
+    else if ((tmp >> 6) >= 39)
+    {
+        tmp = (tmp >> 6) - 39 + 6;
+    }
+    else if ((tmp >> 4) >= 62)
+    {
+        tmp = (tmp >> 4) - 62 + 47;
+    }
+    else if ((tmp >> 3) >= 60)
+    {
+        tmp = (tmp >> 3) - 60 + 141;
+    }
+    else if ((tmp >> 2) >= 64)
+    {
+        tmp = (tmp >> 2) - 64 + 205;
+    }
+    else if ((tmp >> 1) >= 32)
+    {
+        tmp = (tmp >> 1) - 32 + 261;
+    }
+    else
+    {
+        tmp = (tmp & 0x3f) + 357;
+    }
+
+    cw = *(huffTable_15 + tmp);
+    pMainData->usedBits -= (13 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab16(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 17);    /*  huffTable_16  */
+    if (tmp >> 16)
+    {
+        tmp = 0;
+    }
+    else if ((tmp >> 13) >= 4)
+    {
+        tmp = (tmp >> 13) - 4 + 1;
+    }
+    else if ((tmp >> 9) >= 38)
+    {
+        tmp = (tmp >> 9) - 38 + 5;
+    }
+    else if ((tmp >> 7) >= 94)
+    {
+        tmp = (tmp >> 7) - 94 + 31;
+    }
+    else if ((tmp >> 5) >= 214)
+    {
+        tmp = (tmp >> 5) - 214 + 89;
+    }
+    else if ((tmp >> 3) >= 704)
+    {
+        if ((tmp >> 4) >= 384)
+        {
+            tmp = (tmp >> 4) - 384 + 315;
+        }
+        else
+        {
+            tmp = (tmp >> 3) - 704 + 251;
+        }
+    }
+    else if ((tmp >> 8) >= 14)
+    {
+        tmp = (tmp >> 8) - 14 + 359;
+    }
+    else if ((tmp) >= 3456)
+    {
+        if ((tmp >> 2) >= 868)
+        {
+            tmp = (tmp >> 2) - 868 + 383;
+        }
+        else
+        {
+            tmp = (tmp) - 3456 + 367;
+        }
+    }
+    else
+    {
+        tmp = ((tmp >> 6) & 0x3f) + 411;
+    }
+
+    cw = *(huffTable_16 + tmp);
+    pMainData->usedBits -= (17 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab24(tmp3Bits *pMainData)
+{
+    uint32 tmp;
+    uint16 cw;
+
+    tmp = getUpTo17bits(pMainData, 12);    /*  huffTable_24  */
+    if ((tmp >> 6) >= 41)
+    {
+        tmp = (tmp >> 6) - 41;
+    }
+    else if ((tmp >> 3) >= 218)
+    {
+        tmp = (tmp >> 3) - 218 + 23;
+    }
+    else if ((tmp >> 2) >= 336)
+    {
+        tmp = (tmp >> 2) - 336 + 133;
+    }
+    else if ((tmp >> 1) >= 520)
+    {
+        tmp = (tmp >> 1) - 520 + 233;
+    }
+    else if ((tmp) >= 1024)
+    {
+        tmp = (tmp) - 1024 + 385;
+    }
+    else if ((tmp >> 1) >= 352)
+    {
+        if ((tmp >> 8) == 3)
+        {
+            tmp = (tmp >> 8) - 3 + 433;
+        }
+        else
+        {
+            tmp = (tmp >> 1) - 352 + 401;
+        }
+    }
+    else
+    {
+        tmp = ((tmp >> 4) & 0x3f) + 434;
+    }
+
+    cw = *(huffTable_24 + tmp);
+    pMainData->usedBits -= (12 - (cw & 0xFF));
+
+    return(cw >> 8);
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+uint16 pvmp3_decode_huff_cw_tab32(tmp3Bits *pMainData)
+{
+    uint32 tmp = getUpTo9bits(pMainData, 6);    /*  huffTable_32  */
+    if ((tmp >> 5))
+    {
+        pMainData->usedBits -= 5;
+        return(0);
+    }
+    else
+    {
+        uint16 cw = *(huffTable_32 + (tmp & 0x1f));
+        pMainData->usedBits -= (6 - (cw & 0xFF));
+
+        return(cw >> 8);
+    }
+
+}
+
+
+uint16 pvmp3_decode_huff_cw_tab33(tmp3Bits *pMainData)
+{
+
+    uint16 tmp = getUpTo9bits(pMainData, 4);    /*  huffTable_33  */
+
+    return((0x0f - tmp));
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.h
new file mode 100644
index 0000000..941ca6d
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_decode_huff_cw.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_decode_huff_cw.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_DECODE_HUFF_CW_H
+#define PVMP3_DECODE_HUFF_CW_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3_dec_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    uint16 pvmp3_decode_huff_cw_tab0(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab1(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab2(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab3(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab5(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab6(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab7(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab8(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab9(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab10(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab11(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab12(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab13(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab15(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab16(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab24(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab32(tmp3Bits *);
+    uint16 pvmp3_decode_huff_cw_tab33(tmp3Bits *);
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.cpp
new file mode 100644
index 0000000..69e1987
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.cpp
@@ -0,0 +1,452 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dequantize_sample.cpp
+
+   Functions:
+      power_1_third
+      pvmp3_dequantize_sample
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+power_1_third
+int32 power_1_third( int32 xx)
+
+Input
+    int32           xx,                     int32 in the [0, 8192] range
+
+ Returns
+
+    int32           xx^(1/3)                int32 Q26 number representing
+                                            the 1/3 power of the input
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+pvmp3_dequantize_sample
+
+Input
+    int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    mp3ScaleFactors *scalefac,                 scale factor structure
+    struct gr_info_s *gr_info,                 granule structure informatiom
+    mp3Header *info                            mp3 header info
+
+ Returns
+
+    int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS], dequantize output as (.)^(4/3)
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    dequantize sample
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_dequantize_sample.h"
+#include "pvmp3_normalize.h"
+#include "mp3_mem_funcs.h"
+#include "pvmp3_tables.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define Q30_fmt(a)(int32(double(0x40000000)*a))
+#define Q29_fmt(a)(int32(double(0x20000000)*a))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int32 pretab[22] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0};
+
+const int32 pow_2_1_fourth[4] =
+{
+    Q30_fmt(1.0),                Q30_fmt(1.18920711500272),
+    Q30_fmt(1.41421356237310),   Q30_fmt(1.68179283050743)
+};
+
+const int32 two_cubic_roots[7] =
+{
+    Q29_fmt(0),                  Q29_fmt(1.25992104989487),
+    Q29_fmt(1.58740105196820),   Q29_fmt(2.00000000000000),
+    Q29_fmt(2.51984209978975),   Q29_fmt(3.17480210393640),
+    Q29_fmt(3.99999999999999)
+};
+
+/*----------------------------------------------------------------------------
+; 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
+----------------------------------------------------------------------------*/
+
+
+int32 power_1_third(int32 xx)
+{
+
+    if (xx <= 512)
+    {
+        return (power_one_third[xx] >> 1);
+    }
+    else
+    {
+        if (xx >> 15)
+        {
+            return 0x7FFFFFFF;  /* saturate any value over 32767 */
+        }
+        else
+        {
+            int32 x = xx;
+            int32 m = 22 - pvmp3_normalize(xx);
+
+            xx >>= m;
+            xx = (power_one_third[xx]) + (((power_one_third[xx+1] - power_one_third[xx]) >> m) * (x & ((1 << m) - 1)));
+            return (fxp_mul32_Q30(xx, two_cubic_roots[m]));
+        }
+
+    }
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+
+void pvmp3_dequantize_sample(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                             mp3ScaleFactors *scalefac,
+                             granuleInfo *gr_info,
+                             int32  used_freq_lines,
+                             mp3Header *info)
+{
+    int32 ss;
+    int32 cb = 0;
+    int32 global_gain;
+    int32 sfreq = info->sampling_frequency + info->version_x + (info->version_x << 1);
+
+    /* apply formula per block type */
+
+    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
+    {
+        int32 next_cb_boundary;
+        int32 cb_begin = 0;
+        int32 cb_width = 0;
+        int32 mixstart = 8;                                       /* added 2003/08/21  efs */
+
+        if (info->version_x != MPEG_1)
+        {
+            mixstart = 6;                                   /* different value in MPEG2 LSF */
+        }
+
+        if (gr_info->mixed_block_flag)
+        {
+            next_cb_boundary = mp3_sfBandIndex[sfreq].l[1];  /* LONG blocks: 0,1,3 */
+        }
+        else
+        {
+            next_cb_boundary = mp3_sfBandIndex[sfreq].s[1] * 3; /* pure SHORT block */
+            cb_width = 0;
+        }
+
+        global_gain =  gr_info->global_gain;
+        int32 two_raise_one_fourth = pow_2_1_fourth[global_gain&0x3];
+        global_gain = 12 + (global_gain >> 2);
+
+        for (ss = 0 ; ss < used_freq_lines ; ss++)
+        {
+            if (ss == next_cb_boundary)
+            {
+                cb++;       /*  critical band counter */
+                if (gr_info->mixed_block_flag)
+                {
+                    if (next_cb_boundary == mp3_sfBandIndex[sfreq].l[mixstart])
+                    {
+                        next_cb_boundary = mp3_sfBandIndex[sfreq].s[4] * 3;
+
+                        cb_begin = mp3_sfBandIndex[sfreq].s[3] * 3;
+                        cb_width = 3;
+                        cb = 3;
+                    }
+                    else if (ss < mp3_sfBandIndex[sfreq].l[mixstart])
+                    {
+                        next_cb_boundary = mp3_sfBandIndex[sfreq].l[cb+1];
+                    }
+                    else
+                    {
+                        next_cb_boundary = mp3_sfBandIndex[sfreq].s[cb+1] * 3;
+
+                        cb_width = cb;
+                        cb_begin = mp3_sfBandIndex[sfreq].s[cb] * 3;
+                    }
+
+                    if (ss < 2*FILTERBANK_BANDS)
+                    {   /*  1st 2 subbands of switched blocks */
+                        global_gain  = (gr_info->global_gain);
+                        global_gain -= (1 + gr_info->scalefac_scale) *
+                                       (scalefac->l[cb] + gr_info->preflag * pretab[cb]) << 1;
+
+                        two_raise_one_fourth = pow_2_1_fourth[global_gain&0x3];
+                        global_gain = 12 + (global_gain >> 2);
+                    }
+                }
+                else
+                {
+                    next_cb_boundary = mp3_sfBandIndex[sfreq].s[cb+1] * 3;
+                    cb_width = cb;
+                    cb_begin = mp3_sfBandIndex[sfreq].s[cb] * 3;
+                }
+
+            }   /*  end-if ( ss == next_cb_boundary) */
+
+            /* Do long/short dependent scaling operations. */
+            if ((gr_info->mixed_block_flag == 0) || (gr_info->mixed_block_flag && (ss >= 2*FILTERBANK_BANDS)))
+            {
+                int32 temp2 = fxp_mul32_Q32((ss - cb_begin) << 16, mp3_shortwindBandWidths[sfreq][cb_width]);
+                temp2 = (temp2 + 1) >> 15;
+
+                global_gain  = (gr_info->global_gain);
+                global_gain -=  gr_info->subblock_gain[temp2] << 3;
+                global_gain -= (1 + gr_info->scalefac_scale) * (scalefac->s[temp2][cb] << 1);
+
+                two_raise_one_fourth = pow_2_1_fourth[global_gain&0x3];
+                global_gain = 12 + (global_gain >> 2);
+
+            }
+
+
+            /*
+             *       xr[sb][ss] = 2^(global_gain/4)
+             */
+
+            /* Scale quantized value. */
+
+            /* 0 < abs(is[ss]) < 8192 */
+
+            int32 tmp = fxp_mul32_Q30((is[ss] << 16), power_1_third(pv_abs(is[ ss])));
+
+            tmp = fxp_mul32_Q30(tmp, two_raise_one_fourth);
+
+            if (global_gain < 0)
+            {
+                int32 temp = - global_gain;
+                if (temp < 32)
+                {
+                    is[ss] = (tmp >> temp);
+                }
+                else
+                {
+                    is[ss] = 0;
+                }
+            }
+            else
+            {
+                is[ss] = (tmp << global_gain);
+            }
+
+        }  /*   for (ss=0 ; ss < used_freq_lines ; ss++)   */
+
+    }
+    else
+    {
+
+        for (cb = 0 ; cb < 22 ; cb++)
+        {
+
+            /* Compute overall (global) scaling. */
+
+            global_gain  = (gr_info->global_gain);
+
+            global_gain -= (1 + gr_info->scalefac_scale) *
+                           (scalefac->l[cb] + gr_info->preflag * pretab[cb]) << 1;
+
+
+            int32 two_raise_one_fourth = pow_2_1_fourth[global_gain&0x3];
+            global_gain = 12 + (global_gain >> 2);
+
+            /*
+             *       xr[sb][ss] = 2^(global_gain/4)
+             */
+
+            /* Scale quantized value. */
+
+            if (used_freq_lines >= mp3_sfBandIndex[sfreq].l[cb+1])
+            {
+                if (global_gain <= 0)
+                {
+                    global_gain = - global_gain;
+                    if (global_gain < 32)
+                    {
+                        for (ss = mp3_sfBandIndex[sfreq].l[cb]; ss < mp3_sfBandIndex[sfreq].l[cb+1]; ss += 2)
+                        {
+                            int32 tmp =  is[ss];
+                            if (tmp)
+                            {
+                                tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                                is[ss] = fxp_mul32_Q30(tmp, two_raise_one_fourth) >> global_gain;
+                            }
+                            tmp =  is[ss+1];
+                            if (tmp)
+                            {
+                                tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                                is[ss+1] = fxp_mul32_Q30(tmp, two_raise_one_fourth) >> global_gain;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        pv_memset(&is[ mp3_sfBandIndex[sfreq].l[cb]],
+                                  0,
+                                  (mp3_sfBandIndex[sfreq].l[cb+1] - mp3_sfBandIndex[sfreq].l[cb])*sizeof(*is));
+                    }
+                }
+                else
+                {
+                    for (ss = mp3_sfBandIndex[sfreq].l[cb]; ss < mp3_sfBandIndex[sfreq].l[cb+1]; ss += 2)
+                    {
+                        int32 tmp =  is[ss];
+                        if (tmp)
+                        {
+                            tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                            is[ss] = fxp_mul32_Q30(tmp, two_raise_one_fourth) << global_gain;
+                        }
+
+                        tmp =  is[ss+1];
+                        if (tmp)
+                        {
+                            tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                            is[ss+1] = fxp_mul32_Q30(tmp, two_raise_one_fourth) << global_gain;
+                        }
+                    }
+                }
+            }
+            else
+            {
+                if (global_gain <= 0)
+                {
+                    global_gain = - global_gain;
+                    if (global_gain < 32)
+                    {
+                        for (ss = mp3_sfBandIndex[sfreq].l[cb]; ss < used_freq_lines; ss += 2)
+                        {
+                            int32 tmp =  is[ss];
+                            if (tmp)
+                            {
+                                tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                                is[ss] = fxp_mul32_Q30(tmp, two_raise_one_fourth) >> global_gain;
+                            }
+                            tmp =  is[ss+1];
+                            if (tmp)
+                            {
+                                tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                                is[ss+1] = fxp_mul32_Q30(tmp, two_raise_one_fourth) >> global_gain;
+                            }
+                        }
+
+                    }
+                    else
+                    {
+                        pv_memset(&is[ mp3_sfBandIndex[sfreq].l[cb]],
+                                  0,
+                                  (mp3_sfBandIndex[sfreq].l[cb+1] - mp3_sfBandIndex[sfreq].l[cb])*sizeof(*is));
+                    }
+                }
+                else
+                {
+                    for (ss = mp3_sfBandIndex[sfreq].l[cb]; ss < used_freq_lines; ss++)
+                    {
+                        int32 tmp =  is[ss];
+
+                        if (tmp)
+                        {
+                            tmp = fxp_mul32_Q30((tmp << 16), power_1_third(pv_abs(tmp)));
+                            is[ss] = fxp_mul32_Q30(tmp, two_raise_one_fourth) << global_gain;
+                        }
+                    }
+                }
+
+                cb = 22;  // force breaking out of the loop
+
+            } /*  if ( used_freq_lines >= mp3_sfBandIndex[sfreq].l[cb+1]) */
+
+        }   /* for (cb=0 ; cb < 22 ; cb++)  */
+
+    }   /*  if (gr_info->window_switching_flag && (gr_info->block_type == 2))  */
+
+
+    pv_memset(&is[used_freq_lines],
+              0,
+              (FILTERBANK_BANDS*SUBBANDS_NUMBER - used_freq_lines)*sizeof(*is));
+
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.h
new file mode 100644
index 0000000..9393eb1
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_dequantize_sample.h
@@ -0,0 +1,106 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_dequantize_sample.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_DEQUANTIZE_SAMPLE_H
+#define PVMP3_DEQUANTIZE_SAMPLE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    int32 power_1_third(int32 xx);
+
+    void pvmp3_dequantize_sample(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                                 mp3ScaleFactors *scalefac,
+                                 granuleInfo *gr_info,
+                                 int32  num_lines,
+                                 mp3Header *info);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.cpp
new file mode 100644
index 0000000..f4a4efb
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.cpp
@@ -0,0 +1,415 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_equalizer.cpp
+
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+  Input
+    int32          *inData,           pointer to the spectrum frequency-line
+    e_equalization equalizerType,     equalization mode
+    int32          *pt_work_buff
+
+  Output
+    int32          *pt_work_buff      pointer to the equalized frequency-line
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Equalizer
+    Each subband sample is scaled according to a spectrum shape setting
+    defined by "equalizerType"
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_equalizer.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LEVEL__0__dB  0.999999970f
+#define LEVEL__1_5dB  0.841395142f
+#define LEVEL__3__dB  0.707106781f
+#define LEVEL__4_5dB  0.595662143f
+#define LEVEL__6__dB  0.500000000f
+#define LEVEL__7_5dB  0.421696503f
+#define LEVEL__9__dB  0.353553393f
+#define LEVEL_12__dB  0.250000000f
+#define LEVEL_15__dB  0.176776695f
+#define LEVEL_18__dB  0.125000000f
+#define LEVEL_21__dB  0.088388347f
+#define LEVEL_30__dB  0.031250000f
+#define LEVEL_45__dB  0.005524271f
+#define LEVEL_60__dB  0.000976562f
+
+#define Qmf31( x)    (int32)(x*(float)0x7FFFFFFF)
+
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+
+const int32 equalizerTbl[8][SUBBANDS_NUMBER] =
+{
+    /*  FLAT */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB)
+    },
+    /*  BASS BOOST */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__3__dB),
+
+        Qmf31(LEVEL__4_5dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB)
+    },
+    /*  ROCK */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__3__dB),
+
+        Qmf31(LEVEL__4_5dB), Qmf31(LEVEL__6__dB),
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB)
+    },
+    /*  POP */
+    {
+        Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+
+        Qmf31(LEVEL__1_5dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB)
+    },
+    /*  JAZZ */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB)
+    },
+    /*  CLASSICAL */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+        Qmf31(LEVEL__9__dB), Qmf31(LEVEL__9__dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__1_5dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB)
+    },
+    /*  TALK */
+    {
+        Qmf31(LEVEL__9__dB),
+
+        Qmf31(LEVEL__6__dB), Qmf31(LEVEL__6__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__1_5dB),
+
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB), Qmf31(LEVEL__3__dB),
+        Qmf31(LEVEL__3__dB)
+    },
+    /*  FLAT */
+    {
+        Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB), Qmf31(LEVEL__0__dB),
+        Qmf31(LEVEL__0__dB)
+    }
+};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_equalizer(int32 *circ_buffer,
+                     e_equalization equalizerType,
+                     int32 *work_buff)
+{
+
+    if (equalizerType == flat)
+    {
+        for (int32 band = 0; band < FILTERBANK_BANDS; band += 2)
+        {
+
+            int32 *pt_work_buff = &work_buff[band];
+            int32 *inData = &circ_buffer[544 - (band<<5)];
+
+            int32 i;
+            for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
+            {
+                int32 temp1 = (pt_work_buff[ i ]);
+                int32 temp2 = (pt_work_buff[ i +   FILTERBANK_BANDS ]);
+                int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
+                int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
+                *(inData++) = temp1;
+                *(inData++) = temp2;
+                *(inData++) = temp3;
+                *(inData++) = temp4;
+            }
+
+            inData -= SUBBANDS_NUMBER << 1;
+            pt_work_buff++;
+
+            for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
+            {
+                int32 temp1 = (pt_work_buff[ i ]);
+                int32 temp2 = (pt_work_buff[ i +   FILTERBANK_BANDS ]);
+                int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
+                int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
+                *(inData++) = temp1;
+                *(inData++) = temp2;
+                *(inData++) = temp3;
+                *(inData++) = temp4;
+            }
+        }
+    }
+    else
+    {
+        const int32 *pt_equalizer = equalizerTbl[equalizerType&7];
+
+
+        for (int32 band = 0; band < FILTERBANK_BANDS; band += 3)
+        {
+            int32 *inData = &circ_buffer[544 - (band<<5)];
+
+            int32 *pt_work_buff = &work_buff[band];
+            int32 i;
+
+            for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
+            {
+                int32 temp1 = (pt_work_buff[ i ]);
+                int32 temp2 = (pt_work_buff[ i +   FILTERBANK_BANDS ]);
+                int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
+                int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
+                *(inData++) = fxp_mul32_Q32(temp1 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp2 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp3 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp4 << 1, *(pt_equalizer++));
+            }
+
+            pt_equalizer -= SUBBANDS_NUMBER;
+
+            inData -= SUBBANDS_NUMBER << 1;
+            pt_work_buff++;
+
+            for (i = 0; i < SUBBANDS_NUMBER*FILTERBANK_BANDS; i += FILTERBANK_BANDS << 2)
+            {
+                int32 temp1 = (pt_work_buff[ i ]);
+                int32 temp2 = (pt_work_buff[ i +   FILTERBANK_BANDS ]);
+                int32 temp3 = (pt_work_buff[ i + 2*FILTERBANK_BANDS ]);
+                int32 temp4 = (pt_work_buff[ i + 3*FILTERBANK_BANDS ]);
+                *(inData++) = fxp_mul32_Q32(temp1 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp2 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp3 << 1, *(pt_equalizer++));
+                *(inData++) = fxp_mul32_Q32(temp4 << 1, *(pt_equalizer++));
+            }
+            pt_equalizer -= SUBBANDS_NUMBER;
+
+        }
+    }
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.h
new file mode 100644
index 0000000..bbf134f
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_equalizer.h
@@ -0,0 +1,101 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_equalizer.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_EQUALIZER_H
+#define PVMP3_EQUALIZER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3decoder_api.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_equalizer(int32 *inData,
+    e_equalization equalizerType,
+    int32 *pt_work_buff);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
new file mode 100644
index 0000000..26bc25c
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.cpp
@@ -0,0 +1,834 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_framedecoder.cpp
+
+   Functions:
+    pvmp3_framedecoder
+    pvmp3_InitDecoder
+    pvmp3_resetDecoder
+
+    Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    pExt = pointer to the external interface structure. See the file
+           pvmp3decoder_api.h for a description of each field.
+           Data type of pointer to a tPVMP3DecoderExternal
+           structure.
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tmp3dec_file structure. This structure
+           contains information that needs to persist between calls to
+           this function, or is too big to be placed on the stack, even
+           though the data is only needed during execution of this function
+           Data type void pointer, internally pointer to a tmp3dec_file
+           structure.
+
+
+ Outputs:
+     status = ERROR condition.  see structure  ERROR_CODE
+
+ Pointers and Buffers Modified:
+    pMem contents are modified.
+    pExt: (more detail in the file pvmp3decoder_api.h)
+    inputBufferUsedLength - number of array elements used up by the stream.
+    samplingRate - sampling rate in samples per sec
+    bitRate - bit rate in bits per second, varies frame to frame.
+
+
+
+------------------------------------------------------------------------------
+ FUNCTIONS DESCRIPTION
+
+    pvmp3_framedecoder
+        frame decoder library driver
+    pvmp3_InitDecoder
+        Decoder Initialization
+    pvmp3_resetDecoder
+        Reset Decoder
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+
+#include "pvmp3_framedecoder.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_poly_phase_synthesis.h"
+#include "pvmp3_tables.h"
+#include "pvmp3_imdct_synth.h"
+#include "pvmp3_alias_reduction.h"
+#include "pvmp3_reorder.h"
+#include "pvmp3_dequantize_sample.h"
+#include "pvmp3_stereo_proc.h"
+#include "pvmp3_mpeg2_stereo_proc.h"
+#include "pvmp3_get_side_info.h"
+#include "pvmp3_get_scale_factors.h"
+#include "pvmp3_mpeg2_get_scale_factors.h"
+#include "pvmp3_decode_header.h"
+#include "pvmp3_get_main_data_size.h"
+#include "s_tmp3dec_file.h"
+#include "pvmp3_getbits.h"
+#include "mp3_mem_funcs.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
+----------------------------------------------------------------------------*/
+
+ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt,
+                              void              *pMem)
+{
+
+    ERROR_CODE        errorCode  = NO_DECODING_ERROR;
+
+    int32   crc_error_count = 0;
+    uint32  sent_crc = 0;
+    uint32  computed_crc = 0;
+
+    tmp3dec_chan   *pChVars[CHAN];
+    tmp3dec_file   *pVars = (tmp3dec_file *)pMem;
+
+    mp3Header info_data;
+    mp3Header *info = &info_data;
+
+    pVars->inputStream.pBuffer  = pExt->pInputBuffer;
+
+
+    pVars->inputStream.usedBits  = pExt->inputBufferUsedLength << 3;
+    pVars->inputStream.inputBufferCurrentLength  = pExt->inputBufferCurrentLength;
+
+
+    errorCode = pvmp3_decode_header(&pVars->inputStream,
+                                    info,
+                                    &computed_crc);
+
+    if (errorCode != NO_DECODING_ERROR)
+    {
+        pExt->outputFrameSize = 0;
+        return errorCode;
+    }
+
+    pVars->num_channels = (info->mode == MPG_MD_MONO) ? 1 : 2;
+    pExt->num_channels = pVars->num_channels;
+
+    int32 outputFrameSize = (info->version_x == MPEG_1) ?
+                            2 * SUBBANDS_NUMBER * FILTERBANK_BANDS :
+                            SUBBANDS_NUMBER * FILTERBANK_BANDS;
+
+    outputFrameSize = (info->mode == MPG_MD_MONO) ? outputFrameSize : outputFrameSize << 1;
+
+
+    /*
+     *  Check if output buffer has enough room to hold output PCM
+     */
+    if (pExt->outputFrameSize >= outputFrameSize)
+    {
+        pExt->outputFrameSize = outputFrameSize;
+    }
+    else
+    {
+        pExt->outputFrameSize = 0;
+        return OUTPUT_BUFFER_TOO_SMALL;
+    }
+
+
+    pChVars[ LEFT] = &pVars->perChan[ LEFT];
+    pChVars[RIGHT] = &pVars->perChan[RIGHT];
+
+
+
+
+    if (info->error_protection)
+    {
+        /*
+         *  Get crc content
+         */
+        sent_crc = getUpTo17bits(&pVars->inputStream, 16);
+    }
+
+
+    if (info->layer_description == 3)
+    {
+        int32 gr;
+        int32 ch;
+        uint32 main_data_end;
+        int32 bytes_to_discard;
+        int16 *ptrOutBuffer = pExt->pOutputBuffer;
+
+        /*
+         * Side Information must be extracted from the bitstream and store for use
+         * during the decoded of the associated frame
+         */
+
+        errorCode = pvmp3_get_side_info(&pVars->inputStream,
+                                        &pVars->sideInfo,
+                                        info,
+                                        &computed_crc);
+
+        if (errorCode != NO_DECODING_ERROR)
+        {
+            pExt->outputFrameSize = 0;
+            return errorCode;
+        }
+
+        /*
+         *  If CRC was sent, check that matches the one got while parsing data
+         *  disable crc if this is the desired mode
+         */
+        if (info->error_protection)
+        {
+            if ((computed_crc != sent_crc) && pExt->crcEnabled)
+            {
+                crc_error_count++;
+            }
+        }
+
+        /*
+         * main data (scalefactors, Huffman coded, etc,) are not necessarily located
+         * adjacent to the side-info. Beginning of main data is located using
+         * field "main_data_begin" of the current frame. The length does not include
+         * header and side info.
+         * "main_data_begin" points to the first bit of main data of a frame. It is a negative
+         * offset in bytes from the first byte of the sync word
+         * main_data_begin = 0  <===> main data start rigth after side info.
+         */
+
+        int32 temp = pvmp3_get_main_data_size(info, pVars);
+
+
+        /*
+         *  Check if available data holds a full frame, if not flag an error
+         */
+
+        if ((uint32)pVars->predicted_frame_size > pVars->inputStream.inputBufferCurrentLength)
+        {
+            pExt->outputFrameSize = 0;
+            return NO_ENOUGH_MAIN_DATA_ERROR;
+        }
+
+        /*
+         *  Fill in internal circular buffer
+         */
+        fillMainDataBuf(pVars, temp);
+
+
+        main_data_end = pVars->mainDataStream.usedBits >> 3; /* in bytes */
+        if ((main_data_end << 3) < pVars->mainDataStream.usedBits)
+        {
+            main_data_end++;
+            pVars->mainDataStream.usedBits = main_data_end << 3;
+        }
+
+
+        bytes_to_discard = pVars->frame_start - pVars->sideInfo.main_data_begin - main_data_end;
+
+
+        if (main_data_end > BUFSIZE)   /* check overflow on the buffer */
+        {
+            pVars->frame_start -= BUFSIZE;
+
+            pVars->mainDataStream.usedBits -= (BUFSIZE << 3);
+        }
+
+        pVars->frame_start += temp;
+
+
+        if (bytes_to_discard < 0 || crc_error_count)
+        {
+            /*
+             *  Not enough data to decode, then we should avoid reading this
+             *  data ( getting/ignoring sido info and scale data)
+             *  Main data could be located in the previous frame, so an unaccounted
+             *  frame can cause incorrect processing
+             *  Just run the polyphase filter to "clean" the history buffer
+             */
+            errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
+
+            /*
+             *  Clear the input to these filters
+             */
+
+            pv_memset((void*)pChVars[RIGHT]->work_buf_int32,
+                      0,
+                      SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[RIGHT]->work_buf_int32[0]));
+
+            pv_memset((void*)pChVars[LEFT]->work_buf_int32,
+                      0,
+                      SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[LEFT]->work_buf_int32[0]));
+
+            /*  clear circular buffers, to avoid any glitch */
+            pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
+                      0,
+                      480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
+            pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
+                      0,
+                      480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
+
+            pChVars[ LEFT]->used_freq_lines = 575;
+            pChVars[RIGHT]->used_freq_lines = 575;
+
+        }
+        else
+        {
+            pVars->mainDataStream.usedBits += (bytes_to_discard << 3);
+        }
+
+        /*
+         *  if (fr_ps->header->version_x == MPEG_1), use 2 granules, otherwise just 1
+         */
+        for (gr = 0; gr < (1 + !(info->version_x)); gr++)
+        {
+            if (errorCode != NO_ENOUGH_MAIN_DATA_ERROR)
+            {
+                for (ch = 0; ch < pVars->num_channels; ch++)
+                {
+                    int32 part2_start = pVars->mainDataStream.usedBits;
+
+                    if (info->version_x == MPEG_1)
+                    {
+
+                        pvmp3_get_scale_factors(&pVars->scaleFactors[ch],
+                                                &pVars->sideInfo,
+                                                gr,
+                                                ch,
+                                                &pVars->mainDataStream);
+                    }
+                    else
+                    {
+                        int32 * tmp = pVars->Scratch_mem;
+                        pvmp3_mpeg2_get_scale_factors(&pVars->scaleFactors[ch],
+                                                      &pVars->sideInfo,
+                                                      gr,
+                                                      ch,
+                                                      info,
+                                                      (uint32 *)tmp,
+                                                      &pVars->mainDataStream);
+                    }
+
+                    pChVars[ch]->used_freq_lines = pvmp3_huffman_parsing(pChVars[ch]->work_buf_int32,
+                                                   &pVars->sideInfo.ch[ch].gran[gr],
+                                                   pVars,
+                                                   part2_start,
+                                                   info);
+
+
+                    pvmp3_dequantize_sample(pChVars[ch]->work_buf_int32,
+                                            &pVars->scaleFactors[ch],
+                                            &pVars->sideInfo.ch[ch].gran[gr],
+                                            pChVars[ch]->used_freq_lines,
+                                            info);
+
+
+
+
+                }   /* for (ch=0; ch<stereo; ch++)  */
+
+                if (pVars->num_channels == 2)
+                {
+
+                    int32 used_freq_lines = (pChVars[ LEFT]->used_freq_lines  >
+                                             pChVars[RIGHT]->used_freq_lines) ?
+                                            pChVars[ LEFT]->used_freq_lines  :
+                                            pChVars[RIGHT]->used_freq_lines;
+
+                    pChVars[ LEFT]->used_freq_lines = used_freq_lines;
+                    pChVars[RIGHT]->used_freq_lines = used_freq_lines;
+
+                    if (info->version_x == MPEG_1)
+                    {
+                        pvmp3_stereo_proc(pChVars[ LEFT]->work_buf_int32,
+                                          pChVars[RIGHT]->work_buf_int32,
+                                          &pVars->scaleFactors[RIGHT],
+                                          &pVars->sideInfo.ch[LEFT].gran[gr],
+                                          used_freq_lines,
+                                          info);
+                    }
+                    else
+                    {
+                        int32 * tmp = pVars->Scratch_mem;
+                        pvmp3_mpeg2_stereo_proc(pChVars[ LEFT]->work_buf_int32,
+                                                pChVars[RIGHT]->work_buf_int32,
+                                                &pVars->scaleFactors[RIGHT],
+                                                &pVars->sideInfo.ch[ LEFT].gran[gr],
+                                                &pVars->sideInfo.ch[RIGHT].gran[gr],
+                                                (uint32 *)tmp,
+                                                used_freq_lines,
+                                                info);
+                    }
+                }
+
+            } /* if ( errorCode != NO_ENOUGH_MAIN_DATA_ERROR) */
+
+            for (ch = 0; ch < pVars->num_channels; ch++)
+            {
+
+                pvmp3_reorder(pChVars[ch]->work_buf_int32,
+                              &pVars->sideInfo.ch[ch].gran[gr],
+                              &pChVars[ ch]->used_freq_lines,
+                              info,
+                              pVars->Scratch_mem);
+
+                pvmp3_alias_reduction(pChVars[ch]->work_buf_int32,
+                                      &pVars->sideInfo.ch[ch].gran[gr],
+                                      &pChVars[ ch]->used_freq_lines,
+                                      info);
+
+
+                /*
+                 *   IMDCT
+                 */
+                /* set mxposition
+                 * In case of mixed blocks, # of bands with long
+                 * blocks (2 or 4) else 0
+                 */
+                uint16 mixedBlocksLongBlocks = 0; /*  0 = long or short, 2=mixed, 4=mixed 2.5@8000 */
+                if (pVars->sideInfo.ch[ch].gran[gr].mixed_block_flag &&
+                        pVars->sideInfo.ch[ch].gran[gr].window_switching_flag)
+                {
+                    if ((info->version_x == MPEG_2_5) && (info->sampling_frequency == 2))
+                    {
+                        mixedBlocksLongBlocks = 4; /* mpeg2.5 @ 8 KHz */
+                    }
+                    else
+                    {
+                        mixedBlocksLongBlocks = 2;
+                    }
+                }
+
+                pvmp3_imdct_synth(pChVars[ch]->work_buf_int32,
+                                  pChVars[ch]->overlap,
+                                  pVars->sideInfo.ch[ch].gran[gr].block_type,
+                                  mixedBlocksLongBlocks,
+                                  pChVars[ ch]->used_freq_lines,
+                                  pVars->Scratch_mem);
+
+
+                /*
+                 *   Polyphase synthesis
+                 */
+
+                pvmp3_poly_phase_synthesis(pChVars[ch],
+                                           pVars->num_channels,
+                                           pExt->equalizerType,
+                                           &ptrOutBuffer[ch]);
+
+
+            }/* end ch loop */
+
+            ptrOutBuffer += pVars->num_channels * SUBBANDS_NUMBER * FILTERBANK_BANDS;
+        }  /*   for (gr=0;gr<Max_gr;gr++)  */
+
+        /* skip ancillary data */
+        if (info->bitrate_index > 0)
+        { /* if not free-format */
+
+            int32 ancillary_data_lenght = pVars->predicted_frame_size << 3;
+
+            ancillary_data_lenght  -= pVars->inputStream.usedBits;
+
+            /* skip ancillary data */
+            if (ancillary_data_lenght > 0)
+            {
+                pVars->inputStream.usedBits += ancillary_data_lenght;
+            }
+
+        }
+
+        /*
+         *  This overrides a possible NO_ENOUGH_MAIN_DATA_ERROR
+         */
+        errorCode = NO_DECODING_ERROR;
+
+    }
+    else
+    {
+        /*
+         * The info on the header leads to an unsupported layer, more data
+         * will not fix this, so this is a bad frame,
+         */
+
+        pExt->outputFrameSize = 0;
+        return UNSUPPORTED_LAYER;
+    }
+
+    pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
+    pExt->totalNumberOfBitsUsed += pVars->inputStream.usedBits;
+    pExt->version = info->version_x;
+    pExt->samplingRate = mp3_s_freq[info->version_x][info->sampling_frequency];
+    pExt->bitRate = mp3_bitrate[pExt->version][info->bitrate_index];
+
+
+    /*
+     *  Always verify buffer overrun condition
+     */
+
+    if (pExt->inputBufferUsedLength > pExt->inputBufferCurrentLength)
+    {
+        pExt->outputFrameSize = 0;
+        errorCode = NO_ENOUGH_MAIN_DATA_ERROR;
+    }
+
+    return errorCode;
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+__inline void fillDataBuf(tmp3Bits *pMainData,
+                          uint32 val)       /* val to write into the buffer */
+{
+    pMainData->pBuffer[module(pMainData->offset++, BUFSIZE)] = (uint8)val;
+}
+
+
+void fillMainDataBuf(void  *pMem, int32 temp)
+{
+    tmp3dec_file   *pVars = (tmp3dec_file *)pMem;
+
+
+    int32 offset = (pVars->inputStream.usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+    /*
+     *  Check if input circular buffer boundaries need to be enforced
+     */
+    if ((offset + temp) < BUFSIZE)
+    {
+        uint8 * ptr = pVars->inputStream.pBuffer + offset;
+
+        offset = pVars->mainDataStream.offset;
+
+        /*
+         *  Check if main data circular buffer boundaries need to be enforced
+         */
+        if ((offset + temp) < BUFSIZE)
+        {
+            pv_memcpy((pVars->mainDataStream.pBuffer + offset), ptr, temp*sizeof(uint8));
+            pVars->mainDataStream.offset += temp;
+        }
+        else
+        {
+            int32 tmp1 = *(ptr++);
+            for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--)  /* read main data. */
+            {
+                int32 tmp2 = *(ptr++);
+                fillDataBuf(&pVars->mainDataStream, tmp1);
+                fillDataBuf(&pVars->mainDataStream, tmp2);
+                tmp1 = *(ptr++);
+            }
+
+            if (temp&1)
+            {
+                fillDataBuf(&pVars->mainDataStream, tmp1);
+            }
+
+            /* adjust circular buffer counter */
+            pVars->mainDataStream.offset = module(pVars->mainDataStream.offset, BUFSIZE);
+        }
+    }
+    else
+    {
+        for (int32 nBytes = temp >> 1; nBytes != 0; nBytes--)  /* read main data. */
+        {
+            fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++  , BUFSIZE)));
+            fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset++  , BUFSIZE)));
+        }
+        if (temp&1)
+        {
+            fillDataBuf(&pVars->mainDataStream, *(pVars->inputStream.pBuffer + module(offset  , BUFSIZE)));
+        }
+    }
+
+
+    pVars->inputStream.usedBits += (temp) << INBUF_ARRAY_INDEX_SHIFT;
+}
+
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+uint32 pvmp3_decoderMemRequirements(void)
+{
+    uint32 size;
+
+    size = (uint32) sizeof(tmp3dec_file);
+    return (size);
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_decode_huff_cw.h"
+
+void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt,
+                       void  *pMem)
+{
+
+    tmp3dec_file      *pVars;
+    huffcodetab       *pHuff;
+
+    pVars = (tmp3dec_file *)pMem;
+
+    pVars->num_channels = 0;
+
+    pExt->totalNumberOfBitsUsed = 0;
+    pExt->inputBufferCurrentLength = 0;
+    pExt->inputBufferUsedLength    = 0;
+
+    pVars->mainDataStream.offset = 0;
+
+    pv_memset((void*)pVars->mainDataBuffer,
+              0,
+              BUFSIZE*sizeof(*pVars->mainDataBuffer));
+
+
+    pVars->inputStream.pBuffer = pExt->pInputBuffer;
+
+    /*
+     *  Initialize huffman decoding table
+     */
+
+    pHuff = pVars->ht;
+    pHuff[0].linbits = 0;
+    pHuff[0].pdec_huff_tab = pvmp3_decode_huff_cw_tab0;
+    pHuff[1].linbits = 0;
+    pHuff[1].pdec_huff_tab = pvmp3_decode_huff_cw_tab1;
+    pHuff[2].linbits = 0;
+    pHuff[2].pdec_huff_tab = pvmp3_decode_huff_cw_tab2;
+    pHuff[3].linbits = 0;
+    pHuff[3].pdec_huff_tab = pvmp3_decode_huff_cw_tab3;
+    pHuff[4].linbits = 0;
+    pHuff[4].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 4 is not used */
+    pHuff[5].linbits = 4;
+    pHuff[5].pdec_huff_tab = pvmp3_decode_huff_cw_tab5;
+    pHuff[6].linbits = 0;
+    pHuff[6].pdec_huff_tab = pvmp3_decode_huff_cw_tab6;
+    pHuff[7].linbits = 0;
+    pHuff[7].pdec_huff_tab = pvmp3_decode_huff_cw_tab7;
+    pHuff[8].linbits = 0;
+    pHuff[8].pdec_huff_tab = pvmp3_decode_huff_cw_tab8;
+    pHuff[9].linbits = 0;
+    pHuff[9].pdec_huff_tab = pvmp3_decode_huff_cw_tab9;
+    pHuff[10].linbits = 0;
+    pHuff[10].pdec_huff_tab = pvmp3_decode_huff_cw_tab10;
+    pHuff[11].linbits = 0;
+    pHuff[11].pdec_huff_tab = pvmp3_decode_huff_cw_tab11;
+    pHuff[12].linbits = 0;
+    pHuff[12].pdec_huff_tab = pvmp3_decode_huff_cw_tab12;
+    pHuff[13].linbits = 0;
+    pHuff[13].pdec_huff_tab = pvmp3_decode_huff_cw_tab13;
+    pHuff[14].linbits = 0;
+    pHuff[14].pdec_huff_tab = pvmp3_decode_huff_cw_tab0; /* tbl 14 is not used */
+    pHuff[15].linbits = 0;
+    pHuff[15].pdec_huff_tab = pvmp3_decode_huff_cw_tab15;
+    pHuff[16].linbits = 1;
+    pHuff[16].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[17].linbits = 2;
+    pHuff[17].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[18].linbits = 3;
+    pHuff[18].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[19].linbits = 4;
+    pHuff[19].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[20].linbits = 6;
+    pHuff[20].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[21].linbits = 8;
+    pHuff[21].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[22].linbits = 10;
+    pHuff[22].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[23].linbits = 13;
+    pHuff[23].pdec_huff_tab = pvmp3_decode_huff_cw_tab16;
+    pHuff[24].linbits = 4;
+    pHuff[24].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[25].linbits = 5;
+    pHuff[25].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[26].linbits = 6;
+    pHuff[26].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[27].linbits = 7;
+    pHuff[27].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[28].linbits = 8;
+    pHuff[28].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[29].linbits = 9;
+    pHuff[29].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[30].linbits = 11;
+    pHuff[30].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[31].linbits = 13;
+    pHuff[31].pdec_huff_tab = pvmp3_decode_huff_cw_tab24;
+    pHuff[32].linbits = 0;
+    pHuff[32].pdec_huff_tab = pvmp3_decode_huff_cw_tab32;
+    pHuff[33].linbits = 0;
+    pHuff[33].pdec_huff_tab = pvmp3_decode_huff_cw_tab33;
+
+    /*
+     *  Initialize polysynthesis circular buffer mechanism
+     */
+    /* clear buffers */
+
+    pvmp3_resetDecoder(pMem);
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+void pvmp3_resetDecoder(void  *pMem)
+{
+
+    tmp3dec_file      *pVars;
+    tmp3dec_chan      *pChVars[CHAN];
+
+    pVars = (tmp3dec_file *)pMem;
+    pChVars[ LEFT] = &pVars->perChan[ LEFT];
+    pChVars[RIGHT] = &pVars->perChan[RIGHT];
+
+    pVars->frame_start = 0;
+
+    pVars->mainDataStream.offset = 0;
+
+    pVars->mainDataStream.pBuffer =  pVars->mainDataBuffer;
+    pVars->mainDataStream.usedBits = 0;
+
+
+    pVars->inputStream.usedBits = 0; // in bits
+
+
+    pChVars[ LEFT]->used_freq_lines = 575;
+    pChVars[RIGHT]->used_freq_lines = 575;
+
+
+    /*
+     *  Initialize polysynthesis circular buffer mechanism
+     */
+
+    pv_memset((void*)&pChVars[ LEFT]->circ_buffer[576],
+              0,
+              480*sizeof(pChVars[ LEFT]->circ_buffer[0]));
+    pv_memset((void*)&pChVars[RIGHT]->circ_buffer[576],
+              0,
+              480*sizeof(pChVars[RIGHT]->circ_buffer[0]));
+
+
+    pv_memset((void*)pChVars[ LEFT]->overlap,
+              0,
+              SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ LEFT]->overlap[0]));
+
+
+    pv_memset((void*)pChVars[ RIGHT]->overlap,
+              0,
+              SUBBANDS_NUMBER*FILTERBANK_BANDS*sizeof(pChVars[ RIGHT]->overlap[0]));
+
+
+
+
+
+    /*
+     *  Clear all the structures
+     */
+
+
+    pv_memset((void*)&pVars->scaleFactors[RIGHT],
+              0,
+              sizeof(mp3ScaleFactors));
+
+    pv_memset((void*)&pVars->scaleFactors[LEFT],
+              0,
+              sizeof(mp3ScaleFactors));
+
+    pv_memset((void*)&pVars->sideInfo,
+              0,
+              sizeof(mp3SideInfo));
+
+    pv_memset((void*)&pVars->sideInfo,
+              0,
+              sizeof(mp3SideInfo));
+
+}
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.h
new file mode 100644
index 0000000..f6d4a35
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_framedecoder.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_framedecoder.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_FRAMEDECODER_H
+#define PVMP3_FRAMEDECODER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3decoder_api.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    ERROR_CODE pvmp3_framedecoder(tPVMP3DecoderExternal *pExt,
+    void                  *pMem);
+
+
+
+    uint32 pvmp3_decoderMemRequirements(void);
+
+    void pvmp3_InitDecoder(tPVMP3DecoderExternal *pExt,
+                           void  *pMem);
+
+
+    void pvmp3_resetDecoder(void                  *pMem);
+
+
+    void fillMainDataBuf(void  *pMem, int32 temp);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.cpp
new file mode 100644
index 0000000..423a7b1
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_main_data_size.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Input
+    mp3Header *info,         pointer to mp3 header info structure
+    tmp3dec_file  *pVars
+                             contains information that needs to persist
+                             between calls to this function, or is too big to
+                             be placed on the stack, even though the data is
+                             only needed during execution of this function
+
+  Returns
+
+    main data frame size
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    get main data frame size
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_tables.h"
+#include "pvmp3_get_main_data_size.h"
+#include "pv_mp3dec_fxd_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
+----------------------------------------------------------------------------*/
+
+int32 pvmp3_get_main_data_size(mp3Header *info,
+                               tmp3dec_file  *pVars)
+{
+
+
+    int32 numBytes = fxp_mul32_Q28(mp3_bitrate[info->version_x][info->bitrate_index] << 20,
+                                   inv_sfreq[info->sampling_frequency]);
+
+
+    numBytes >>= (20 - info->version_x);
+
+    /*
+     *  Remove the size of the side information from the main data total
+     */
+    if (info->version_x == MPEG_1)
+    {
+        pVars->predicted_frame_size = numBytes;
+        if (info->mode == MPG_MD_MONO)
+        {
+            numBytes -= 17;
+        }
+        else
+        {
+            numBytes -= 32;
+        }
+    }
+    else
+    {
+        numBytes >>= 1;
+        pVars->predicted_frame_size = numBytes;
+
+        if (info->mode == MPG_MD_MONO)
+        {
+            numBytes -= 9;
+        }
+        else
+        {
+            numBytes -= 17;
+        }
+    }
+
+    if (info->padding)
+    {
+        numBytes++;
+        pVars->predicted_frame_size++;
+    }
+
+    if (info->error_protection)
+    {
+        numBytes -= 6;
+    }
+    else
+    {
+        numBytes -= 4;
+    }
+
+
+    if (numBytes < 0)
+    {
+        numBytes = 0;
+    }
+
+    return(numBytes);
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.h
new file mode 100644
index 0000000..8e9eaa8
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_main_data_size.h
@@ -0,0 +1,101 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_main_data_size.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_GET_MAIN_DATA_SIZE_H
+#define PVMP3_GET_MAIN_DATA_SIZE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "s_tmp3dec_file.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    int32 pvmp3_get_main_data_size(mp3Header *info,
+    tmp3dec_file  *pVars);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.cpp
new file mode 100644
index 0000000..f1a3ff8
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_scale_factors.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Input
+    mp3ScaleFactors *scalefac,
+    mp3SideInfo *si,               side info
+    int32 gr,                      granule
+    int32 ch,                      channel
+    tbits *pMainData               bit stream
+
+  Returns
+
+    mp3ScaleFactors *scalefac,   scale factors
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    get scale factors
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_get_scale_factors.h"
+#include "pvmp3_getbits.h"
+#include "mp3_mem_funcs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define Qfmt_28(a)(int32(double(0x10000000)*a))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int32 slen[2][16] =
+{
+    {0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4},
+    {0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3}
+};
+
+const struct
+{
+    int32 l[5];
+    int32 s[3];
+} sfbtable =
+{
+    {0, 6, 11, 16, 21},
+    {0, 6, 12}
+};
+
+const int32 long_sfbtable[4] = { 6, 5, 5, 5};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_get_scale_factors(mp3ScaleFactors *scalefac,
+                             mp3SideInfo    *si,
+                             int32          gr,
+                             int32          ch,
+                             tmp3Bits       *pMainData)
+{
+    int32 sfb;
+    int32 i;
+    int32 window;
+    granuleInfo *gr_info = &(si->ch[ch].gran[gr]);
+
+    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
+    {
+        if (gr_info->mixed_block_flag)
+        { /* MIXED */
+            for (sfb = 0; sfb < 8; sfb++)
+            {
+                scalefac->l[sfb] = getNbits(pMainData, slen[0][gr_info->scalefac_compress]);
+            }
+
+            for (sfb = 3; sfb < 6; sfb++)
+            {
+                for (window = 0; window < 3; window++)
+                {
+                    scalefac->s[window][sfb] = getNbits(pMainData, slen[0][gr_info->scalefac_compress]);
+                }
+            }
+            for (sfb = 6; sfb < 12; sfb++)
+            {
+                for (window = 0; window < 3; window++)
+                {
+                    scalefac->s[window][sfb] = getNbits(pMainData, slen[1][gr_info->scalefac_compress]);
+                }
+            }
+        }
+        else
+        {  /* SHORT*/
+            for (i = 0; i < 2; i++)
+            {
+                for (sfb = sfbtable.s[i]; sfb < sfbtable.s[i+1]; sfb++)
+                {
+                    for (window = 0; window < 3; window++)
+                    {
+                        scalefac->s[window][sfb] = getNbits(pMainData, slen[i][gr_info->scalefac_compress]);
+                    }
+                }
+            }
+        }
+
+        scalefac->s[0][12] = 0;    /* sfb = 12 win= 0 */
+        scalefac->s[1][12] = 0;    /* sfb = 12 win= 1 */
+        scalefac->s[2][12] = 0;    /* sfb = 12 win= 2 */
+    }
+    else
+    {   /* LONG types 0,1,3 */
+
+        int32 *ptr = &scalefac->l[0];
+
+        for (i = 0; i < 4; i++)
+        {
+            int32 tmp4 = long_sfbtable[i];
+
+            if ((si->ch[ch].scfsi[i] == 0) || (gr == 0))
+            {
+                int32 tmp1 = slen[(i>>1)][gr_info->scalefac_compress];
+
+                if (tmp1)
+                {
+                    int32 tmp2 = tmp1 * tmp4;
+                    uint32 tmp3 = getNbits(pMainData, tmp2);
+                    tmp4 = 32 - tmp1;
+                    for (; tmp2 > 0; tmp2 -= tmp1)
+                    {
+                        *(ptr++) = (tmp3 << (32 - tmp2)) >> tmp4;
+                    }
+                }
+                else
+                {
+                    for (sfb = tmp4; sfb != 0; sfb--)
+                    {
+                        *(ptr++) = 0;
+                    }
+
+                }
+            }
+            else
+            {
+                ptr += tmp4;
+            }
+        }
+        scalefac->l[21] = 0;
+        scalefac->l[22] = 0;
+    }
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.h
new file mode 100644
index 0000000..d4f262b
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_scale_factors.h
@@ -0,0 +1,104 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_scale_factors.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_GET_SCALE_FACTORS_H
+#define PVMP3_GET_SCALE_FACTORS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_get_scale_factors(mp3ScaleFactors *scalefac,
+    mp3SideInfo *si,
+    int32 gr,
+    int32 ch,
+    tmp3Bits *pMainData);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp
new file mode 100644
index 0000000..7eaa860
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.cpp
@@ -0,0 +1,285 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_side_info.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    mp3SideInfo     *si,
+    mp3Header       *info,             mp3 header information
+    uint32          *crc               initialized crc value (if enabled)
+
+
+ Returns
+
+    mp3SideInfo     *si,               side information
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    acquires side information
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_get_side_info.h"
+#include "pvmp3_crc.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
+----------------------------------------------------------------------------*/
+
+ERROR_CODE pvmp3_get_side_info(tmp3Bits    *inputStream,
+                               mp3SideInfo *si,
+                               mp3Header   *info,
+                               uint32      *crc)
+{
+    int32 ch, gr;
+    uint32 tmp;
+
+    int stereo  = (info->mode == MPG_MD_MONO) ? 1 : 2;
+
+    if (info->version_x == MPEG_1)
+    {
+        if (stereo == 1)
+        {
+            tmp = getbits_crc(inputStream, 14, crc, info->error_protection);
+            si->main_data_begin = (tmp << 18) >> 23;    /* 9 */
+            si->private_bits    = (tmp << 23) >> 27;    /* 5 */
+        }
+        else
+        {
+            tmp = getbits_crc(inputStream, 12, crc, info->error_protection);
+            si->main_data_begin = (tmp << 20) >> 23;    /* 9 */
+            si->private_bits    = (tmp << 23) >> 29;    /* 3 */
+
+        }
+
+        for (ch = 0; ch < stereo; ch++)
+        {
+            tmp = getbits_crc(inputStream, 4, crc, info->error_protection);
+            si->ch[ch].scfsi[0] = (tmp << 28) >> 31;    /* 1 */
+            si->ch[ch].scfsi[1] = (tmp << 29) >> 31;    /* 1 */
+            si->ch[ch].scfsi[2] = (tmp << 30) >> 31;    /* 1 */
+            si->ch[ch].scfsi[3] =  tmp & 1;         /* 1 */
+        }
+
+        for (gr = 0; gr < 2 ; gr++)
+        {
+            for (ch = 0; ch < stereo; ch++)
+            {
+                si->ch[ch].gran[gr].part2_3_length    = getbits_crc(inputStream, 12, crc, info->error_protection);
+                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
+
+                si->ch[ch].gran[gr].big_values            = (tmp << 10) >> 23;   /* 9 */
+                si->ch[ch].gran[gr].global_gain           = ((tmp << 19) >> 24) - 210;   /* 8 */
+                si->ch[ch].gran[gr].scalefac_compress     = (tmp << 27) >> 28;   /* 4 */
+                si->ch[ch].gran[gr].window_switching_flag = tmp & 1;         /* 1 */
+
+                if (si->ch[ch].gran[gr].window_switching_flag)
+                {
+                    tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
+
+                    si->ch[ch].gran[gr].block_type       = (tmp << 10) >> 30;   /* 2 */;
+                    si->ch[ch].gran[gr].mixed_block_flag = (tmp << 12) >> 31;   /* 1 */;
+
+                    si->ch[ch].gran[gr].table_select[0]  = (tmp << 13) >> 27;   /* 5 */;
+                    si->ch[ch].gran[gr].table_select[1]  = (tmp << 18) >> 27;   /* 5 */;
+
+                    si->ch[ch].gran[gr].subblock_gain[0] = (tmp << 23) >> 29;   /* 3 */;
+                    si->ch[ch].gran[gr].subblock_gain[1] = (tmp << 26) >> 29;   /* 3 */;
+                    si->ch[ch].gran[gr].subblock_gain[2] = (tmp << 29) >> 29;   /* 3 */;
+
+                    /* Set region_count parameters since they are implicit in this case. */
+
+                    if (si->ch[ch].gran[gr].block_type == 0)
+                    {
+                        return(SIDE_INFO_ERROR);
+                    }
+                    else if ((si->ch[ch].gran[gr].block_type       == 2)
+                             && (si->ch[ch].gran[gr].mixed_block_flag == 0))
+                    {
+                        si->ch[ch].gran[gr].region0_count = 8; /* MI 9; */
+                        si->ch[ch].gran[gr].region1_count = 12;
+                    }
+                    else
+                    {
+                        si->ch[ch].gran[gr].region0_count = 7; /* MI 8; */
+                        si->ch[ch].gran[gr].region1_count = 13;
+                    }
+                }
+                else
+                {
+                    tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
+
+                    si->ch[ch].gran[gr].table_select[0] = (tmp << 10) >> 27;   /* 5 */;
+                    si->ch[ch].gran[gr].table_select[1] = (tmp << 15) >> 27;   /* 5 */;
+                    si->ch[ch].gran[gr].table_select[2] = (tmp << 20) >> 27;   /* 5 */;
+
+                    si->ch[ch].gran[gr].region0_count   = (tmp << 25) >> 28;   /* 4 */;
+                    si->ch[ch].gran[gr].region1_count   = (tmp << 29) >> 29;   /* 3 */;
+
+                    si->ch[ch].gran[gr].block_type      = 0;
+                }
+
+                tmp = getbits_crc(inputStream, 3, crc, info->error_protection);
+                si->ch[ch].gran[gr].preflag            = (tmp << 29) >> 31;    /* 1 */
+                si->ch[ch].gran[gr].scalefac_scale     = (tmp << 30) >> 31;    /* 1 */
+                si->ch[ch].gran[gr].count1table_select =  tmp & 1;         /* 1 */
+            }
+        }
+    }
+    else /* Layer 3 LSF */
+    {
+        si->main_data_begin = getbits_crc(inputStream,      8, crc, info->error_protection);
+        si->private_bits    = getbits_crc(inputStream, stereo, crc, info->error_protection);
+
+        for (ch = 0; ch < stereo; ch++)
+        {
+            tmp = getbits_crc(inputStream, 21, crc, info->error_protection);
+            si->ch[ch].gran[0].part2_3_length    = (tmp << 11) >> 20;  /* 12 */
+            si->ch[ch].gran[0].big_values        = (tmp << 23) >> 23;  /*  9 */
+
+            tmp = getbits_crc(inputStream, 18, crc, info->error_protection);
+            si->ch[ch].gran[0].global_gain           = ((tmp << 14) >> 24) - 210;   /* 8 */
+            si->ch[ch].gran[0].scalefac_compress     = (tmp << 22) >> 23;   /* 9 */
+            si->ch[ch].gran[0].window_switching_flag = tmp & 1;         /* 1 */
+
+            if (si->ch[ch].gran[0].window_switching_flag)
+            {
+
+                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
+
+                si->ch[ch].gran[0].block_type       = (tmp << 10) >> 30;   /* 2 */;
+                si->ch[ch].gran[0].mixed_block_flag = (tmp << 12) >> 31;   /* 1 */;
+
+                si->ch[ch].gran[0].table_select[0]  = (tmp << 13) >> 27;   /* 5 */;
+                si->ch[ch].gran[0].table_select[1]  = (tmp << 18) >> 27;   /* 5 */;
+
+                si->ch[ch].gran[0].subblock_gain[0] = (tmp << 23) >> 29;   /* 3 */;
+                si->ch[ch].gran[0].subblock_gain[1] = (tmp << 26) >> 29;   /* 3 */;
+                si->ch[ch].gran[0].subblock_gain[2] = (tmp << 29) >> 29;   /* 3 */;
+
+                /* Set region_count parameters since they are implicit in this case. */
+
+                if (si->ch[ch].gran[0].block_type == 0)
+                {
+                    return(SIDE_INFO_ERROR);
+                }
+                else if ((si->ch[ch].gran[0].block_type       == 2)
+                         && (si->ch[ch].gran[0].mixed_block_flag == 0))
+                {
+                    si->ch[ch].gran[0].region0_count = 8; /* MI 9; */
+                    si->ch[ch].gran[0].region1_count = 12;
+                }
+                else
+                {
+                    si->ch[ch].gran[0].region0_count = 7; /* MI 8; */
+                    si->ch[ch].gran[0].region1_count = 13;
+                }
+            }
+            else
+            {
+                tmp = getbits_crc(inputStream, 22, crc, info->error_protection);
+
+                si->ch[ch].gran[0].table_select[0] = (tmp << 10) >> 27;   /* 5 */;
+                si->ch[ch].gran[0].table_select[1] = (tmp << 15) >> 27;   /* 5 */;
+                si->ch[ch].gran[0].table_select[2] = (tmp << 20) >> 27;   /* 5 */;
+
+                si->ch[ch].gran[0].region0_count   = (tmp << 25) >> 28;   /* 4 */;
+                si->ch[ch].gran[0].region1_count   = (tmp << 29) >> 29;   /* 3 */;
+
+                si->ch[ch].gran[0].block_type      = 0;
+            }
+
+            tmp = getbits_crc(inputStream, 2, crc, info->error_protection);
+            si->ch[ch].gran[0].scalefac_scale     =  tmp >> 1;  /* 1 */
+            si->ch[ch].gran[0].count1table_select =  tmp & 1;  /* 1 */
+
+        }
+    }
+    return (NO_DECODING_ERROR);
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.h
new file mode 100644
index 0000000..2d6ccd8
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_get_side_info.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_get_side_info.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_GET_SIDE_INFO_H
+#define PVMP3_GET_SIDE_INFO_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    ERROR_CODE pvmp3_get_side_info(tmp3Bits  *inputStream,
+    mp3SideInfo *si,
+    mp3Header *info,
+    uint32 *crc);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.cpp
new file mode 100644
index 0000000..8ff7953
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.cpp
@@ -0,0 +1,257 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_getbits.cpp
+
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    tmp3Bits *inputStream,     structure holding the input stream parameters
+    int32     neededBits       number of bits to read from the bit stream
+
+ Outputs:
+
+    word parsed from teh bitstream, with size neededBits-bits,
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_getbits.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
+----------------------------------------------------------------------------*/
+
+uint32 getNbits(tmp3Bits *ptBitStream,
+                int32 neededBits) /* number of bits to read from the bitstream (up to 25) */
+{
+
+    uint32    offset;
+    uint32    bitIndex;
+    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
+    uint8     Elem1;
+    uint8     Elem2;
+    uint8     Elem3;
+    uint32   returnValue = 0;
+
+    if (!neededBits)
+    {
+        return (returnValue);
+    }
+
+    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
+    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
+    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
+    Elem3 = *(ptBitStream->pBuffer + module(offset + 3, BUFSIZE));
+
+
+    returnValue = (((uint32)(Elem)) << 24) |
+                  (((uint32)(Elem1)) << 16) |
+                  (((uint32)(Elem2)) << 8) |
+                  ((uint32)(Elem3));
+
+    /* Remove extra high bits by shifting up */
+    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
+
+    /* This line is faster than to mask off the high bits. */
+    returnValue <<= bitIndex;
+
+    /* Move the field down. */
+    returnValue >>= (32 - neededBits);
+
+    ptBitStream->usedBits += neededBits;
+
+    return (returnValue);
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+uint16 getUpTo9bits(tmp3Bits *ptBitStream,
+                    int32 neededBits) /* number of bits to read from the bit stream 2 to 9 */
+{
+
+    uint32    offset;
+    uint32    bitIndex;
+    uint8    Elem;         /* Needs to be same type as pInput->pBuffer */
+    uint8    Elem1;
+    uint16   returnValue;
+
+    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
+    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
+
+
+    returnValue = (((uint16)(Elem)) << 8) |
+                  ((uint16)(Elem1));
+
+    /* Remove extra high bits by shifting up */
+    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
+
+    ptBitStream->usedBits += neededBits;
+    /* This line is faster than to mask off the high bits. */
+    returnValue = (returnValue << (bitIndex));
+
+    /* Move the field down. */
+
+    return (uint16)(returnValue >> (16 - neededBits));
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+uint32 getUpTo17bits(tmp3Bits *ptBitStream,
+                     int32 neededBits) /* number of bits to read from the bit stream 2 to 8 */
+{
+
+    uint32    offset;
+    uint32    bitIndex;
+    uint8     Elem;         /* Needs to be same type as pInput->pBuffer */
+    uint8     Elem1;
+    uint8     Elem2;
+    uint32   returnValue;
+
+    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+    Elem  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
+    Elem1 = *(ptBitStream->pBuffer + module(offset + 1, BUFSIZE));
+    Elem2 = *(ptBitStream->pBuffer + module(offset + 2, BUFSIZE));
+
+
+    returnValue = (((uint32)(Elem)) << 16) |
+                  (((uint32)(Elem1)) << 8) |
+                  ((uint32)(Elem2));
+
+    /* Remove extra high bits by shifting up */
+    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
+
+    ptBitStream->usedBits += neededBits;
+    /* This line is faster than to mask off the high bits. */
+    returnValue = 0xFFFFFF & (returnValue << (bitIndex));
+
+    /* Move the field down. */
+
+    return (uint32)(returnValue >> (24 - neededBits));
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+uint8 get1bit(tmp3Bits *ptBitStream)  /* number of bits to read from the bit stream */
+{
+
+    uint32    offset;
+    uint32    bitIndex;
+    uint8   returnValue;
+
+    offset = (ptBitStream->usedBits) >> INBUF_ARRAY_INDEX_SHIFT;
+
+    returnValue  = *(ptBitStream->pBuffer + module(offset  , BUFSIZE));
+
+    /* Remove extra high bits by shifting up */
+    bitIndex = module(ptBitStream->usedBits, INBUF_BIT_WIDTH);
+    ptBitStream->usedBits++;
+
+    /* This line is faster than to mask off the high bits. */
+    returnValue = (returnValue << (bitIndex));
+
+    return (uint8)(returnValue >> 7);
+
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.h
new file mode 100644
index 0000000..b058b00
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_getbits.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_getbits.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_GETBITS_H
+#define PVMP3_GETBITS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_dec_defs.h"
+#include "s_mp3bits.h"
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define INBUF_ARRAY_INDEX_SHIFT  (3)
+#define INBUF_BIT_WIDTH         (1<<(INBUF_ARRAY_INDEX_SHIFT))
+#define INBUF_BIT_MODULO_MASK   ((INBUF_BIT_WIDTH)-1)
+
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    uint32 getNbits(tmp3Bits *pMainData,
+    int32 neededBits);
+
+    uint16 getUpTo9bits(tmp3Bits *pMainData,
+                        int32 neededBits);
+
+    uint32 getUpTo17bits(tmp3Bits *pMainData,
+                         int32 neededBits);
+
+    uint8 get1bit(tmp3Bits *pMainData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_decoding.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_decoding.cpp
new file mode 100644
index 0000000..5d58cd2
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_decoding.cpp
@@ -0,0 +1,304 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_huffman_decoding.cpp
+
+ Funtions:
+    pvmp3_huffman_quad_decoding
+    pvmp3_huffman_pair_decoding
+    pvmp3_huffman_pair_decoding_linbits
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    struct huffcodetab *h,   pointer to huffman code record
+    int32 *x,    returns decoded x value
+    int32 *y,    returns decoded y value
+    int32 *v,    returns decoded v value   (only in quad function)
+    int32 *w,    returns decoded w value   (only in quad function)
+    tbits *pMainData     bit stream
+
+ Outputs:
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   These functions are used to decode huffman codewords from the input
+   bitstream using combined binary search and look-up table approach.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_dec_defs.h"
+#include "pv_mp3_huffman.h"
+#include "pvmp3_getbits.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 pvmp3_huffman_quad_decoding(struct huffcodetab *h,
+                                 int32 *is,
+                                 tmp3Bits *pMainData)
+{
+
+    int32 x;
+    int32 y;
+    int32 v;
+    int32 w;
+
+    y = (*h->pdec_huff_tab)(pMainData);
+
+
+    if (y)
+    {
+        v = (y >> 3);
+
+        if (v)
+        {
+            if (get1bit(pMainData))
+            {
+                v = -v;
+            }
+        }
+        w = (y >> 2) & 1;
+        if (w)
+        {
+            if (get1bit(pMainData))
+            {
+                w = -w;
+            }
+        }
+        x = (y >> 1) & 1;
+        if (x)
+        {
+            if (get1bit(pMainData))
+            {
+                x = -x;
+            }
+        }
+        y =  y & 1;
+        if (y)
+        {
+            if (get1bit(pMainData))
+            {
+                y = -y;
+            }
+        }
+
+    }
+    else
+    {
+        v = 0;
+        w = 0;
+        x = 0;
+
+    }
+
+    *is     = v;
+    *(is + 1) = w;
+    *(is + 2) = x;
+    *(is + 3) = y;
+
+}
+
+
+
+void pvmp3_huffman_pair_decoding(struct huffcodetab *h,     /* pointer to huffman code record   */
+                                 int32 *is,
+                                 tmp3Bits *pMainData)
+{
+    /* Lookup in Huffman table. */
+    int32 x;
+    int32 y;
+
+    uint16 cw = (*h->pdec_huff_tab)(pMainData);
+
+    /* Process sign and escape encodings for dual tables. */
+
+
+    if (cw)
+    {
+        x = cw >> 4;
+
+        if (x)
+        {
+            if (get1bit(pMainData))
+            {
+                x = -x;
+            }
+            y = cw & 0xf;
+            if (y && get1bit(pMainData))
+            {
+                y = -y;
+            }
+
+        }
+        else
+        {
+            y = cw & 0xf;
+            if (get1bit(pMainData))
+            {
+                y = -y;
+            }
+        }
+
+        *is     = x;
+        *(is + 1) = y;
+    }
+    else
+    {
+        *is     = 0;
+        *(is + 1) = 0;
+    }
+
+
+
+}
+
+
+
+
+void pvmp3_huffman_pair_decoding_linbits(struct huffcodetab *h,     /* pointer to huffman code record   */
+        int32 *is,
+        tmp3Bits *pMainData)
+{
+    int32 x;
+    int32 y;
+
+    uint16 cw;
+    /* Lookup in Huffman table. */
+
+
+    cw = (*h->pdec_huff_tab)(pMainData);
+    x = cw >> 4;
+
+    /* Process sign and escape encodings for dual tables. */
+
+
+    if (15 == (uint32)x)
+    {
+        int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
+        x += tmp >> 1;
+        if (tmp&1)
+        {
+            x = -x;
+        }
+    }
+    else if (x)
+    {
+        if (get1bit(pMainData))
+        {
+            x = -x;
+        }
+    }
+
+    y = cw & 0xf;
+    if (15 == (uint32)y)
+    {
+        int32 tmp = getUpTo17bits(pMainData, (h->linbits + 1));
+        y += tmp >> 1;
+        if (tmp&1)
+        {
+            y = -y;
+        }
+    }
+    else if (y)
+    {
+        if (get1bit(pMainData))
+        {
+            y = -y;
+        }
+    }
+
+    *is     = x;
+    *(is + 1) = y;
+
+}
+
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_parsing.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_parsing.cpp
new file mode 100644
index 0000000..ff815dc
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_huffman_parsing.cpp
@@ -0,0 +1,328 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_huffman_decoding.cpp
+
+ Funtions:
+    pvmp3_huffman_quad_decoding
+    pvmp3_huffman_pair_decoding
+    pvmp3_huffman_pair_decoding_linbits
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+    int32 is[],
+    granuleInfo  *grInfo,    information for the given channel and granule
+    tmp3dec_file   *pVars,   decoder state structure
+    int32 part2_start,       index to beginning of part 2 data
+    mp3Header *info          mp3 header info
+
+ Outputs:
+    int32 is[],              uncompressed data
+
+  Return:
+     non zero frequency lines
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+   These functions are used to decode huffman codewords from the input
+   bitstream using combined binary search and look-up table approach.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_mp3_huffman.h"
+#include "s_mp3bits.h"
+#include "mp3_mem_funcs.h"
+#include "pvmp3_tables.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
+----------------------------------------------------------------------------*/
+
+int32 pvmp3_huffman_parsing(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                            granuleInfo *grInfo,
+                            tmp3dec_file   *pVars,
+                            int32 part2_start,
+                            mp3Header *info)
+
+
+{
+    int32 i;
+    int32 region1Start;
+    int32 region2Start;
+    int32 sfreq;
+    uint32 grBits;
+    void(*pt_huff)(struct huffcodetab *, int32 *, tmp3Bits *);
+    struct huffcodetab *h;
+
+    tmp3Bits *pMainData = &pVars->mainDataStream;
+
+
+    /*int32 bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);*/
+
+    sfreq = info->sampling_frequency + info->version_x + (info->version_x << 1);
+
+    /* Find region boundary for short block case. */
+
+
+    if ((grInfo->window_switching_flag) && (grInfo->block_type == 2))
+    {
+        if (info->version_x == MPEG_1)
+        {
+            /* Region2. */
+            region1Start = 12;
+        }
+        else
+        {
+            /* Region2. */
+            i = grInfo->region0_count + 1;
+            region1Start = mp3_sfBandIndex[sfreq].s[i/3];
+        }
+
+        region1Start += region1Start << 1;
+        region2Start = 576; /* No Region2 for short block case. */
+    }
+    else
+    {          /* Find region boundary for long block case. */
+        i = grInfo->region0_count + 1;
+        region1Start = mp3_sfBandIndex[sfreq].l[i];
+        region2Start = mp3_sfBandIndex[sfreq].l[i + grInfo->region1_count + 1];
+    }
+
+    /* Read bigvalues area. */
+
+
+    if (grInfo->big_values > (FILTERBANK_BANDS*SUBBANDS_NUMBER >> 1))
+    {
+        grInfo->big_values = (FILTERBANK_BANDS * SUBBANDS_NUMBER >> 1);
+    }
+
+    if ((grInfo->big_values << 1) > (uint32)region2Start)
+    {
+        h = &(pVars->ht[grInfo->table_select[0]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+
+        for (i = 0; i < region1Start; i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+
+        h = &(pVars->ht[grInfo->table_select[1]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+
+        for (; i < region2Start; i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+
+        h = &(pVars->ht[grInfo->table_select[2]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+
+        for (; (uint32)i < (grInfo->big_values << 1); i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+    }
+    else if ((grInfo->big_values << 1) > (uint32)region1Start)
+    {
+        h = &(pVars->ht[grInfo->table_select[0]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+        for (i = 0; i < region1Start; i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+
+        h = &(pVars->ht[grInfo->table_select[1]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+        for (; (uint32)i < (grInfo->big_values << 1); i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+    }
+    else
+    {
+        h = &(pVars->ht[grInfo->table_select[0]]);
+        if (h->linbits)
+        {
+            pt_huff = pvmp3_huffman_pair_decoding_linbits;
+        }
+        else
+        {
+            pt_huff = pvmp3_huffman_pair_decoding;
+        }
+
+        for (i = 0; (uint32)i < (grInfo->big_values << 1); i += 2)
+        {
+            (*pt_huff)(h, &is[i], pMainData);
+        }
+    }
+
+
+
+    /* Read count1 area. */
+    h = &(pVars->ht[grInfo->count1table_select+32]);
+
+    grBits     = part2_start + grInfo->part2_3_length;
+
+    while ((pMainData->usedBits < grBits) &&
+            (i < FILTERBANK_BANDS*SUBBANDS_NUMBER - 4))
+    {
+        pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
+        i += 4;
+    }
+
+    if ((pMainData->usedBits < grBits) &&
+            (i < FILTERBANK_BANDS*SUBBANDS_NUMBER))
+    {
+        pvmp3_huffman_quad_decoding(h, &is[i], pMainData);
+        i += 4;
+
+        if ((i - 2) >= FILTERBANK_BANDS*SUBBANDS_NUMBER)
+        {
+            i -= 2;
+            is[i] = 0;
+            is[(i+1)] = 0;
+        }
+    }
+
+    if (pMainData->usedBits > grBits)
+    {
+        i -= 4;
+
+        if (i < 0 || i > FILTERBANK_BANDS*SUBBANDS_NUMBER - 4)
+        {
+            /* illegal parameters may cause invalid access, set i to 0 */
+            i = 0;
+        }
+
+        is[i] = 0;
+        is[(i+1)] = 0;
+        is[(i+2)] = 0;
+        is[(i+3)] = 0;
+
+    }
+
+    pMainData->usedBits = grBits;
+
+    return (i);
+
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.cpp
new file mode 100644
index 0000000..11961d1
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.cpp
@@ -0,0 +1,376 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_imdct_synth.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Input
+    int32 in[],         Pointer to spec values of current channel
+    int32 overlap[],    Pointer to overlap values of current channel
+    uint32 blk_type,    Block type
+    int16 mx_band,      In case of mixed blocks, # of bands with long
+                        blocks (2 or 4) else 0
+    int32 *Scratch_mem
+  Returns
+
+    int32 in[],
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    The frequency lines are preprocessed by the "alias reduction" scheme
+    and fed into the IMDCT matrix, each 18 into one transform block.
+    The first half of the output values are added to the stored overlap
+    values from the last block. These values are new output values and
+    are input values for the polyphase filterbank. The second half of the
+    output values is stored for overlap with the next data granule.
+    The number of windowed samples is 12 for short blocks, and 36 for long
+    blocks
+
+Windowing
+
+    Depending on window_switching_flag[gr][ch], block_type[gr][ch] and
+    mixed_block_flag[gr][ch] different shapes of windows are used.
+        normal window
+        start window
+        stop window
+        short windows
+            Each of the three short blocks is windowed separately.
+            The windowed short blocks must be overlapped and concatenated.
+
+Overlapping and adding with previous block
+
+    The first half (18 values) of the current block (36 values) has to be
+    overlapped with the second half of the previous block. The second half
+    of the current block has to be stored for overlapping with the next block
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_imdct_synth.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_mdct_18.h"
+#include "pvmp3_mdct_6.h"
+#include "mp3_mem_funcs.h"
+
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define LONG        0
+#define START       1
+#define SHORT       2
+#define STOP        3
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/*
+ *   sin(pi/36*(k+0.5)),k=0..35
+ */
+
+const int32 normal_win[36] =
+{
+    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
+    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
+    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
+    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
+    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
+    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
+    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
+    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
+    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
+    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
+    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
+    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
+};
+
+
+const int32 start_win[36] =
+{
+    /*   k=0..17  sin(pi/36*(k+0.5)),  */
+    Qfmt_31(0.08723877473068f),   Qfmt_31(0.26105238444010f),   Qfmt_31(0.43287922787620f),
+    Qfmt_31(0.60141159900854f),   Qfmt_31(0.76536686473018f),   Qfmt_31(0.92349722647006f),
+    Qfmt_31(0.53729960834682f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.67559020761566f),
+    Qfmt_31(-0.73727733681012f),   Qfmt_31(-0.79335334029124f),   Qfmt_31(0.84339144581289f),
+    Qfmt_31(0.88701083317822f),   Qfmt_31(0.92387953251129f),   Qfmt_31(-0.95371695074823f),
+    Qfmt_31(-0.97629600711993f),   Qfmt_31(-0.99144486137381f),   Qfmt_31(-0.99904822158186f),
+
+    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
+    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),
+    /*    k=24..29; sin(pi/12*(k-18+0.5)) */
+    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
+    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
+
+    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
+    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f)
+};
+
+
+const int32 stop_win[36] =
+{
+    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
+    Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),   Qfmt_31(0.00000000000000f),
+    /*    k=6..11; sin(pi/12*(k-6+0.5)) */
+    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
+    Qfmt_31(-0.79335334029124f),   Qfmt_31(-0.92387953251129f),   Qfmt_31(0.99144486137381f),
+
+    Qfmt_31(0.99999990000000f),   Qfmt_31(0.99999990000000f),   Qfmt_31(-0.99999990000000f),
+    Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),   Qfmt_31(-0.99999990000000f),
+    /*   k=18..35  sin(pi/36*(k+0.5)),  */
+    Qfmt_31(0.99904822158186f),   Qfmt_31(0.99144486137381f),   Qfmt_31(0.97629600711993f),
+    Qfmt_31(0.95371695074823f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.88701083317822f),
+    Qfmt_31(0.84339144581289f),   Qfmt_31(0.79335334029124f),   Qfmt_31(0.73727733681012f),
+    Qfmt_31(0.67559020761566f),   Qfmt_31(0.60876142900872f),   Qfmt_31(0.53729960834682f),
+    Qfmt_31(0.46174861323503f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.30070579950427f),
+    Qfmt_31(0.21643961393810f),   Qfmt_31(0.13052619222005f),   Qfmt_31(0.04361938736534f)
+};
+
+
+const int32 short_win[12] =
+{
+    /*    k=0..11; sin(pi/12*(k+0.5)) */
+    Qfmt_31(0.13052619222005f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.60876142900872f),
+    Qfmt_31(0.79335334029124f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.99144486137381f),
+    Qfmt_31(0.99144486137381f),   Qfmt_31(0.92387953251129f),   Qfmt_31(0.79335334029124f),
+    Qfmt_31(0.60876142900872f),   Qfmt_31(0.38268343236509f),   Qfmt_31(0.13052619222005f),
+};
+/*----------------------------------------------------------------------------
+; 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 pvmp3_imdct_synth(int32  in[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       int32  overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       uint32 blk_type,
+                       int16  mx_band,
+                       int32  used_freq_lines,
+                       int32  *Scratch_mem)
+{
+
+    int32 band;
+    int32 bands2process = used_freq_lines + 2;
+
+    if (bands2process > SUBBANDS_NUMBER)
+    {
+        bands2process = SUBBANDS_NUMBER;  /* default */
+    }
+
+
+    /*
+     *  in case of mx_poly_band> 0, do
+     *  long transforms
+     */
+
+
+    for (band = 0; band < bands2process; band++)
+    {
+        uint32 current_blk_type = (band < mx_band) ? LONG : blk_type;
+
+        int32 * out     = in      + (band * FILTERBANK_BANDS);
+        int32 * history = overlap + (band * FILTERBANK_BANDS);
+
+        switch (current_blk_type)
+        {
+            case LONG:
+
+                pvmp3_mdct_18(out, history, normal_win);
+
+                break;
+
+            case START:
+
+                pvmp3_mdct_18(out, history, start_win);
+
+                break;
+
+            case STOP:
+
+                pvmp3_mdct_18(out, history, stop_win);
+
+                break;
+
+            case SHORT:
+            {
+                int32 *tmp_prev_ovr = &Scratch_mem[FILTERBANK_BANDS];
+                int32 i;
+
+                for (i = 0; i < 6; i++)
+                {
+                    Scratch_mem[i    ] = out[(i*3)];
+                    Scratch_mem[6  +i] = out[(i*3) + 1];
+                    Scratch_mem[12 +i] = out[(i*3) + 2];
+                }
+
+                pvmp3_mdct_6(&Scratch_mem[ 0], &tmp_prev_ovr[ 0]);
+                pvmp3_mdct_6(&Scratch_mem[ 6], &tmp_prev_ovr[ 6]);
+                pvmp3_mdct_6(&Scratch_mem[12], &tmp_prev_ovr[12]);
+
+                for (i = 0; i < 6; i++)
+                {
+                    int32 temp  =  history[i];
+                    /* next iteration overlap */
+                    history[i]  =  fxp_mul32_Q32(tmp_prev_ovr[ 6+i] << 1, short_win[6+i]);
+                    history[i] +=  fxp_mul32_Q32(Scratch_mem[12+i] << 1, short_win[  i]);
+                    out[i]  =  temp;
+                }
+
+                for (i = 0; i < 6; i++)
+                {
+                    out[i+6]   =  fxp_mul32_Q32(Scratch_mem[i] << 1, short_win[i]);
+                    out[i+6]  +=  history[i+6];
+                    /* next iteration overlap */
+                    history[i+6]  =  fxp_mul32_Q32(tmp_prev_ovr[12+i] << 1, short_win[6+i]);
+
+                }
+                for (i = 0; i < 6; i++)
+                {
+                    out[i+12]  =  fxp_mul32_Q32(tmp_prev_ovr[  i] << 1, short_win[6+i]);
+                    out[i+12] +=  fxp_mul32_Q32(Scratch_mem[6+i] << 1, short_win[  i]);
+                    out[i+12] +=  history[i+12];
+                    history[12+i]  =  0;
+                }
+            }
+
+            break;
+        }
+
+        /*
+         *     Compensation for frequency inversion of polyphase filterbank
+         *     every odd time sample of every odd odd subband is mulitplied by -1  before
+         *     processing by the polyphase filter
+         */
+
+        if (band & 1)
+        {
+            for (int32 slot = 1; slot < FILTERBANK_BANDS; slot += 6)
+            {
+                int32 temp1 = out[slot  ];
+                int32 temp2 = out[slot+2];
+                int32 temp3 = out[slot+4];
+                out[slot  ] = -temp1;
+                out[slot+2] = -temp2;
+                out[slot+4] = -temp3;
+            }
+        }
+    }
+
+
+    for (band = bands2process; band < SUBBANDS_NUMBER; band++)
+    {
+        int32 * out     = in      + (band * FILTERBANK_BANDS);
+        int32 * history = overlap + (band * FILTERBANK_BANDS);
+        int32 slot;
+
+        if (band & 1)
+        {
+            for (slot = 0; slot < FILTERBANK_BANDS; slot += 6)
+            {
+                int32 temp1 =  history[slot  ];
+                int32 temp2 =  history[slot+1];
+                int32 temp3 =  history[slot+2];
+                out[slot  ] =  temp1;
+                out[slot+1] = -temp2;
+                out[slot+2] =  temp3;
+
+                temp1 =  history[slot+3];
+                temp2 =  history[slot+4];
+                temp3 =  history[slot+5];
+                out[slot+3] = -temp1;
+                out[slot+4] =  temp2;
+                out[slot+5] = -temp3;
+            }
+        }
+        else
+        {
+            for (slot = 0; slot < FILTERBANK_BANDS; slot += 3)
+            {
+                int32 temp1 =  history[slot  ];
+                int32 temp2 =  history[slot+1];
+                int32 temp3 =  history[slot+2];
+                out[slot  ] =  temp1;
+                out[slot+1] =  temp2;
+                out[slot+2] =  temp3;
+            }
+        }
+
+        pv_memset(history, 0, FILTERBANK_BANDS*sizeof(*overlap));
+    }
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.h
new file mode 100644
index 0000000..ea42e49
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_imdct_synth.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_imdct_synth.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+*/
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+
+#ifndef PVMP3_IMDCT_SYNTH_H
+#define PVMP3_IMDCT_SYNTH_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_imdct_synth(int32 in[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    int32 overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    uint32 blk_type,
+    int16 mx_band,
+    int32 used_freq_lines,
+    int32 *Scratch_mem);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.cpp
new file mode 100644
index 0000000..09a735b
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.cpp
@@ -0,0 +1,289 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: mdct_18.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    int32 vec[],        input vector of length 18
+    int32 *history      input for overlap and add, vector updated with
+                        next overlap and add values
+    const int32 *window sine window used in the mdct, three types are allowed
+                        noraml, start and stop
+Returns
+    none                mdct computation in-place
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns the mdct of length 18 of the input vector, as well as the overlap
+    vector for next iteration ( on history[])
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_mdct_18.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
+----------------------------------------------------------------------------*/
+const int32 cosTerms_dct18[9] =
+{
+    Qfmt(0.50190991877167f),   Qfmt(0.51763809020504f),   Qfmt(0.55168895948125f),
+    Qfmt(0.61038729438073f),   Qfmt(0.70710678118655f),   Qfmt(0.87172339781055f),
+    Qfmt(1.18310079157625f),   Qfmt(1.93185165257814f),   Qfmt(5.73685662283493f)
+};
+
+
+const int32 cosTerms_1_ov_cos_phi[18] =
+{
+
+    Qfmt1(0.50047634258166f),  Qfmt1(0.50431448029008f),  Qfmt1(0.51213975715725f),
+    Qfmt1(0.52426456257041f),  Qfmt1(0.54119610014620f),  Qfmt1(0.56369097343317f),
+    Qfmt1(0.59284452371708f),  Qfmt1(0.63023620700513f),  Qfmt1(0.67817085245463f),
+
+    Qfmt2(0.74009361646113f),  Qfmt2(0.82133981585229f),  Qfmt2(0.93057949835179f),
+    Qfmt2(1.08284028510010f),  Qfmt2(1.30656296487638f),  Qfmt2(1.66275476171152f),
+    Qfmt2(2.31011315767265f),  Qfmt2(3.83064878777019f),  Qfmt2(11.46279281302667f)
+};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_mdct_18(int32 vec[], int32 *history, const int32 *window)
+{
+    int32 i;
+    int32 tmp;
+    int32 tmp1;
+    int32 tmp2;
+    int32 tmp3;
+    int32 tmp4;
+
+
+
+    const int32 *pt_cos_split = cosTerms_dct18;
+    const int32 *pt_cos       = cosTerms_1_ov_cos_phi;
+    const int32 *pt_cos_x     = &cosTerms_1_ov_cos_phi[17];
+    int32 *pt_vec   =  vec;
+    int32 *pt_vec_o = &vec[17];
+
+
+    for (i = 9; i != 0; i--)
+    {
+        tmp  = *(pt_vec);
+        tmp1 = *(pt_vec_o);
+        tmp  = fxp_mul32_Q32(tmp << 1,  *(pt_cos++));
+        tmp1 = fxp_mul32_Q27(tmp1, *(pt_cos_x--));
+        *(pt_vec++)   =   tmp + tmp1 ;
+        *(pt_vec_o--) = fxp_mul32_Q28((tmp - tmp1), *(pt_cos_split++));
+    }
+
+
+    pvmp3_dct_9(vec);         // Even terms
+    pvmp3_dct_9(&vec[9]);     // Odd  terms
+
+
+    tmp3     = vec[16];  //
+    vec[16]  = vec[ 8];
+    tmp4     = vec[14];  //
+    vec[14]  = vec[ 7];
+    tmp      = vec[12];
+    vec[12]  = vec[ 6];
+    tmp2     = vec[10];  // vec[10]
+    vec[10]  = vec[ 5];
+    vec[ 8]  = vec[ 4];
+    vec[ 6]  = vec[ 3];
+    vec[ 4]  = vec[ 2];
+    vec[ 2]  = vec[ 1];
+    vec[ 1]  = vec[ 9] - tmp2; //  vec[9] +  vec[10]
+    vec[ 3]  = vec[11] - tmp2;
+    vec[ 5]  = vec[11] - tmp;
+    vec[ 7]  = vec[13] - tmp;
+    vec[ 9]  = vec[13] - tmp4;
+    vec[11]  = vec[15] - tmp4;
+    vec[13]  = vec[15] - tmp3;
+    vec[15]  = vec[17] - tmp3;
+
+
+    /* overlap and add */
+
+    tmp2 = vec[0];
+    tmp3 = vec[9];
+
+    for (i = 0; i < 6; i++)
+    {
+        tmp  = history[ i];
+        tmp4 = vec[i+10];
+        vec[i+10] = tmp3 + tmp4;
+        tmp1 = vec[i+1];
+        vec[ i] =  fxp_mac32_Q32(tmp, (vec[i+10]), window[ i]);
+        tmp3 = tmp4;
+        history[i  ] = -(tmp2 + tmp1);
+        tmp2 = tmp1;
+    }
+
+    tmp  = history[ 6];
+    tmp4 = vec[16];
+    vec[16] = tmp3 + tmp4;
+    tmp1 = vec[7];
+    vec[ 6] =  fxp_mac32_Q32(tmp, vec[16] << 1, window[ i]);
+    tmp  = history[ 7];
+    history[6] = -(tmp2 + tmp1);
+    history[7] = -(tmp1 + vec[8]);
+
+    tmp1  = history[ 8];
+    tmp4    = vec[17] + tmp4;
+    vec[ 7] =  fxp_mac32_Q32(tmp, tmp4 << 1, window[ 7]);
+    history[8] = -(vec[8] + vec[9]);
+    vec[ 8] =  fxp_mac32_Q32(tmp1, vec[17] << 1, window[ 8]);
+
+    tmp  = history[9];
+    tmp1 = history[17];
+    tmp2 = history[16];
+    vec[ 9] =  fxp_mac32_Q32(tmp,  vec[17] << 1, window[ 9]);
+
+    vec[17] =  fxp_mac32_Q32(tmp1, vec[10] << 1, window[17]);
+    vec[10] = -vec[ 16];
+    vec[16] =  fxp_mac32_Q32(tmp2, vec[11] << 1, window[16]);
+    tmp1 = history[15];
+    tmp2 = history[14];
+    vec[11] = -vec[ 15];
+    vec[15] =  fxp_mac32_Q32(tmp1, vec[12] << 1, window[15]);
+    vec[12] = -vec[ 14];
+    vec[14] =  fxp_mac32_Q32(tmp2, vec[13] << 1, window[14]);
+
+    tmp  = history[13];
+    tmp1 = history[12];
+    tmp2 = history[11];
+    tmp3 = history[10];
+    vec[13] =  fxp_mac32_Q32(tmp,  vec[12] << 1, window[13]);
+    vec[12] =  fxp_mac32_Q32(tmp1, vec[11] << 1, window[12]);
+    vec[11] =  fxp_mac32_Q32(tmp2, vec[10] << 1, window[11]);
+    vec[10] =  fxp_mac32_Q32(tmp3,    tmp4 << 1, window[10]);
+
+
+    /* next iteration overlap */
+
+    tmp1 = history[ 8];
+    tmp3 = history[ 7];
+    tmp2 = history[ 1];
+    tmp  = history[ 0];
+    tmp1 <<= 1;
+    tmp3 <<= 1;
+
+    history[ 0] = fxp_mul32_Q32(tmp1, window[18]);
+    history[17] = fxp_mul32_Q32(tmp1, window[35]);
+    history[ 1] = fxp_mul32_Q32(tmp3, window[19]);
+    history[16] = fxp_mul32_Q32(tmp3, window[34]);
+
+    tmp2 <<= 1;
+    tmp  <<= 1;
+    history[ 7] = fxp_mul32_Q32(tmp2, window[25]);
+    history[10] = fxp_mul32_Q32(tmp2, window[28]);
+    history[ 8] = fxp_mul32_Q32(tmp,  window[26]);
+    history[ 9] = fxp_mul32_Q32(tmp,  window[27]);
+
+    tmp1 = history[ 6];
+    tmp3 = history[ 5];
+    tmp4 = history[ 4];
+    tmp2 = history[ 3];
+    tmp  = history[ 2];
+
+    tmp1 <<= 1;
+    tmp3 <<= 1;
+    tmp4 <<= 1;
+
+    history[ 2] = fxp_mul32_Q32(tmp1, window[20]);
+    history[15] = fxp_mul32_Q32(tmp1, window[33]);
+    history[ 3] = fxp_mul32_Q32(tmp3, window[21]);
+    history[14] = fxp_mul32_Q32(tmp3, window[32]);
+    history[ 4] = fxp_mul32_Q32(tmp4, window[22]);
+    history[13] = fxp_mul32_Q32(tmp4, window[31]);
+    tmp2 <<= 1;
+    tmp  <<= 1;
+    history[ 5] = fxp_mul32_Q32(tmp2, window[23]);
+    history[12] = fxp_mul32_Q32(tmp2, window[30]);
+    history[ 6] = fxp_mul32_Q32(tmp,  window[24]);
+    history[11] = fxp_mul32_Q32(tmp,  window[29]);
+}
+
+#endif // If not assembly
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.h
new file mode 100644
index 0000000..e497aee
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_18.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./include/pvmp3_mdct_18.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines function mdct_18, dct9, mdct_6 and dct_6
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef  MDCT_18_H
+#define  MDCT_18_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define Qfmt(a)    (Int32)(a*((Int32)1<<28) )
+#define Qfmt1(a)   (Int32)(a*((Int32)0x7FFFFFFF))
+#define Qfmt2(a)   (Int32)(a*((Int32)1<<27))
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+    void pvmp3_mdct_18(int32 vec[], int32 *history, const int32 *window);
+
+    void pvmp3_dct_9(int32 vec[]);
+
+    void pvmp3_mdct_6(int32 vec[], int32 *overlap);
+
+    void pvmp3_dct_6(int32 vec[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.cpp
new file mode 100644
index 0000000..6a72aad
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+   Filename: mdct_18.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    int32 vec[],        input vector of length 6
+    int32 *history      input for overlap and add, vector updated with
+                        next overlap and add values
+Returns
+    none                mdct computation in-place
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    Returns the mdct of length 6 of the input vector, as well as the overlap
+    vector for next iteration ( on history[])
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_mdct_6.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define QFORMAT    29
+#define Qfmt29(a)   (int32)(a*((int32)1<<QFORMAT) + (a>=0?0.5F:-0.5F))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/*
+ *  (1./(2*cos((pi/(2*N))*(2*i+1)))),  N = 12, i = [0:N/2-1]
+ */
+
+const int32 cosTerms_1_ov_cos_phi_N6[6] =
+{
+
+    Qfmt29(0.50431448029008f),   Qfmt29(0.54119610014620f),
+    Qfmt29(0.63023620700513f),   Qfmt29(0.82133981585229f),
+    Qfmt29(1.30656296487638f),   Qfmt29(3.83064878777019f)
+};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_mdct_6(int32 vec[], int32 *history)
+{
+    int32 i;
+    int32 tmp;
+    int32 tmp1;
+    int32 tmp2;
+
+    int32 *pt_vec   = vec;
+    int32 *pt_vec_o = vec;
+    const int32 *pt_cos = cosTerms_1_ov_cos_phi_N6;
+
+    for (i = 2; i != 0; i--)
+    {
+        tmp  = *(pt_vec++);
+        tmp1 = *(pt_vec++);
+        tmp2 = *(pt_vec++);
+        *(pt_vec_o++)   = fxp_mul32_Q29(tmp, *(pt_cos++));
+        *(pt_vec_o++)   = fxp_mul32_Q29(tmp1, *(pt_cos++));
+        *(pt_vec_o++)   = fxp_mul32_Q29(tmp2, *(pt_cos++));
+    }
+
+
+    pvmp3_dct_6(vec);    // Even terms
+
+
+    tmp = -(vec[0] + vec[1]);
+    history[3] = tmp;
+    history[2] = tmp;
+    tmp = -(vec[1] + vec[2]);
+    vec[0] =  vec[3] + vec[4];
+    vec[1] =  vec[4] + vec[5];
+    history[4] = tmp;
+    history[1] = tmp;
+    tmp = -(vec[2] + vec[3]);
+    vec[4] = -vec[1];
+    history[5] = tmp;
+    history[0] = tmp;
+
+    vec[2] =  vec[5];
+    vec[3] = -vec[5];
+    vec[5] = -vec[0];
+
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.h
new file mode 100644
index 0000000..6ba53d7
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mdct_6.h
@@ -0,0 +1,106 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Pathname: ./include/pvmp3_mdct_6.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines function mdct_18, dct9, mdct_6 and dct_6
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef  PVMP3_MDCT_6_H
+#define  PVMP3_MDCT_6_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define Qfmt(a)    (Int32)(a*((Int32)1<<28) )
+#define Qfmt1(a)   (Int32)(a*((Int32)0x7FFFFFFF))
+#define Qfmt2(a)   (Int32)(a*((Int32)1<<27))
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+    void pvmp3_mdct_6(int32 vec[], int32 *overlap);
+
+    void pvmp3_dct_6(int32 vec[]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.cpp
new file mode 100644
index 0000000..ee42dc5
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_get_scale_data.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    mp3SideInfo     *si,                    side information
+    int32           gr,                     granule
+    int32           ch,                     channel
+    mp3Header       *info,                  mp3 header information
+    uint32          *scalefac_buffer,
+    uint32          *scalefac_IIP_buffer,
+    tbits           *pMainData               bit stream Data
+
+ Returns
+
+    uint32          *scalefac_buffer,       acquired scale band data
+    uint32          *scalefac_IIP_buffer,   auxiliary scale data
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    get scale data for mpeg2 layer III LSF extension
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_mpeg2_get_scale_data.h"
+#include "pvmp3_getbits.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
+----------------------------------------------------------------------------*/
+
+const uint32 nr_of_sfb_block[6][3][4] =
+{   {{ 6,  5, 5, 5}, {  9,  9,  9, 9}, { 6,  9,  9, 9}},
+    {{ 6,  5, 7, 3}, {  9,  9, 12, 6}, { 6,  9, 12, 6}},
+    {{11, 10, 0, 0}, { 18, 18,  0, 0}, {15, 18,  0, 0}},
+    {{ 7,  7, 7, 0}, { 12, 12, 12, 0}, { 6, 15, 12, 0}},
+    {{ 6,  6, 6, 3}, { 12,  9,  9, 6}, { 6, 12,  9, 6}},
+    {{ 8,  8, 5, 0}, { 15, 12,  9, 0}, { 6, 18,  9, 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 pvmp3_mpeg2_get_scale_data(mp3SideInfo *si,
+                                int32        gr,
+                                int32        ch,
+                                mp3Header   *info,
+                                uint32      *scalefac_buffer,
+                                uint32      *scalefac_IIP_buffer,
+                                tmp3Bits    *pMainData)
+{
+    int16 i;
+    int16 j;
+    int16 k;
+    int16 blocktypenumber = 0;
+    int16 blocknumber = 0;
+
+    granuleInfo *gr_info = &(si->ch[ch].gran[gr]);
+    uint32 scalefac_comp, int_scalefac_comp, new_slen[4];
+
+    scalefac_comp =  gr_info->scalefac_compress;
+
+
+
+    if ((((info->mode_ext &1)) && (ch == 1)))
+    {
+        /*   intensity_scale = scalefac_comp %2; */
+        int_scalefac_comp = scalefac_comp >> 1;
+
+        if (int_scalefac_comp  < 180)
+        {
+            new_slen[0] = int_scalefac_comp  / 36;
+            new_slen[1] = (int_scalefac_comp % 36) / 6;
+            new_slen[2] = int_scalefac_comp % 6;
+            blocknumber = 3;
+        }
+        else if (int_scalefac_comp  < 244)
+        {
+            int_scalefac_comp -= 180;
+            new_slen[0] = (int_scalefac_comp & 63) >> 4;
+            new_slen[1] = (int_scalefac_comp & 15) >> 2;
+            new_slen[2] =  int_scalefac_comp &  3;
+            blocknumber = 4;
+        }
+        else if (int_scalefac_comp  <= 255)
+        {
+            int_scalefac_comp -= 244;
+            new_slen[0] = (int_scalefac_comp) / 3;
+            new_slen[1] = (int_scalefac_comp) % 3;
+            new_slen[2] = 0;
+            blocknumber = 5;
+        }
+        new_slen[3] = 0;
+        si->ch[ch].gran[gr].preflag = 0;
+    }
+    else
+    {
+        if (scalefac_comp < 400)
+        {
+            new_slen[0] = (scalefac_comp >> 4) / 5;
+            new_slen[1] = (scalefac_comp >> 4) % 5;
+            new_slen[2] = (scalefac_comp & 15) >> 2 ;
+            new_slen[3] = (scalefac_comp & 3);
+            si->ch[ch].gran[gr].preflag = 0;
+
+            blocknumber = 0;
+        }
+        else if (scalefac_comp  < 500)
+        {
+            scalefac_comp -= 400;
+            new_slen[0] = (scalefac_comp >> 2) / 5;
+            new_slen[1] = (scalefac_comp >> 2) % 5;
+            new_slen[2] = scalefac_comp  & 3;
+            new_slen[3] = 0;
+            si->ch[ch].gran[gr].preflag = 0;
+            blocknumber = 1;
+        }
+        else if (scalefac_comp  < 512)
+        {
+            scalefac_comp -= 500;
+            new_slen[0] = scalefac_comp / 3;
+            new_slen[1] = scalefac_comp % 3;
+            new_slen[2] = 0 ;
+            new_slen[3] = 0;
+            si->ch[ch].gran[gr].preflag = 1;
+            blocknumber = 2;
+        }
+    }
+
+    if (gr_info->block_type == 2)
+    {
+        if (gr_info->mixed_block_flag)
+        {
+            blocktypenumber = 2;
+        }
+        else
+        {
+            blocktypenumber = 1;
+        }
+    }
+
+    k = 0;
+    for (i = 0; i < 4; i++)
+    {
+        if (new_slen[i])
+        {
+            for (j = 0; j < (int16)nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++)
+            {
+                scalefac_buffer[k] =  getNbits(pMainData, new_slen[i]);
+                scalefac_IIP_buffer[k] = (1L << new_slen[i]) - 1;
+                k++;
+            }
+        }
+        else
+        {
+            for (j = 0; j < (int16)nr_of_sfb_block[blocknumber][blocktypenumber][i]; j++)
+            {
+                scalefac_buffer[k]     = 0;
+                scalefac_IIP_buffer[k] = 0;
+                k++;
+            }
+        }
+    }
+}
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.h
new file mode 100644
index 0000000..630ed61
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_data.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_get_scale_data.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_MPEG2_GET_SCALE_DATA_H
+#define PVMP3_MPEG2_GET_SCALE_DATA_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_mpeg2_get_scale_data(mp3SideInfo  *si,
+    int32         gr,
+    int32         ch,
+    mp3Header    *info,
+    uint32       *scalefac_buffer,
+    uint32       *scalefac_IIP_buffer,
+    tmp3Bits     *pMainData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.cpp
new file mode 100644
index 0000000..e4d29d6
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_get_scale_factors.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+    mp3ScaleFactors *scalefac,
+    mp3SideInfo     *si,                    side information
+    int32           gr,                     granule
+    int32           ch,                     channel
+    mp3Header       *info,                  mp3 header information
+    uint32          *scalefac_IIP_buffer,   auxiliary scale data
+    tbits           *pMainData               bit stream Data
+
+ Returns
+
+    III_scalefac_t  *scalefac,              scale factor
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    get scale factor for mpe2 layer III LSF extension
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_mpeg2_get_scale_factors.h"
+#include "pvmp3_mpeg2_get_scale_data.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 pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors *scalefac,
+                                   mp3SideInfo     *si,
+                                   int32           gr,
+                                   int32           ch,
+                                   mp3Header       *info,
+                                   uint32          *scalefac_IIP_buffer,
+                                   tmp3Bits        *pMainData)
+{
+
+    int32 sfb;
+    int32 k = 0;
+    int32 window;
+    uint32 *scalefac_buffer     = &scalefac_IIP_buffer[56];
+
+    granuleInfo *gr_info = &(si->ch[ch].gran[gr]);
+
+    pvmp3_mpeg2_get_scale_data(si,
+                               gr,
+                               ch,
+                               info,
+                               (uint32 *)scalefac_buffer,
+                               (uint32 *)scalefac_IIP_buffer,
+                               pMainData);
+
+
+    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
+    {
+        if (gr_info->mixed_block_flag)
+        {
+            for (sfb = 0; sfb < 6; sfb++)
+            {
+                scalefac->l[sfb] = scalefac_buffer[sfb];
+            }
+
+
+            k = 6;
+            for (sfb = 3; sfb < 12; sfb++)
+            {
+                for (window = 0; window < 3; window++)
+                {
+                    scalefac->s[window][sfb] = scalefac_buffer[k];
+                    k++;
+                }
+            }
+
+
+            /* adjust position of "illegal position" information in scalefac_IIP_buffer[] */
+            /* in mixed blocks mode for short sfb, move them 3 places up. efs 3002-07-04  */
+            for (sfb = 11; sfb >= 3; sfb--)
+            {
+                scalefac_IIP_buffer[3*sfb + 2] = scalefac_IIP_buffer[3*sfb - 1];
+                scalefac_IIP_buffer[3*sfb + 1] = scalefac_IIP_buffer[3*sfb - 2];
+                scalefac_IIP_buffer[3*sfb    ] = scalefac_IIP_buffer[3*sfb - 3];
+
+            }
+        }
+        else
+        {  /* SHORT*/
+            for (sfb = 0; sfb < 12; sfb++)
+            {
+                for (window = 0; window < 3; window++)
+                {
+                    scalefac->s[window][sfb] = scalefac_buffer[k];
+                    k++;
+                }
+            }
+        }
+
+        scalefac->s[0][12] = 0;
+        scalefac->s[1][12] = 0;
+        scalefac->s[2][12] = 0;
+
+    }
+    else
+    {   /* LONG types 0,1,3 */
+        for (sfb = 0; sfb < 21; sfb++)
+        {
+            scalefac->l[sfb] = scalefac_buffer[sfb];
+        }
+        scalefac->l[21] = 0;
+        scalefac->l[22] = 0;
+
+    }
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.h
new file mode 100644
index 0000000..46d16b3
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_get_scale_factors.h
@@ -0,0 +1,105 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_get_scale_factors.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_MPEG2_GET_SCALE_FACTORS_H
+#define PVMP3_MPEG2_GET_SCALE_FACTORS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.h"
+#include "s_mp3bits.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_mpeg2_get_scale_factors(mp3ScaleFactors *scalefac,
+    mp3SideInfo     *si,
+    int32           gr,
+    int32           ch,
+    mp3Header       *info,
+    uint32          *scalefac_IIP_buffer,
+    tmp3Bits        *pMainData);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.cpp
new file mode 100644
index 0000000..c79062c
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.cpp
@@ -0,0 +1,700 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_stereo_proc.cpp
+
+   Functions:
+
+     pvmp3_st_intensity_ver2
+     pvmp3_mpeg2_stereo_proc
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+
+------------------------------------------------------------------------------
+
+pvmp3_st_intensity_ver2
+
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+   int32 xr[],      input channel
+   int32 xl[],
+   int32 m,         selecting index: io = 2(1/4) (m=0), io = 2(1/8) (m=1)
+   int32 is_pos,    index on table  is_pos_pow_eitgh_root_of_2
+   int32 Start,     Location of first element where stereo intensity is applied
+   int32 Number     number of elements affected
+
+ Returns
+
+   int32 xl[],      generated stereo channel
+
+
+
+
+------------------------------------------------------------------------------
+
+pvmp3_mpeg2_stereo_proc
+
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+   int32 xr[],                     input channel
+   int32 xl[],
+   mp3ScaleFactors *scalefac,      scale factors structure for Right channel
+   granuleInfo *gr_info_l,         granule structure for the left channel
+   granuleInfo *gr_info_r,         granule structure for the rigth channel
+   uint32 *scalefac_IIP_buffer,    auxiliary scale factor vector
+   mp3Header *info                 mp3 header info
+ Returns
+
+   int32 xl[],      generated stereo channel
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    stereo processing for mpeg2 layer III LSF extension
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_mpeg2_stereo_proc.h"
+#include "pvmp3_stereo_proc.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_tables.h"
+#include "mp3_mem_funcs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+
+#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*a))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+const int32 is_pos_pow_eitgh_root_of_2[8] =
+{
+    /*   --- 2^(1/8) ----- */
+    Q31_fmt(1.00000000000000),   Q31_fmt(0.91700404320467),   Q31_fmt(0.84089641525371),
+    Q31_fmt(0.77110541270397),   Q31_fmt(0.70710678118655),   Q31_fmt(0.64841977732550),
+    Q31_fmt(0.59460355750136),   Q31_fmt(0.54525386633263)
+};
+
+/*----------------------------------------------------------------------------
+; 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 pvmp3_st_intensity_ver2(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                             int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                             int32 m,
+                             int32 is_pos,
+                             int32 Start,
+                             int32 Number)
+{
+    int32 k[2];
+
+    /* pow(io, ((is_pos + 1)>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1) */
+    k[0] = is_pos_pow_eitgh_root_of_2[((is_pos+1)&(3+(m<<2)))<<(1-m)] >> ((is_pos + 1) >> (2 + m));
+    /* pow(io, (is_pos>>1)); io = 2(1/4) (m=0), io = 2(1/8) (m=1)  */
+    k[1] = is_pos_pow_eitgh_root_of_2[(is_pos&(3+(m<<2)))<<(1-m)] >> (is_pos >> (2 + m));
+
+
+    int32 *pt_xr  = &xr[Start];
+    int32 *pt_xl  = &xl[Start];
+
+    if (is_pos == 0)    /* 0 < is_pos < 31 */
+    {
+        pv_memcpy(pt_xl, pt_xr, Number*sizeof(*pt_xr));
+    }
+    else if (is_pos & 1)
+    {
+        for (int32 i = Number >> 1; i != 0; i--)
+        {
+            *(pt_xl++) = (*pt_xr);
+            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
+            pt_xr++;
+            *(pt_xl++) = (*pt_xr);
+            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
+            pt_xr++;
+        }
+        if (Number&1)
+        {
+            *(pt_xl) = (*pt_xr);
+            *(pt_xr) = fxp_mul32_Q32((*pt_xr) << 1, k[0]);
+        }
+    }
+    else
+    {
+        for (int32 i = Number >> 1; i != 0; i--)
+        {
+            *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
+            *(pt_xl++) = fxp_mul32_Q32((*(pt_xr++)) << 1, k[1]);
+        }
+        if (Number&1)
+        {
+            *(pt_xl) = fxp_mul32_Q32((*pt_xr) << 1, k[1]);
+        }
+    }
+
+}
+
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void pvmp3_mpeg2_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                             int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                             mp3ScaleFactors *scalefac_R,
+                             granuleInfo *gr_info_l,
+                             granuleInfo *gr_info_r,
+                             uint32 *scalefac_IIP_buffer,
+                             int32 used_freq_lines,
+                             mp3Header *info)
+{
+
+    int32 sfreq;
+    int32 sb;
+    int32 ss;
+    int32 sfbNo;
+    int32 sfbStart;
+    int32 sfb;
+    int32 sfbTemp;
+    int32 i;
+    int32 j;
+    int32 io;
+
+
+    int32 i_stereo  = (info->mode == MPG_MD_JOINT_STEREO) &&
+                      (info->mode_ext & 0x1);
+
+    int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
+                      (info->mode_ext & 0x2);
+
+
+    if (i_stereo)
+    {
+        if (gr_info_r->scalefac_compress & 1)
+        {
+            io = 0;  /* 2^(-1/4) */
+        }
+        else
+        {
+            io = 1;  /* 2^(-1/8) */
+        }
+
+        sfreq =  info->version_x + (info->version_x << 1);
+        sfreq += info->sampling_frequency;
+
+        if (gr_info_l->window_switching_flag && (gr_info_l->block_type == 2))
+        {
+            if (gr_info_l->mixed_block_flag)
+            {
+                /*
+                 * mixed blocks processing
+                 */
+                i = 31;
+                ss = 17;
+                sb = -1;
+
+                while (i >= 0)
+                {
+                    if (xl[(i*FILTERBANK_BANDS) + ss])
+                    {
+                        sb = (i << 4) + (i << 1) + ss;
+                        i = -1;
+                    }
+                    else
+                    {
+                        ss--;
+                        if (ss < 0)
+                        {
+                            i--;
+                            ss = 17;
+                        }
+                    }
+                }   /* now sb is the number of highest line with value != 0      */
+                /* can be between -1 (all lines zero) and 575 (no line zero) */
+
+                if (sb < 36)    /*  was (sb <= 36)  */
+                {
+                    /*
+                     *  mixed blocks processing: intensity bound inside long blocks
+                     */
+                    /* 1. long blocks up to intensity border: Stereo or M/S */
+                    if (mp3_sfBandIndex[sfreq].l[4] <= sb)
+                    {
+                        i = 4;
+                    }
+                    else
+                    {
+                        i = 0;
+                    }
+
+                    while (mp3_sfBandIndex[sfreq].l[i] <= sb)
+                    {
+                        i++;
+                    }
+                    sfbTemp = i;  /* from that (long) sfb on we have intensity stereo */
+
+                    sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp]; /* number of lines to process */
+
+                    /* from sfbStart up sfbNo lines do ms_stereo or normal stereo */
+                    if (ms_stereo)
+                    {
+                        pvmp3_st_mid_side(xr, xl, 0, sfbNo);
+                    }
+
+                    /* 2. long blocks from intensity border up to sfb band 6: intensity */
+                    /* calc. MPEG_1_2_Factor[0], MPEG_1_2_Factor[1] */
+
+                    for (sfb = sfbTemp; sfb < 6; sfb++)
+                    {
+                        sfbStart = mp3_sfBandIndex[sfreq].l[sfb];  /* = Start in 0 ... 575 */
+                        sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */
+
+                        if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb])
+                        {
+                            pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
+                        }
+                        else if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+                    }
+
+                    /* 3. now process all sfb with short blocks (3...12), all in intensity mode */
+
+                    for (j = 0; j < 3; j++)
+                    {
+                        /*   first calculate directional factors for intensity stereo,
+                         *   for all sfb in intensity mode, but only
+                         *   if they do not have "illegal" position:
+                         */
+                        /* to do this for all sfb we have to get information for last scale factor band:
+                         * here we clearly have more than one sfb in intensity mode,
+                         *  so copy factors and legal/illegal information from sfb11 to sfb12
+                         */
+                        (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
+                        scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];  /* legal/illegal in sfb 12 same as in sfb 11 */
+
+                        for (sfb = 3; sfb < 13; sfb++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
+
+                            if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
+                            {
+                                pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
+                            }
+                            else if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+                        }
+                    } /* for (j = 0; j < 3; j++) */
+                }
+                else  /*  else then (sb >= 36)  */
+                {
+                    /*
+                     *   mixed blocks processing: intensity bound outside long blocks
+                     */
+
+                    /* 2. short blocks, do for all 3  */
+                    /* ------------------------------ */
+                    for (j = 0; j < 3; j++)
+                    {
+                        int32 sfbcnt = -1;
+
+                        for (sfb = 12; sfb >= 3; sfb--)
+                        {
+                            int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+
+                            i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
+
+                            while (lines > 0)
+                            {
+                                if (xl[i])
+                                {
+                                    sfbcnt = sfb;
+                                    sfb = -10;
+                                    lines = -10;
+                                }
+                                lines--;
+                                i--;
+                            }
+                        }
+
+                        sfbcnt += 1;
+                        if (sfbcnt < 3)
+                        {
+                            sfbcnt = 3;   /* should not be necessary */
+                        }
+
+                        sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode        */
+                        /* can have values between 3 (all short sfb in intensity) */
+                        /* and 13 (no short sfb in intensity mode)                */
+
+                        /* 3. from sfbTemp to last sfb calculate is_ratio values:    */
+                        /* first calculate directional factors for intensity stereo, */
+                        /* for all sfb in intensity mode, but only                   */
+                        /* if they do not have "illegal" position:                   */
+
+                        /* to do this for all sfb we have to get information for last scale factor band: */
+                        /*  get factors for last scale factor band: */
+                        /* more than one sfb in intensity mode,
+                        copy factors and legal/illegal information from sfb11 to sfb12 */
+                        if (sfbTemp < 12)
+                        {
+                            (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
+                            scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];   /* legal/illegal in sfb 12 same as in sfb 11 */
+                        }
+                        else if (sfbTemp == sfb)
+                            /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
+                        {
+                            (scalefac_R->s[j][12]) = 0;
+                            scalefac_IIP_buffer[36 + j] = 1;    /* the scf value 0 in sfb12 is "legal" */
+                        }
+                        /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
+
+
+                        /* 4. do normal stereo or MS stereo from sfb 3 to < sfbTemp: */
+                        for (sfb = 3; sfb < sfbTemp; sfb++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
+
+                            if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+                        }
+
+                        /* 5. now intensity stereo processing of the remaining sfb's: */
+
+                        for (sfb = sfbTemp; sfb < 13; sfb++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
+                            if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
+                            {
+                                pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
+                            }
+                            else if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+                        }
+                        /*  end of correction by efs 2003-07-04 */
+                    } /* for (j = 0; j < 3; j++) */
+
+
+                    /* long blocks 0 up to sfb band 6: no intensity */
+
+                    sfbNo = mp3_sfBandIndex[sfreq].l[6];        /* number of lines to process */
+                    if (ms_stereo)
+                    {
+                        pvmp3_st_mid_side(xr, xl, 0, sfbNo);
+                    }
+
+                }  /* if intensity bound inside or outside long blocks */
+            }  /* if (gr_info->mixed_block_flag) */
+            else
+            {
+                /*
+                 *  short block processing
+                 */
+                for (j = 0; j < 3; j++)
+                {
+                    int32 sfbcnt = -1;
+
+                    for (sfb = 12; sfb >= 0; sfb--)
+                    {
+                        int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+                        i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
+
+                        while (lines > 0)
+                        {
+                            if (xl[i])
+                            {
+                                sfbcnt = sfb;
+                                sfb = -10;
+                                lines = -10;
+                            }
+                            lines--;
+                            i--;
+                        }
+                    }
+
+                    sfbcnt += 1;
+
+                    /*  start of corrected version by efs 2003-07-04  */
+                    sfbTemp = sfbcnt; /* from this (short) sfb on we have intensity mode        */
+                    /* can have values between 3 (all short sfb in intensity) */
+                    /* and 13 (no short sfb in intensity mode)                */
+
+                    /* first calculate directional factors for intensity stereo,
+                    for all sfb in intensity mode, but only
+                    if they do not have "illegal" position: */
+
+                    /* to do this for all sfb we have to get information for last scale factor band: */
+                    /* get factors for last scale factor band: */
+                    /* more than one sfb in intensity mode,
+                    copy factors and legal/illegal information from sfb11 to sfb12 */
+                    if (sfbTemp < 12)
+                    {
+                        (scalefac_R->s[j][12]) = (scalefac_R->s[j][11]);
+                        scalefac_IIP_buffer[36 + j] = scalefac_IIP_buffer[33 + j];  /* legal/illegal in sfb 12 same as in sfb 11 */
+                    }
+                    else if (sfbTemp == 12)
+                        /* only sfb 12 in intensity mode, use factors corresponding to is_pos[12] == 0 */
+                    {
+                        (scalefac_R->s[j][12]) = 0;
+                        scalefac_IIP_buffer[36 + j] = 1;    /* the scf value 0 in sfb12 is "legal" */
+                    }
+                    /* if sfbTemp > sfb (no sfb in intensity mode): do nothing */
+
+
+                    /* Now process audio samples */
+                    /* first process lower sfb's not in intensity mode */
+                    for (sfb = 0; sfb < sfbTemp; sfb++)
+                    {
+                        sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
+
+                        if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+                    }
+
+                    /* now intensity stereo processing of the remaining sfb's: */
+                    for (sfb = sfbTemp; sfb < 13; sfb++)
+                    {
+                        sfbNo = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb]; /* No of lines to process */
+                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfb] + j * sfbNo;
+
+                        if ((uint32)(scalefac_R->s[j][sfb]) != scalefac_IIP_buffer[3*sfb + j])
+                        {
+                            pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->s[j][sfb], sfbStart, sfbNo);
+                        }
+                        else if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+                    }
+
+                } /* for (j = 0; j < 3; j++) */
+
+            } /* end of else ( gr_info->mixed_block_flag) */
+
+        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
+        else
+        {
+            /*
+             *  long block processing
+             */
+            i = 31;
+            ss = 17;
+            sb = 0;
+
+            while (i >= 0)
+            {
+                if (xl[(i*FILTERBANK_BANDS) + ss])
+                {
+                    sb = (i << 4) + (i << 1) + ss;
+                    /*  i = -1     patched RF    24-09-2002   */
+                    i = -2;
+                }
+                else
+                {
+                    ss--;
+                    if (ss < 0)
+                    {
+                        i--;
+                        ss = 17;
+                    }
+                }
+            }
+
+            /*  patched RF    24-09-2002   */
+            if (sb)
+            {
+                if (mp3_sfBandIndex[sfreq].l[14] <= sb)
+                {
+                    i = 14;
+                }
+                else if (mp3_sfBandIndex[sfreq].l[7] <= sb)
+                {
+                    i = 7;
+                }
+                else
+                {
+                    i = 0;
+                }
+
+                while (mp3_sfBandIndex[sfreq].l[i] <= sb)
+                {
+                    i++;
+                }
+            }
+
+            else
+            {
+                if (i == -1)
+                {
+                    /*  all xr[1][][] are 0: set IS bound sfb to 0  */
+                    i = 0;
+                }
+                else
+                {
+                    /*  xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */
+                    i = 1;
+                }
+            }
+            /*  corrected version by efs 2003-07-04  */
+            sfbTemp = i;  /* from this (long) sfb on we have intensity mode        */
+            /* can have values between 0 (all long sfb in intensity) */
+            /* and 22 (no long sfb in intensity mode)                */
+
+            /* first calculate directional factors for intensity stereo,
+            for all sfb in intensity mode, but only if they
+            do not have "illegal" position: */
+
+            /* to do this for all sfb we have to get information for last scale factor band: */
+            if (sfbTemp < 21)
+                /* more than one sfb in intensity mode, */
+                /* copy factors and legal/illegal information from sfb20 to sfb21 */
+            {
+                (scalefac_R->l[21]) = (scalefac_R->l[20]);
+                scalefac_IIP_buffer[21] = scalefac_IIP_buffer[20];  /* legal/illegal in sfb 21 same as in sfb 20 */
+            }
+            else if (sfbTemp == 21)
+                /* only sfb 21 in intensity mode, is_pos[21] = 0 */
+            {
+                (scalefac_R->l[21]) = 0;
+                scalefac_IIP_buffer[21] = 1;    /* the scf value 0 in sfb21 is "legal" */
+            }
+            /* if sfbTemp > 21 (no sfb in intensity mode): do nothing */
+
+
+            /* Now process audio samples */
+            /* first process lower sfb's not in intensity mode */
+
+            sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp] - mp3_sfBandIndex[sfreq].l[0];
+            sfbStart = mp3_sfBandIndex[sfreq].l[0];
+
+            if (ms_stereo)
+            {
+                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+            }
+
+            /* now intensity stereo processing of the remaining sfb's: */
+            for (sfb = sfbTemp; sfb < 22; sfb++)
+            {
+                sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* number of lines to process */
+                sfbStart = mp3_sfBandIndex[sfreq].l[sfb];                          /* start of sfb */
+
+                if ((uint32)(scalefac_R->l[sfb]) != scalefac_IIP_buffer[sfb]) /* "legal" position ? */
+                {
+                    pvmp3_st_intensity_ver2(xr, xl, io, scalefac_R->l[sfb], sfbStart, sfbNo);
+                }
+                else if (ms_stereo)
+                {
+                    pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                }
+
+            }  /* for (sfb = sfbTemp; sfb < 22; sfb++) */
+
+        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
+
+    }  /* if (i_stereo) */
+    else
+    {
+        /*
+         *  normal or ms stereo processing
+         */
+        if (ms_stereo)
+        {
+            pvmp3_st_mid_side(xr, xl, 0, used_freq_lines);
+        }
+
+    } /* if (i_stereo) */
+
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.h
new file mode 100644
index 0000000..7db0c53
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_mpeg2_stereo_proc.h
@@ -0,0 +1,112 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_mpeg2_stereo_proc.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_MPEG2_STEREO_PROC_H
+#define PVMP3_MPEG2_STEREO_PROC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_mpeg2_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    mp3ScaleFactors *scalefac,
+    granuleInfo *gr_info_l,
+    granuleInfo *gr_info_r,
+    uint32 *scalefac_IIP_buffer,
+    int32 used_freq_lines,
+    mp3Header *info);
+
+
+    void pvmp3_st_intensity_ver2(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                                 int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                                 int32 m,
+                                 int32 is_pos,
+                                 int32 Start,
+                                 int32 Number);
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_normalize.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_normalize.cpp
new file mode 100644
index 0000000..e579bbd
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_normalize.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_normalize.cpp
+
+     Date: 10/02/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+    Int32 x             32-bit integer non-zero input
+Returns
+    Int32 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 "pvmp3_audio_type_defs.h"
+#include "pvmp3_normalize.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_V4))
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+
+/* function is inlined in header file */
+
+
+#else
+
+int32 pvmp3_normalize(int32 x)
+{
+    /*----------------------------------------------------------------------------
+    ; Define all local variables
+    ----------------------------------------------------------------------------*/
+    int32 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/mp3dec/src/pvmp3_normalize.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_normalize.h
new file mode 100644
index 0000000..5471771
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_normalize.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_normalize.h
+
+   Date: 10/02/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVMP3_NORMALIZE_H
+#define PVMP3_NORMALIZE_H
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
+
+__inline int32 pvmp3_normalize(int32 x)
+{
+    int32 y;
+    __asm
+    {
+        clz y, x;
+        sub y, y, #1
+    }
+    return (y);
+}
+
+
+#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
+
+__inline int32 pvmp3_normalize(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
+
+    int32 pvmp3_normalize(int32 x);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
+
+#endif  /* PV_NORMALIZE_H */
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.cpp
new file mode 100644
index 0000000..33c8e61
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_poly_phase_synthesis.cpp
+
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+  Input
+    tmp3dec_chan   *pChVars,          decoder state structure per channel
+    int32          numChannels,       number of channels
+    e_equalization equalizerType,     equalization mode
+    int16          *outPcm            pointer to the PCM output data
+
+  Output
+    int16          *outPcm            pointer to the PCM output data
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    polyphase synthesis
+    Each time the subband samples for all 32 polyphase subbands of one
+    channel have been calculated, they can be applied to the synthesis
+    subband filter and 32 consecutive audio samples can be calculated
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_poly_phase_synthesis.h"
+#include "pvmp3_polyphase_filter_window.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_dct_16.h"
+#include "pvmp3_equalizer.h"
+#include "mp3_mem_funcs.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 pvmp3_poly_phase_synthesis(tmp3dec_chan   *pChVars,
+                                int32          numChannels,
+                                e_equalization equalizerType,
+                                int16          *outPcm)
+{
+    /*
+     *  Equalizer
+     */
+    pvmp3_equalizer(pChVars->circ_buffer,
+                    equalizerType,
+                    pChVars->work_buf_int32);
+
+
+    int16 * ptr_out = outPcm;
+
+
+    for (int32  band = 0; band < FILTERBANK_BANDS; band += 2)
+    {
+        int32 *inData  = &pChVars->circ_buffer[544 - (band<<5)];
+
+        /*
+         *   DCT 32
+         */
+
+        pvmp3_split(&inData[16]);
+
+        pvmp3_dct_16(&inData[16], 0);
+        pvmp3_dct_16(inData, 1);     // Even terms
+
+        pvmp3_merge_in_place_N32(inData);
+
+        pvmp3_polyphase_filter_window(inData,
+                                      ptr_out,
+                                      numChannels);
+
+        inData  -= SUBBANDS_NUMBER;
+
+        /*
+         *   DCT 32
+         */
+
+        pvmp3_split(&inData[16]);
+
+        pvmp3_dct_16(&inData[16], 0);
+        pvmp3_dct_16(inData, 1);     // Even terms
+
+        pvmp3_merge_in_place_N32(inData);
+
+        pvmp3_polyphase_filter_window(inData,
+                                      ptr_out + (numChannels << 5),
+                                      numChannels);
+
+        ptr_out += (numChannels << 6);
+
+        inData  -= SUBBANDS_NUMBER;
+
+    }/* end band loop */
+
+    pv_memmove(&pChVars->circ_buffer[576],
+               pChVars->circ_buffer,
+               480*sizeof(*pChVars->circ_buffer));
+
+}
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.h
new file mode 100644
index 0000000..166cffd
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_poly_phase_synthesis.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_poly_phase_synthesis.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_POLY_PHASE_SYNTHESIS_H
+#define PVMP3_POLY_PHASE_SYNTHESIS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "s_tmp3dec_chan.h"
+#include "pvmp3decoder_api.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_poly_phase_synthesis(tmp3dec_chan   *pChVars,
+    int32          numChannels,
+    e_equalization equalizerType,
+    int16          *outPcm);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.cpp
new file mode 100644
index 0000000..8380437
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.cpp
@@ -0,0 +1,239 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_polyphase_filter_window.cpp
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+
+Input
+    int32 *synth_buffer,    synthesis input buffer
+    int16 *outPcm,          generated output ( 32 values)
+    int32 numChannels       number of channels
+ Returns
+
+    int16 *outPcm
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    apply polyphase filter window
+    Input 32 subband samples
+    Calculate 64 values
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+#if ( !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) && !defined(PV_ARM_V5) && !defined(PV_ARM_V4) )
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_polyphase_filter_window.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_tables.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module1 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 module1
+----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------
+; EXTERNAL FUNCTION REFERENCES
+; Declare functions defined elsewhere and referenced in this module_x
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
+; Declare variables used in this module_x but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void pvmp3_polyphase_filter_window(int32 *synth_buffer,
+                                   int16 *outPcm,
+                                   int32 numChannels)
+{
+    int32 sum1;
+    int32 sum2;
+    const int32 *winPtr = pqmfSynthWin;
+    int32 i;
+
+
+    for (int16 j = 1; j < SUBBANDS_NUMBER / 2; j++)
+    {
+        sum1 = 0x00000020;
+        sum2 = 0x00000020;
+
+
+        for (i = (SUBBANDS_NUMBER >> 1);
+                i < HAN_SIZE + (SUBBANDS_NUMBER >> 1);
+                i += SUBBANDS_NUMBER << 4)
+        {
+            int32 *pt_1 = &synth_buffer[ i+j];
+            int32 *pt_2 = &synth_buffer[ i-j];
+            int32 temp1 = pt_1[ 0];
+            int32 temp3 = pt_2[ SUBBANDS_NUMBER*15 ];
+            int32 temp2 = pt_2[ SUBBANDS_NUMBER* 1 ];
+            int32 temp4 = pt_1[ SUBBANDS_NUMBER*14 ];
+
+            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 0]);
+            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 0]);
+            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 1]);
+            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 1]);
+            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[ 2]);
+            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[ 2]);
+            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[ 3]);
+            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[ 3]);
+
+            temp1 = pt_1[ SUBBANDS_NUMBER* 2];
+            temp3 = pt_2[ SUBBANDS_NUMBER*13];
+            temp2 = pt_2[ SUBBANDS_NUMBER* 3];
+            temp4 = pt_1[ SUBBANDS_NUMBER*12];
+
+            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 4]);
+            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 4]);
+            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 5]);
+            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 5]);
+            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[ 6]);
+            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[ 6]);
+            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[ 7]);
+            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[ 7]);
+
+            temp1 = pt_1[ SUBBANDS_NUMBER* 4 ];
+            temp3 = pt_2[ SUBBANDS_NUMBER*11 ];
+            temp2 = pt_2[ SUBBANDS_NUMBER* 5 ];
+            temp4 = pt_1[ SUBBANDS_NUMBER*10 ];
+
+            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[ 8]);
+            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[ 8]);
+            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[ 9]);
+            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[ 9]);
+            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[10]);
+            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[10]);
+            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[11]);
+            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[11]);
+
+            temp1 = pt_1[ SUBBANDS_NUMBER*6 ];
+            temp3 = pt_2[ SUBBANDS_NUMBER*9 ];
+            temp2 = pt_2[ SUBBANDS_NUMBER*7 ];
+            temp4 = pt_1[ SUBBANDS_NUMBER*8 ];
+
+            sum1  = fxp_mac32_Q32(sum1, temp1,  winPtr[12]);
+            sum2  = fxp_mac32_Q32(sum2, temp3,  winPtr[12]);
+            sum2  = fxp_mac32_Q32(sum2, temp1,  winPtr[13]);
+            sum1  = fxp_msb32_Q32(sum1, temp3,  winPtr[13]);
+            sum1  = fxp_mac32_Q32(sum1, temp2,  winPtr[14]);
+            sum2  = fxp_msb32_Q32(sum2, temp4,  winPtr[14]);
+            sum2  = fxp_mac32_Q32(sum2, temp2,  winPtr[15]);
+            sum1  = fxp_mac32_Q32(sum1, temp4,  winPtr[15]);
+
+            winPtr += 16;
+        }
+
+
+
+        int32 k = j << (numChannels - 1);
+        outPcm[k] = saturate16(sum1 >> 6);
+        outPcm[(numChannels<<5) - k] = saturate16(sum2 >> 6);
+    }
+
+
+
+    sum1 = 0x00000020;
+    sum2 = 0x00000020;
+
+
+    for (i = 16; i < HAN_SIZE + 16; i += (SUBBANDS_NUMBER << 2))
+    {
+        int32 *pt_synth = &synth_buffer[i];
+        int32 temp1 = pt_synth[ 0                ];
+        int32 temp2 = pt_synth[ SUBBANDS_NUMBER  ];
+        int32 temp3 = pt_synth[ SUBBANDS_NUMBER/2];
+
+        sum1 = fxp_mac32_Q32(sum1, temp1, winPtr[0]) ;
+        sum1 = fxp_mac32_Q32(sum1, temp2, winPtr[1]) ;
+        sum2 = fxp_mac32_Q32(sum2, temp3, winPtr[2]) ;
+
+        temp1 = pt_synth[ SUBBANDS_NUMBER<<1 ];
+        temp2 = pt_synth[ 3*SUBBANDS_NUMBER  ];
+        temp3 = pt_synth[ SUBBANDS_NUMBER*5/2];
+
+        sum1 = fxp_mac32_Q32(sum1, temp1, winPtr[3]) ;
+        sum1 = fxp_mac32_Q32(sum1, temp2, winPtr[4]) ;
+        sum2 = fxp_mac32_Q32(sum2, temp3, winPtr[5]) ;
+
+        winPtr += 6;
+    }
+
+
+    outPcm[0] = saturate16(sum1 >> 6);
+    outPcm[(SUBBANDS_NUMBER/2)<<(numChannels-1)] = saturate16(sum2 >> 6);
+
+
+}
+
+#endif // If not assembly
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.h
new file mode 100644
index 0000000..b9eccad
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_polyphase_filter_window.h
@@ -0,0 +1,138 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_decode_header.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_POLYPHASE_FILTER_WINDOW_H
+#define PVMP3_POLYPHASE_FILTER_WINDOW_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_audio_type_defs.h"
+#include "s_tmp3dec_chan.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define MAX_16BITS_INT  0x7FFF
+
+/*----------------------------------------------------------------------------
+; 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
+extern "C"
+{
+#endif
+
+
+#if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
+
+
+    __inline int16 saturate16(int32 sample)
+    {
+        int32 a;
+        int32 b = 31;
+        __asm
+        {
+            mov   a, sample, asr#15
+            teq a, sample, asr b
+            eorne sample, MAX_16BITS_INT, sample, asr#31
+        }
+        return sample ;
+    }
+
+#else
+
+    inline int16 saturate16(int32 sample)
+    {
+
+        if ((sample >> 15) ^(sample >> 31))
+        {
+            sample = MAX_16BITS_INT ^(sample >> 31);
+        }
+        return sample;
+
+    }
+#endif
+
+
+    void pvmp3_polyphase_filter_window(int32 *synth_buffer,
+                                       int16 *outPcm,
+                                       int32 numChannels);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.cpp
new file mode 100644
index 0000000..35b6475
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.cpp
@@ -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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_reorder.cpp
+
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+ Inputs:
+
+    int32 xr[ ],                rescaled data
+    struct gr_info_s *gr_info,  granule structure
+    mp3Header *info,            mp3 header info
+    int32  Scratch_mem[168]     for temporary usage
+
+ Outputs:
+
+    int32 xr[ ],                reordered data
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+ If short blocks are used (block_type[gr][ch]=='10'), the rescaled data
+ xr[scf_band][window][freq_line] shall be reordered in polyphase subband
+ order, xr[subband][window][freq_line], prior to the IMDCT operation.
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_reorder.h"
+#include "pvmp3_tables.h"
+#include "mp3_mem_funcs.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 pvmp3_reorder(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                   granuleInfo *gr_info,
+                   int32  *used_freq_lines,
+                   mp3Header *info,
+                   int32  Scratch_mem[168])
+{
+    int32 sfreq =  info->version_x + (info->version_x << 1);
+    sfreq += info->sampling_frequency;
+
+    if (gr_info->window_switching_flag && (gr_info->block_type == 2))
+    {
+        int32   sfb_lines;
+        int32   freq;
+        int32   src_line;
+        int32   sfb;
+        if (gr_info->mixed_block_flag)
+        {
+            /* REORDERING FOR REST SWITCHED SHORT */
+            sfb = 3;  /* no reorder for low 2 subbands */
+            src_line = 36;
+        }
+        else
+        {  /* pure short */
+            sfb = 0;
+            src_line = 0;
+        }
+        int16 ct = src_line;
+
+        for (; sfb < 13; sfb++)
+        {
+            if (*used_freq_lines > 3*mp3_sfBandIndex[sfreq].s[sfb+1])
+            {
+                sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
+
+                for (freq = 0; freq < 3*sfb_lines; freq += 3)
+                {
+                    int32 tmp1 = xr[src_line];
+                    int32 tmp2 = xr[src_line+(sfb_lines)];
+                    int32 tmp3 = xr[src_line+(sfb_lines<<1)];
+                    src_line++;
+                    Scratch_mem[freq  ] = tmp1;
+                    Scratch_mem[freq+1] = tmp2;
+                    Scratch_mem[freq+2] = tmp3;
+                }
+                src_line += (sfb_lines << 1);
+
+                pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
+                ct += sfb_lines + (sfb_lines << 1);
+
+            }
+            else
+            {
+
+                sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
+
+                for (freq = 0; freq < 3*sfb_lines; freq += 3)
+                {
+                    int32 tmp1 = xr[src_line];
+                    int32 tmp2 = xr[src_line+(sfb_lines)];
+                    int32 tmp3 = xr[src_line+(sfb_lines<<1)];
+                    src_line++;
+                    Scratch_mem[freq  ] = tmp1;
+                    Scratch_mem[freq+1] = tmp2;
+                    Scratch_mem[freq+2] = tmp3;
+                }
+
+                pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
+
+                *used_freq_lines = mp3_sfBandIndex[sfreq].s[sfb+1] * 3;
+
+                sfb = 13;   /* force out of the for-loop */
+            }
+        }
+    }
+}
+
+
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.h
new file mode 100644
index 0000000..ba6ec16
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_reorder.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_reorder.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_REORDER_H
+#define PVMP3_REORDER_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    void pvmp3_reorder(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    granuleInfo *gr_info,
+    int32 *used_freq_lines,
+    mp3Header *info,
+    int32  Scratch_mem[168]);
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.cpp
new file mode 100644
index 0000000..82faafd
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.cpp
@@ -0,0 +1,308 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_seek_synch.cpp
+
+   Functions:
+        pvmp3_seek_synch
+        pvmp3_header_sync
+
+
+     Date: 9/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+pvmp3_frame_synch
+
+Input
+    pExt = pointer to the external interface structure. See the file
+           pvmp3decoder_api.h for a description of each field.
+           Data type of pointer to a tPVMP3DecoderExternal
+           structure.
+
+    pMem = void pointer to hide the internal implementation of the library
+           It is cast back to a tmp3dec_file structure. This structure
+           contains information that needs to persist between calls to
+           this function, or is too big to be placed on the stack, even
+           though the data is only needed during execution of this function
+           Data type void pointer, internally pointer to a tmp3dec_file
+           structure.
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    search mp3 sync word, when found, it verifies, based on header parameters,
+    the locations of the very next sync word,
+    - if fails, then indicates a false sync,
+    - otherwise, it confirm synchronization of at least 2 consecutives frames
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_seek_synch.h"
+#include "pvmp3_getbits.h"
+#include "s_tmp3dec_file.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_tables.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
+----------------------------------------------------------------------------*/
+
+
+
+ERROR_CODE pvmp3_frame_synch(tPVMP3DecoderExternal *pExt,
+                             void                  *pMem) /* bit stream structure */
+{
+    uint16 val;
+    ERROR_CODE err;
+
+    tmp3dec_file      *pVars;
+
+    pVars = (tmp3dec_file *)pMem;
+
+    pVars->inputStream.pBuffer = pExt->pInputBuffer;
+    pVars->inputStream.usedBits = (pExt->inputBufferUsedLength << 3); // in bits
+
+
+    pVars->inputStream.inputBufferCurrentLength = (pExt->inputBufferCurrentLength); // in bits
+
+    err = pvmp3_header_sync(&pVars->inputStream);
+
+    if (err == NO_DECODING_ERROR)
+    {
+        /* validate synchronization by checking two consecutive sync words */
+
+        // to avoid multiple bitstream accesses
+        uint32 temp = getNbits(&pVars->inputStream, 21);
+        // put back whole header
+        pVars->inputStream.usedBits -= 21 + SYNC_WORD_LNGTH;
+
+        int32  version;
+
+        switch (temp >> 19)  /* 2 */
+        {
+            case 0:
+                version = MPEG_2_5;
+                break;
+            case 2:
+                version = MPEG_2;
+                break;
+            case 3:
+                version = MPEG_1;
+                break;
+            default:
+                version = INVALID_VERSION;
+                break;
+        }
+
+        int32 freq_index = (temp << 20) >> 30;
+
+        if (version != INVALID_VERSION && (freq_index != 3))
+        {
+            int32 numBytes = fxp_mul32_Q28(mp3_bitrate[version][(temp<<16)>>28] << 20,
+                                           inv_sfreq[freq_index]);
+
+            numBytes >>= (20 - version);
+
+            if (version != MPEG_1)
+            {
+                numBytes >>= 1;
+            }
+            if ((temp << 22) >> 31)
+            {
+                numBytes++;
+            }
+
+            if (numBytes > (int32)pVars->inputStream.inputBufferCurrentLength)
+            {
+                /* frame should account for padding and 2 bytes to check sync */
+                pExt->CurrentFrameLength = numBytes + 3;
+                return (SYNCH_LOST_ERROR);
+            }
+            else if (numBytes == (int32)pVars->inputStream.inputBufferCurrentLength)
+            {
+                /* No enough data to validate, but current frame appears to be correct ( EOF case) */
+                pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3;
+                return (NO_DECODING_ERROR);
+            }
+            else
+            {
+
+                int32 offset = pVars->inputStream.usedBits + ((numBytes) << 3);
+
+                offset >>= INBUF_ARRAY_INDEX_SHIFT;
+                uint8    *pElem  = pVars->inputStream.pBuffer + offset;
+                uint16 tmp1 = *(pElem++);
+                uint16 tmp2 = *(pElem);
+
+                val = (tmp1 << 3);
+                val |= (tmp2 >> 5);
+            }
+        }
+        else
+        {
+            val = 0; // force mismatch
+        }
+
+        if (val == SYNC_WORD)
+        {
+            pExt->inputBufferUsedLength = pVars->inputStream.usedBits >> 3; ///  !!!!!
+            err = NO_DECODING_ERROR;
+        }
+        else
+        {
+            pExt->inputBufferCurrentLength = 0;
+            err = SYNCH_LOST_ERROR;
+        }
+    }
+    else
+    {
+        pExt->inputBufferCurrentLength = 0;
+    }
+
+    return(err);
+
+}
+
+/*
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+------------------------------------------------------------------------------
+ INPUT AND OUTPUT DEFINITIONS
+
+pvmp3_header_sync
+
+Input
+    tmp3Bits *inputStream,     structure holding the input stream parameters
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    search mp3 sync word
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+
+ERROR_CODE pvmp3_header_sync(tmp3Bits  *inputStream)
+{
+    uint16 val;
+    uint32 availableBits = (inputStream->inputBufferCurrentLength << 3); // in bits
+
+    // byte aligment
+    inputStream->usedBits = (inputStream->usedBits + 7) & 8;
+
+    val = (uint16)getUpTo17bits(inputStream, SYNC_WORD_LNGTH);
+
+    while (((val&SYNC_WORD) != SYNC_WORD) && (inputStream->usedBits < availableBits))
+    {
+        val <<= 8;
+        val |= getUpTo9bits(inputStream, 8);
+    }
+
+    if ((val&SYNC_WORD) == SYNC_WORD && (inputStream->usedBits < availableBits))
+    {
+        return(NO_DECODING_ERROR);
+    }
+    else
+    {
+        return(SYNCH_LOST_ERROR);
+    }
+
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.h
new file mode 100644
index 0000000..8097cee
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_seek_synch.h
@@ -0,0 +1,106 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_seek_synch.h
+
+   Date: 09/21/2007
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_SEEK_SYNCH_H
+#define PVMP3_SEEK_SYNCH_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3decoder_api.h"
+#include "s_tmp3dec_file.h"
+#include "pvmp3_dec_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    ERROR_CODE pvmp3_frame_synch(tPVMP3DecoderExternal *pExt,
+    void                  *pMem);
+
+    ERROR_CODE pvmp3_header_sync(tmp3Bits  *inputStream);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif  /* DECODE_READ_INPUT_H */
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp
new file mode 100644
index 0000000..d69a46d
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.cpp
@@ -0,0 +1,676 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_stereo_proc.cpp
+
+   Functions:
+
+    pvmp3_st_mid_side
+    pvmp3_st_intensity
+    pvmp3_stereo_proc
+
+------------------------------------------------------------------------------
+
+pvmp3_st_mid_side
+
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+   int32 xr[],      input channel
+   int32 xl[],
+   int32 Start,     Location of first element where stereo intensity is applied
+   int32 Number     number of elements affected
+
+ Returns
+
+   int32 xl[],      generated stereo channel
+
+
+------------------------------------------------------------------------------
+
+pvmp3_st_intensity
+
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+   int32 xr[],      input channel
+   int32 xl[],
+   int32 is_pos,    index to table is_ratio_factor[]
+   int32 Start,     Location of first element where stereo intensity is applied
+   int32 Number     number of elements affected
+
+ Returns
+
+   int32 xl[],      generated stereo channel
+
+
+------------------------------------------------------------------------------
+
+pvmp3_stereo_proc
+
+ INPUT AND OUTPUT DEFINITIONS
+
+Input
+
+   int32 xr[],                    input channel
+   int32 xl[],
+   mp3ScaleFactors  *scalefac,    scale factors structure
+   struct gr_info_s *gr_info,     granule structure
+   mp3Header *info                mp3 header info
+ Returns
+
+   int32 xl[],      generated stereo channel
+
+
+------------------------------------------------------------------------------
+ FUNCTION DESCRIPTION
+
+    stereo processing for mpeg1 layer III
+    After requantization, the reconstructed values are processed for ms_stereo
+    or intensity_stereo modes or both, before passing them to the synthesis
+    filterbank
+
+    In ms_stereo mode the values of the normalized middle/side channels
+    M[l] and S[l] are transmitted instead of the left/right channel values
+    L[l] and R[l]. From here, L[l] and R[l] are reconstructed
+
+    Intensity_stereo is done by specifying the magnitude (via the
+    scalefactors of the left channel) and a stereo position is_pos[sfb],
+    which is transmitted instead of scalefactors of the right channel.
+    The stereo position is used to derive the left and right channel signals
+
+------------------------------------------------------------------------------
+ REQUIREMENTS
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+ PSEUDO-CODE
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_stereo_proc.h"
+#include "pv_mp3dec_fxd_op.h"
+#include "pvmp3_tables.h"
+
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here. Include conditional
+; compile variables also.
+----------------------------------------------------------------------------*/
+#define N31 31
+
+#define Q31_fmt(a)    (int32(double(0x7FFFFFFF)*a))
+
+/*----------------------------------------------------------------------------
+; LOCAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; LOCAL STORE/BUFFER/POINTER DEFINITIONS
+; Variable declaration - defined here and used outside this module
+----------------------------------------------------------------------------*/
+/*
+ *  TmpFac= tan(is_pos * (PI /12));
+ *
+ *  TmpFac /= (1 + TmpFac);
+ *
+ */
+
+const int32  is_ratio_factor[8] = {0,
+                                   Q31_fmt(0.21132486540519),   Q31_fmt(0.36602540378444),   Q31_fmt(0.50000000000000),
+                                   Q31_fmt(0.63397459621556),   Q31_fmt(0.78867513459481),   Q31_fmt(1.00000000000000),
+                                   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 pvmp3_st_mid_side(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       int32 Start,
+                       int32 Number)
+{
+
+    int32 *pt_xr  = &xr[Start];
+    int32 *pt_xl  = &xl[Start];
+
+    for (int32 i = Number >> 1; i != 0; i--)
+    {
+        int32 xxr = *(pt_xr) << 1;
+        int32 xxl = *(pt_xl) << 1;
+        *(pt_xr++)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
+        *(pt_xl++)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
+        xxr = *(pt_xr) << 1;
+        xxl = *(pt_xl) << 1;
+        *(pt_xr++)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
+        *(pt_xl++)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
+    }
+
+
+    if (Number&1)
+    {
+        int32 xxr = *(pt_xr) << 1;
+        int32 xxl = *(pt_xl) << 1;
+        *(pt_xr)  = fxp_mul32_Q32((xxr + xxl), Q31_fmt(0.70710678118655));   /* Sum */
+        *(pt_xl)  = fxp_mul32_Q32((xxr - xxl), Q31_fmt(0.70710678118655));   /* Diff */
+    }
+
+}
+
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+
+void pvmp3_st_intensity(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                        int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                        int32 is_pos,
+                        int32 Start,
+                        int32 Number)
+{
+
+    int32 TmpFac = is_ratio_factor[ is_pos & 7];
+
+    int32 *pt_xr  = &xr[Start];
+    int32 *pt_xl  = &xl[Start];
+
+    for (int32 i = Number >> 1; i != 0; i--)
+    {
+        int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
+        *(pt_xl++) = (*pt_xr) - tmp;
+        *(pt_xr++) = tmp;
+        tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
+        *(pt_xl++) = (*pt_xr) - tmp;
+        *(pt_xr++) = tmp;
+    }
+
+    if (Number&1)
+    {
+        int32 tmp = fxp_mul32_Q32((*pt_xr) << 1, TmpFac);
+        *(pt_xl) = (*pt_xr) - tmp;
+        *(pt_xr) = tmp;
+    }
+
+}
+
+/*----------------------------------------------------------------------------
+; FUNCTION CODE
+----------------------------------------------------------------------------*/
+void pvmp3_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                       mp3ScaleFactors *scalefac,
+                       granuleInfo *gr_info,
+                       int32 used_freq_lines,
+                       mp3Header *info)
+{
+
+
+    int32 sb;
+    int32 ss;
+    int32 sfbNo;
+    int32 sfbStart;
+
+    int32 sfb;
+    int32 sfbTemp;
+    int32 i;
+    int32 j;
+
+
+    int32 i_stereo  = (info->mode == MPG_MD_JOINT_STEREO) &&
+                      (info->mode_ext & 0x1);
+
+    int32 ms_stereo = (info->mode == MPG_MD_JOINT_STEREO) &&
+                      (info->mode_ext & 0x2);
+
+    int32 sfreq  = info->version_x + (info->version_x << 1);
+    sfreq += info->sampling_frequency;
+
+
+
+
+    if (i_stereo)
+    {
+        if (gr_info->window_switching_flag && (gr_info->block_type == 2))
+        {
+            if (gr_info->mixed_block_flag)
+            {
+                /*
+                 * mixed blocks processing
+                 */
+                i = 31;
+                ss = 17;
+                sb = 0;
+                while (i >= 0)
+                {
+                    if (xl[(i*FILTERBANK_BANDS) + ss])
+                    {
+                        sb = (i << 4) + (i << 1) + ss;
+                        i = -1;
+                    }
+                    else
+                    {
+                        ss--;
+                        if (ss < 0)
+                        {
+                            i--;
+                            ss = 17;
+                        }
+                    }
+                }
+
+                if (sb < 36)
+                {
+                    /*
+                     * mixed blocks processing: intensity bound inside long blocks
+                     */
+                    /* 1. long blocks up to intensity border: not intensity */
+
+                    if (mp3_sfBandIndex[sfreq].l[4] <= sb)
+                    {
+                        sfb = 4;
+                    }
+                    else
+                    {
+                        sfb = 0;
+                    }
+
+                    while (mp3_sfBandIndex[sfreq].l[sfb] < sb)
+                    {
+                        sfb++;
+                    }
+
+                    /* from that sfb on intensity stereo */
+                    sfbTemp = sfb;  /* save for later use */
+
+                    sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
+
+                    /* from 0 up to sfbStart do ms_stereo or normal stereo */
+
+                    if (ms_stereo)
+                    {
+                        pvmp3_st_mid_side(xr, xl, 0, sfbStart);
+                    }
+
+                    /* 2. long blocks from intensity border up to sfb band 8: intensity */
+                    /* calc. is_ratio */
+
+
+                    /* Start of intensity stereo of remaining sfc bands: */
+                    for (; sfbTemp < 8; sfbTemp++)
+                    {
+                        sfbStart = mp3_sfBandIndex[sfreq].l[sfbTemp];  /* = Start in 0 ... 575 */
+                        sfbNo = mp3_sfBandIndex[sfreq].l[sfbTemp+1] - mp3_sfBandIndex[sfreq].l[sfbTemp]; /* No of lines to process */
+
+                        if (scalefac->l[sfbTemp] != 7)
+                        {
+                            pvmp3_st_intensity(xr, xl, scalefac->l[sfbTemp], sfbStart, sfbNo);
+                        }
+                        else if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+
+                    }  /* for (; sfbTemp < 8; sfbTemp++) */
+
+                    for (j = 0; j < 3; j++)
+                    {
+                        /* 3. short blocks from sfbcnt to last sfb do intensity stereo */
+                        for (sfbTemp = 3; sfbTemp < 13; sfbTemp++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
+
+                            if (scalefac->s[j][sfbTemp] != 7)
+                            {
+                                pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
+                            }
+                            else if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+
+                        }  /* for (; sfbTemp < 22; sfbTemp++) */
+                    } /* for (j = 0; j < 3; j++) */
+                }
+                else   /* else for (sb >= 36) */
+                {
+                    /*
+                     * mixed blocks processing: intensity bound outside long blocks
+                     */
+
+
+                    /*
+                     * 2. short blocks from sfb band 3 up to intensity border: normal stereo, ms stereo and intensity
+                     */
+                    for (j = 0; j < 3; j++)
+                    {
+                        int32 sfbcnt;
+                        sfbcnt = -1;
+
+                        for (sfb = 12; sfb >= 3; sfb--)
+                        {
+                            int32 lines;
+                            lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+                            i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
+
+                            while (lines > 0)
+                            {
+                                if (xl[i])
+                                {
+                                    sfbcnt = sfb;
+                                    sfb = -10;
+                                    lines = -10;
+                                }
+                                lines--;
+                                i--;
+                            }
+                        }
+
+                        sfbcnt += 1;
+                        if (sfbcnt < 3)
+                        {
+                            sfbcnt = 3;
+                        }
+
+                        sfbTemp = sfbcnt;        /* for later use */
+
+
+                        /*
+                         *   do normal stereo or MS stereo from sfb 3 to < sfbcnt:
+                         */
+                        for (sb = 3; sb < sfbcnt; sb++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb];
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo;
+
+                            if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+
+                        }
+
+                        /* from sfbcnt to last sfb do intensity stereo */
+                        for (; sfbTemp < 13; sfbTemp++)
+                        {
+                            sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
+                            sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
+
+                            if (scalefac->s[j][sfbTemp] != 7)
+                            {
+                                pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
+                            }
+                            else if (ms_stereo)
+                            {
+                                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                            }
+
+                        }  /* for (; sfbTemp < 22; sfbTemp++) */
+
+                    } /* for (j = 0; j < 3; j++) */
+
+                    /* 1. long blocks up to sfb band 8: not intensity */
+                    /* from 0 to sfb 8 ms_stereo or normal stereo */
+
+                    sfbStart = mp3_sfBandIndex[sfreq].l[8];
+
+                    if (ms_stereo)
+                    {
+                        pvmp3_st_mid_side(xr, xl, 0, sfbStart);
+                    }
+
+                }
+            }  /* if (gr_info->mixed_block_flag) */
+            else
+            {
+                /*
+                 * short block processing
+                 */
+                for (j = 0; j < 3; j++)
+                {
+                    int32 sfbcnt = -1;
+
+                    for (sfb = 12; sfb >= 0; sfb--)
+                    {
+                        int32 lines = mp3_sfBandIndex[sfreq].s[sfb+1] - mp3_sfBandIndex[sfreq].s[sfb];
+                        i = 3 * mp3_sfBandIndex[sfreq].s[sfb] + (j + 1) * lines - 1;
+
+                        while (lines > 0)
+                        {
+                            if (xl[i])
+                            {
+                                sfbcnt = sfb;
+                                sfb = -10;
+                                lines = -10;
+                            }
+                            lines--;
+                            i--;
+                        }
+                    }
+
+                    sfbcnt += 1;
+                    sfbTemp = sfbcnt;        /* for later use */
+
+                    /* do normal stereo or MS stereo from 0 to sfbcnt */
+                    for (sb = 0; sb < sfbcnt; sb++)
+                    {
+                        sfbNo = mp3_sfBandIndex[sfreq].s[sb+1] - mp3_sfBandIndex[sfreq].s[sb];
+                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sb] + j * sfbNo;
+
+                        if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+                    }
+
+
+                    /* from sfbcnt to last sfb do intensity stereo */
+                    for (; sfbTemp < 13; sfbTemp++)
+                    {
+                        sfbNo = mp3_sfBandIndex[sfreq].s[sfbTemp+1] - mp3_sfBandIndex[sfreq].s[sfbTemp]; /* No of lines to process */
+                        sfbStart = 3 * mp3_sfBandIndex[sfreq].s[sfbTemp] + j * sfbNo;
+
+                        if (scalefac->s[j][sfbTemp] != 7)
+                        {
+                            pvmp3_st_intensity(xr, xl, scalefac->s[j][sfbTemp], sfbStart, sfbNo);
+                        }
+                        else if (ms_stereo)
+                        {
+                            pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                        }
+
+                    }  /* for (; sfbTemp < 22; sfbTemp++) */
+
+                } /* for (j = 0; j < 3; j++) */
+
+            } /* if( gr_info->mixed_block_flag) */
+
+
+
+        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
+        else
+        {
+            /*
+             *   long block processing
+             */
+            i = 31;
+            ss = 17;
+            sb = 0;
+
+            while (i >= 0)
+            {
+                if (xl[(i*FILTERBANK_BANDS) + ss] != 0)
+                {
+                    sb = (i << 4) + (i << 1) + ss;
+                    i = -2;
+                }
+                else
+                {
+                    ss--;
+                    if (ss < 0)
+                    {
+                        i--;
+                        ss = 17;
+                    }
+                }
+            }
+
+            if (sb)
+            {
+                if (mp3_sfBandIndex[sfreq].l[14] <= sb)
+                {
+                    sfb = 14;
+                }
+                else if (mp3_sfBandIndex[sfreq].l[7] <= sb)
+                {
+                    sfb = 7;
+                }
+                else
+                {
+                    sfb = 0;
+                }
+
+
+                while (mp3_sfBandIndex[sfreq].l[sfb] <= sb)
+                {
+                    sfb++;
+                }
+            }
+            else
+            {
+                if (i == -1)
+                {
+                    /*  all xr[1][][] are 0: set IS bound sfb to 0  */
+                    sfb = 0;
+                }
+                else
+                {
+                    /*  xr[1][0][0] is unequal 0 and all others are 0: set IS bound sfb to 1 */
+                    sfb = 1;
+                }
+            }
+
+            sfbTemp = sfb;  /* save for later use */
+
+
+            sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
+
+            /* from 0 to sfbStart ms_stereo or normal stereo */
+            if (ms_stereo)
+            {
+                pvmp3_st_mid_side(xr, xl, 0, sfbStart);
+            }
+
+            /* now intensity stereo of the remaining sfb's: */
+            for (; sfb < 21; sfb++)
+            {
+                sfbStart = mp3_sfBandIndex[sfreq].l[sfb];
+                sfbNo = mp3_sfBandIndex[sfreq].l[sfb+1] - mp3_sfBandIndex[sfreq].l[sfb]; /* No of lines to process */
+
+                if (scalefac->l[sfb] != 7)
+                {
+                    pvmp3_st_intensity(xr, xl, scalefac->l[sfb], sfbStart, sfbNo);
+                }
+                else if (ms_stereo)
+                {
+                    pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+                }
+
+            }  /* for (; sfbTemp < 22; sfbTemp++) */
+
+
+
+            sfbStart = mp3_sfBandIndex[sfreq].l[21];
+            sfbNo = mp3_sfBandIndex[sfreq].l[22] - mp3_sfBandIndex[sfreq].l[21]; /* No of lines to process */
+
+            if (scalefac->l[21] != 7)
+            {
+                if (sfbTemp < 21)
+                {
+                    sfbTemp = scalefac->l[20];
+                }
+                else
+                {
+                    sfbTemp = 0;  /* if scalefac[20] is not an intensity position, is_pos = 0 */
+                }
+
+                pvmp3_st_intensity(xr, xl, sfbTemp, sfbStart, sfbNo);
+            }
+            else if (ms_stereo)
+            {
+                pvmp3_st_mid_side(xr, xl, sfbStart, sfbNo);
+            }
+
+        }  /* if (gr_info->window_switching_flag && (gr_info->block_type == 2)) */
+
+
+    }  /* if (i_stereo)  */
+    else
+    {
+        /*
+         * normal or ms stereo processing
+         */
+        if (ms_stereo)
+        {
+
+            pvmp3_st_mid_side(xr, xl, 0, used_freq_lines);
+
+        }
+
+    } /* if (i_stereo) */
+
+}
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.h
new file mode 100644
index 0000000..bfaf1a1
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_stereo_proc.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_stereo_proc.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef PVMP3_STEREO_PROC_H
+#define PVMP3_STEREO_PROC_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+    void pvmp3_stereo_proc(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+    mp3ScaleFactors *scalefac,
+    granuleInfo *gr_info,
+    int32 used_freq_lines,
+    mp3Header *info);
+
+    void pvmp3_st_intensity(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                            int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                            int32 is_pos,
+                            int32 Start,
+                            int32 Number);
+
+    void pvmp3_st_mid_side(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                           int32 xl[SUBBANDS_NUMBER*FILTERBANK_BANDS],
+                           int32 Start,
+                           int32 Number);
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.cpp b/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.cpp
new file mode 100644
index 0000000..90e524a
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.cpp
@@ -0,0 +1,2934 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: pvmp3_tables.cpp
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+
+ Description:
+
+
+------------------------------------------------------------------------------
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+------------------------------------------------------------------------------
+*/
+
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_tables.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
+----------------------------------------------------------------------------*/
+
+const int32  mp3_s_freq[4][4] =
+{
+    {44100, 48000, 32000, 0},
+    {22050, 24000, 16000, 0},
+    {11025, 12000,  8000, 0}
+}; // MPEG-2.5
+
+
+/*
+ *  144000./s_freq
+ */
+const int32 inv_sfreq[4] =
+{
+    Qfmt_28(3.26530612244898),
+    Qfmt_28(3.0),
+    Qfmt_28(4.5),
+    0
+};
+
+
+/* 1: MPEG-1, 0: MPEG-2 LSF, 1995-07-11 shn */
+
+
+const int16  mp3_bitrate[3][15] =
+{
+    {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320},
+    {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160},
+    {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160}
+};
+
+
+const mp3_scaleFactorBandIndex mp3_sfBandIndex[9] =
+{
+
+    /* MPEG 1 */
+
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576},
+    {0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192}},
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576},
+    {0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192}},
+    {{0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576},
+        {0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192}},
+
+    /* MPEG 2 - LSF */
+
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+    {0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192}},
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576},
+    {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192}},
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+        {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}},
+
+    /* MPEG 2.5  extension */
+
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+    {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}},
+    {{0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576},
+    {0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192}},
+    {{0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576},
+        {0, 8, 16, 24, 36, 52, 72, 96, 124, 160, 162, 164, 166, 192}}
+
+};
+
+#define INV_Q31( x)   (int32)(0x7FFFFFFF/(float)x - 1.0f)
+
+const int32 mp3_shortwindBandWidths[9][13] =
+{
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(10),
+        INV_Q31(12), INV_Q31(14), INV_Q31(18), INV_Q31(22), INV_Q31(30), INV_Q31(56)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(6), INV_Q31(10),
+      INV_Q31(12), INV_Q31(14), INV_Q31(16), INV_Q31(20), INV_Q31(26), INV_Q31(66)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(12),
+      INV_Q31(16), INV_Q31(20), INV_Q31(26), INV_Q31(34), INV_Q31(42), INV_Q31(12)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(6), INV_Q31(8), INV_Q31(10),
+      INV_Q31(14), INV_Q31(18), INV_Q31(26), INV_Q31(32), INV_Q31(42), INV_Q31(18)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(10), INV_Q31(12),
+      INV_Q31(14), INV_Q31(18), INV_Q31(24), INV_Q31(32), INV_Q31(44), INV_Q31(12)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(10), INV_Q31(12),
+      INV_Q31(14), INV_Q31(18), INV_Q31(24), INV_Q31(30), INV_Q31(40), INV_Q31(18)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(10), INV_Q31(12),
+      INV_Q31(14), INV_Q31(18), INV_Q31(24), INV_Q31(30), INV_Q31(40), INV_Q31(18)},
+    { INV_Q31(4), INV_Q31(4), INV_Q31(4), INV_Q31(6), INV_Q31(8), INV_Q31(10), INV_Q31(12),
+      INV_Q31(14), INV_Q31(18), INV_Q31(24), INV_Q31(30), INV_Q31(40), INV_Q31(18)},
+    { INV_Q31(8), INV_Q31(8), INV_Q31(8), INV_Q31(12), INV_Q31(16), INV_Q31(20), INV_Q31(24),
+      INV_Q31(28), INV_Q31(36), INV_Q31(2), INV_Q31(2), INV_Q31(2), INV_Q31(26)}
+};
+
+
+#define Q30_fmt(a)    (int32((0x40000000)*a))
+
+const int32 pqmfSynthWin[(HAN_SIZE/2) + 8] =
+{
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000396729F), Q30_fmt(0.000473022F), Q30_fmt(0.003173828F),
+    Q30_fmt(0.003326416F), Q30_fmt(0.006118770F), Q30_fmt(0.007919310F), Q30_fmt(0.031478880F),
+    Q30_fmt(0.030517578F), Q30_fmt(0.073059080F), Q30_fmt(0.084182740F), Q30_fmt(0.108856200F),
+    Q30_fmt(0.090927124F), Q30_fmt(0.543823240F), Q30_fmt(0.600219727F), Q30_fmt(1.144287109F),
+
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000366211F), Q30_fmt(0.000534058F), Q30_fmt(0.003082275F),
+    Q30_fmt(0.003387451F), Q30_fmt(0.005294800F), Q30_fmt(0.008865360F), Q30_fmt(0.031738280F),
+    Q30_fmt(0.029785160F), Q30_fmt(0.067520140F), Q30_fmt(0.089706420F), Q30_fmt(0.116577150F),
+    Q30_fmt(0.080688480F), Q30_fmt(0.515609740F), Q30_fmt(0.628295900F), Q30_fmt(1.142211914F),
+
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000320435F), Q30_fmt(0.000579834F), Q30_fmt(0.002990723F),
+    Q30_fmt(0.003433228F), Q30_fmt(0.004486080F), Q30_fmt(0.009841920F), Q30_fmt(0.031845090F),
+    Q30_fmt(0.028884890F), Q30_fmt(0.061996460F), Q30_fmt(0.095169070F), Q30_fmt(0.123474120F),
+    Q30_fmt(0.069595340F), Q30_fmt(0.487472530F), Q30_fmt(0.656219480F), Q30_fmt(1.138763428F),
+
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000289917F), Q30_fmt(0.000625610F), Q30_fmt(0.002899170F),
+    Q30_fmt(0.003463745F), Q30_fmt(0.003723140F), Q30_fmt(0.010849000F), Q30_fmt(0.031814580F),
+    Q30_fmt(0.027801510F), Q30_fmt(0.056533810F), Q30_fmt(0.100540160F), Q30_fmt(0.129577640F),
+    Q30_fmt(0.057617190F), Q30_fmt(0.459472660F), Q30_fmt(0.683914180F), Q30_fmt(1.133926392F),
+
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000259399F), Q30_fmt(0.000686646F), Q30_fmt(0.002792358F),
+    Q30_fmt(0.003479004F), Q30_fmt(0.003005981F), Q30_fmt(0.011886600F), Q30_fmt(0.031661990F),
+    Q30_fmt(0.026535030F), Q30_fmt(0.051132200F), Q30_fmt(0.105819700F), Q30_fmt(0.134887700F),
+    Q30_fmt(0.044784550F), Q30_fmt(0.431655880F), Q30_fmt(0.711318970F), Q30_fmt(1.127746582F),
+
+    Q30_fmt(-0.000015259F), Q30_fmt(0.000244141F), Q30_fmt(0.000747681F), Q30_fmt(0.002685547F),
+    Q30_fmt(0.003479004F), Q30_fmt(0.002334595F), Q30_fmt(0.012939450F), Q30_fmt(0.031387330F),
+    Q30_fmt(0.025085450F), Q30_fmt(0.045837400F), Q30_fmt(0.110946660F), Q30_fmt(0.139450070F),
+    Q30_fmt(0.031082153F), Q30_fmt(0.404083250F), Q30_fmt(0.738372800F), Q30_fmt(1.120223999F),
+
+    Q30_fmt(-0.000030518F), Q30_fmt(0.000213623F), Q30_fmt(0.000808716F), Q30_fmt(0.002578735F),
+    Q30_fmt(0.003463745F), Q30_fmt(0.001693726F), Q30_fmt(0.014022830F), Q30_fmt(0.031005860F),
+    Q30_fmt(0.023422240F), Q30_fmt(0.040634160F), Q30_fmt(0.115921020F), Q30_fmt(0.143264770F),
+    Q30_fmt(0.016510010F), Q30_fmt(0.376800540F), Q30_fmt(0.765029907F), Q30_fmt(1.111373901F),
+
+    Q30_fmt(-0.000030518F), Q30_fmt(0.000198364F), Q30_fmt(0.000885010F), Q30_fmt(0.002456665F),
+    Q30_fmt(0.003417969F), Q30_fmt(0.001098633F), Q30_fmt(0.015121460F), Q30_fmt(0.030532840F),
+    Q30_fmt(0.021575930F), Q30_fmt(0.035552980F), Q30_fmt(0.120697020F), Q30_fmt(0.146362300F),
+    Q30_fmt(0.001068120F), Q30_fmt(0.349868770F), Q30_fmt(0.791213990F), Q30_fmt(1.101211548F),
+
+    Q30_fmt(-0.000030518F), Q30_fmt(0.000167847F), Q30_fmt(0.000961304F), Q30_fmt(0.002349854F),
+    Q30_fmt(0.003372192F), Q30_fmt(0.000549316F), Q30_fmt(0.016235350F), Q30_fmt(0.029937740F),
+    Q30_fmt(0.019531250F), Q30_fmt(0.030609130F), Q30_fmt(0.125259400F), Q30_fmt(0.148773190F),
+    Q30_fmt(-0.015228270F), Q30_fmt(0.323318480F), Q30_fmt(0.816864010F), Q30_fmt(1.089782715F),
+
+    Q30_fmt(-0.000030518F), Q30_fmt(0.000152588F), Q30_fmt(0.001037598F), Q30_fmt(0.002243042F),
+    Q30_fmt(0.003280640F), Q30_fmt(0.000030518F), Q30_fmt(0.017349240F), Q30_fmt(0.029281620F),
+    Q30_fmt(0.017257690F), Q30_fmt(0.025817870F), Q30_fmt(0.129562380F), Q30_fmt(0.150497440F),
+    Q30_fmt(-0.032379150F), Q30_fmt(0.297210693F), Q30_fmt(0.841949463F), Q30_fmt(1.077117920F),
+
+    Q30_fmt(-0.000045776F), Q30_fmt(0.000137329F), Q30_fmt(0.001113892F), Q30_fmt(0.002120972F),
+    Q30_fmt(0.003173828F), Q30_fmt(-0.000442505F), Q30_fmt(0.018463130F), Q30_fmt(0.028533940F),
+    Q30_fmt(0.014801030F), Q30_fmt(0.021179200F), Q30_fmt(0.133590700F), Q30_fmt(0.151596070F),
+    Q30_fmt(-0.050354000F), Q30_fmt(0.271591190F), Q30_fmt(0.866363530F), Q30_fmt(1.063217163F),
+
+    Q30_fmt(-0.000045776F), Q30_fmt(0.000122070F), Q30_fmt(0.001205444F), Q30_fmt(0.002014160F),
+    Q30_fmt(0.003051758F), Q30_fmt(-0.000869751F), Q30_fmt(0.019577030F), Q30_fmt(0.027725220F),
+    Q30_fmt(0.012115480F), Q30_fmt(0.016708370F), Q30_fmt(0.137298580F), Q30_fmt(0.152069090F),
+    Q30_fmt(-0.069168090F), Q30_fmt(0.246505740F), Q30_fmt(0.890090940F), Q30_fmt(1.048156738F),
+
+    Q30_fmt(-0.000061035F), Q30_fmt(0.000106812F), Q30_fmt(0.001296997F), Q30_fmt(0.001907349F),
+    Q30_fmt(0.002883911F), Q30_fmt(-0.001266479F), Q30_fmt(0.020690920F), Q30_fmt(0.026840210F),
+    Q30_fmt(0.009231570F), Q30_fmt(0.012420650F), Q30_fmt(0.140670780F), Q30_fmt(0.151962280F),
+    Q30_fmt(-0.088775630F), Q30_fmt(0.221984860F), Q30_fmt(0.913055420F), Q30_fmt(1.031936646F),
+
+    Q30_fmt(-0.000061035F), Q30_fmt(0.000106812F), Q30_fmt(0.001388550F), Q30_fmt(0.001785278F),
+    Q30_fmt(0.002700806F), Q30_fmt(-0.001617432F), Q30_fmt(0.021789550F), Q30_fmt(0.025909420F),
+    Q30_fmt(0.006134030F), Q30_fmt(0.008316040F), Q30_fmt(0.143676760F), Q30_fmt(0.151306150F),
+    Q30_fmt(-0.109161380F), Q30_fmt(0.198059080F), Q30_fmt(0.935195920F), Q30_fmt(1.014617920F),
+
+    Q30_fmt(-0.000076294F), Q30_fmt(0.000091553F), Q30_fmt(0.001480103F), Q30_fmt(0.001693726F),
+    Q30_fmt(0.002487183F), Q30_fmt(-0.001937866F), Q30_fmt(0.022857670F), Q30_fmt(0.024932860F),
+    Q30_fmt(0.002822880F), Q30_fmt(0.004394530F), Q30_fmt(0.146255490F), Q30_fmt(0.150115970F),
+    Q30_fmt(-0.130310060F), Q30_fmt(0.174789430F), Q30_fmt(0.956481930F), Q30_fmt(0.996246338F),
+
+    Q30_fmt(0.000000000F), Q30_fmt(0.000442505F), Q30_fmt(0.001586910F), Q30_fmt(0.003250122F),
+    Q30_fmt(0.007003780F), Q30_fmt(0.023910525F), Q30_fmt(0.031082153F), Q30_fmt(0.078628545F),
+    Q30_fmt(0.148422240F), Q30_fmt(0.100311279F), Q30_fmt(0.572036740F), Q30_fmt(0.976852417F),
+    Q30_fmt(1.144989014F), Q30_fmt(-0.572036745F), Q30_fmt(-0.152206421F), Q30_fmt(0.100311279F),
+
+    Q30_fmt(-0.078628540F), Q30_fmt(-0.000686646F), Q30_fmt(0.031082153F), Q30_fmt(-0.007003785F),
+    Q30_fmt(0.002227783F), Q30_fmt(0.003250122F), Q30_fmt(-0.000442500F), Q30_fmt(-0.000076294F),
+};
+
+
+
+
+
+const uint16  huffTable_1[8] =
+{
+    0x1103,    0x0103,    0x1002,    0x1002,
+    0x0001,    0x0001,    0x0001,    0x0001
+};
+
+const uint16  huffTable_2[15] =
+{
+    0x1103,    0x0103,    0x1003,    0x0001,
+    0x0001,    0x0001,    0x0001,    0x2206,
+    0x0206,    0x1205,    0x1205,    0x2105,
+    0x2105,    0x2005,    0x2005
+};
+
+const uint16 huffTable_3[15] =
+{
+
+    0x1003,    0x1102,    0x1102,    0x0102,
+    0x0102,    0x0002,    0x0002,    0x2206,
+    0x0206,    0x1205,    0x1205,    0x2105,
+    0x2105,    0x2005,    0x2005
+};
+
+const uint16 huffTable_5[25] =
+{
+
+    0x1103,    0x0103,    0x1003,    0x0001,
+    0x0001,    0x0001,    0x0001,    0x3106,
+    0x3106,    0x1307,    0x0307,    0x3007,
+    0x2207,    0x1206,    0x1206,    0x2106,
+    0x2106,    0x0206,    0x0206,    0x2006,
+    0x2006,    0x3308,    0x2308,    0x3207,
+    0x3207
+};
+
+
+const uint16 huffTable_6[26] =
+{
+
+    0x1204,    0x2104,    0x2004,    0x0103,
+    0x0103,    0x1102,    0x1102,    0x1102,
+    0x1102,    0x1003,    0x1003,    0x0003,
+    0x0003,    0x2306,    0x3206,    0x3006,
+    0x1305,    0x1305,    0x3105,    0x3105,
+    0x2205,    0x2205,    0x0205,    0x0205,
+    0x3307,    0x0307
+};
+
+
+
+const uint16 huffTable_7[73] =
+{
+    0x0103,
+    0x1003,
+    0x0001,
+    0x0001,
+    0x0001,
+    0x0001,
+    0x1206,
+    0x2105,
+    0x2105,
+    0x0206,
+    0x2006,
+    0x1104,
+    0x1104,
+    0x1104,
+    0x1104,
+    0x3509,
+    0x4409,
+    0x2509,
+    0x5209,
+    0x1508,
+    0x1508,
+    0x5108,
+    0x5108,
+    0x0509,
+    0x3409,
+    0x5008,
+    0x5008,
+    0x4309,
+    0x3309,
+    0x2408,
+    0x2408,
+    0x4208,
+    0x4208,
+    0x1407,
+    0x1407,
+    0x1407,
+    0x1407,
+    0x4107,
+    0x4107,
+    0x4107,
+    0x4107,
+    0x4007,
+    0x4007,
+    0x4007,
+    0x4007,
+    0x0408,
+    0x0408,
+    0x2308,
+    0x2308,
+    0x3208,
+    0x3208,
+    0x0308,
+    0x0308,
+    0x1307,
+    0x1307,
+    0x1307,
+    0x1307,
+    0x3107,
+    0x3107,
+    0x3107,
+    0x3107,
+    0x3007,
+    0x3007,
+    0x3007,
+    0x3007,
+    0x2207,
+    0x2207,
+    0x2207,
+    0x2207,
+    0x550a,
+    0x450a,
+    0x540a,
+    0x530a
+};
+
+const uint16 huffTable_8[66] =
+{
+    0x1204,
+    0x2104,
+    0x1102,
+    0x1102,
+    0x1102,
+    0x1102,
+    0x0103,
+    0x0103,
+    0x1003,
+    0x1003,
+    0x0002,
+    0x0002,
+    0x0002,
+    0x0002,
+    0x2206,
+    0x0206,
+    0x2006,
+    0x2509,
+    0x5209,
+    0x0509,
+    0x1508,
+    0x1508,
+    0x5108,
+    0x5108,
+    0x3409,
+    0x4309,
+    0x5009,
+    0x3309,
+    0x2408,
+    0x2408,
+    0x4208,
+    0x4208,
+    0x1408,
+    0x1408,
+    0x4107,
+    0x4107,
+    0x4107,
+    0x4107,
+    0x0408,
+    0x0408,
+    0x4008,
+    0x4008,
+    0x2308,
+    0x2308,
+    0x3208,
+    0x3208,
+    0x1308,
+    0x1308,
+    0x3108,
+    0x3108,
+    0x0308,
+    0x0308,
+    0x3008,
+    0x3008,
+    0x550b,
+    0x540b,
+    0x450a,
+    0x450a,
+    0x5309,
+    0x5309,
+    0x5309,
+    0x5309,
+    0x350a,
+    0x350a,
+    0x440a,
+    0x440a
+
+};
+
+
+const uint16 huffTable_9[53] =
+{
+    0x1204,
+    0x2104,
+    0x2004,
+    0x1103,
+    0x1103,
+    0x0103,
+    0x0103,
+    0x1003,
+    0x1003,
+    0x0003,
+    0x0003,
+    0x1406,
+    0x4106,
+    0x2306,
+    0x3206,
+    0x1305,
+    0x1305,
+    0x3105,
+    0x3105,
+    0x0306,
+    0x3006,
+    0x2205,
+    0x2205,
+    0x0205,
+    0x0205,
+    0x4408,
+    0x2508,
+    0x5208,
+    0x1508,
+    0x5107,
+    0x5107,
+    0x3407,
+    0x3407,
+    0x4307,
+    0x4307,
+    0x5008,
+    0x0408,
+    0x2407,
+    0x2407,
+    0x4207,
+    0x4207,
+    0x3307,
+    0x3307,
+    0x4007,
+    0x4007,
+    0x5509,
+    0x4509,
+    0x3508,
+    0x3508,
+    0x5308,
+    0x5308,
+    0x5409,
+    0x0509
+
+};
+
+
+const uint16 huffTable_10[96] =
+{
+    0x0001,
+    0x1104,
+    0x0103,
+    0x0103,
+    0x1003,
+    0x1003,
+    0x1206,
+    0x2106,
+    0x0206,
+    0x2006,
+    0x1408,
+    0x4108,
+    0x4008,
+    0x2308,
+    0x3208,
+    0x0308,
+    0x1307,
+    0x1307,
+    0x3107,
+    0x3107,
+    0x3007,
+    0x3007,
+    0x2207,
+    0x2207,
+    0x1608,
+    0x1608,
+    0x6108,
+    0x6108,
+    0x6008,
+    0x6008,
+    0x0509,
+    0x5009,
+    0x2409,
+    0x4209,
+    0x3309,
+    0x0409,
+    0x2709,
+    0x2709,
+    0x7209,
+    0x7209,
+    0x640a,
+    0x070a,
+    0x7009,
+    0x7009,
+    0x6209,
+    0x6209,
+    0x450a,
+    0x350a,
+    0x0609,
+    0x0609,
+    0x530a,
+    0x440a,
+    0x1708,
+    0x1708,
+    0x1708,
+    0x1708,
+    0x7108,
+    0x7108,
+    0x7108,
+    0x7108,
+    0x3609,
+    0x3609,
+    0x2609,
+    0x2609,
+    0x250a,
+    0x520a,
+    0x1509,
+    0x1509,
+    0x5109,
+    0x5109,
+    0x340a,
+    0x430a,
+    0x770b,
+    0x670b,
+    0x760b,
+    0x570b,
+    0x750b,
+    0x660b,
+    0x470a,
+    0x470a,
+    0x740a,
+    0x740a,
+    0x560a,
+    0x560a,
+    0x650a,
+    0x650a,
+    0x370a,
+    0x370a,
+    0x730a,
+    0x730a,
+    0x460a,
+    0x460a,
+    0x550b,
+    0x540b,
+    0x630a,
+    0x630a
+};
+
+
+const uint16 huffTable_11[116] =
+{
+    0x1103,
+    0x0103,
+    0x1003,
+    0x0002,
+    0x0002,
+    0x2105,
+    0x1204,     /*  0100         */
+    0x1204,     /*  010         */
+    0x0205,     /*  01010        */
+    0x2005,     /*  01011        */
+    0x1408,     /*      10 */
+    0x4108,     /*   00      */
+    0x0408,     /*   0 0     */
+    0x4008,     /*   0 1     */
+    0x2307,     /*    0      */
+    0x2307,     /*          */
+    0x3207,     /*    1      */
+    0x3207,     /*          */
+    0x1306,     /*   010       */
+    0x1306,     /*   01       */
+    0x1306,     /*   01       */
+    0x1306,     /*   01       */
+    0x3106,     /*   011       */
+    0x3106,     /*   01      */
+    0x3106,     /*   01      */
+    0x3106,     /*   01      */
+    0x0307,     /*   1000      */
+    0x0307,     /*   100      */
+    0x3007,     /*   1       */
+    0x3007,     /*   100      */
+    0x2206,     /*   101       */
+    0x2206,     /*   10      */
+    0x2206,     /*   10      */
+    0x2206,     /*   10      */
+    0x2708,
+    0x2708,     /*  000 0     */
+    0x7208,     /*  000 10     */
+    0x7208,     /*  000 1     */
+    0x6409,     /*  000 110    */
+    0x0709,
+    0x7107,
+    0x7107,
+    0x7107,     /*  00 0      */
+    0x7107,     /*  00 0      */
+    0x1708,
+    0x1708,     /*  00 01     */
+    0x7008,
+    0x7008,
+    0x3608,
+    0x3608,     /*  00 10     */
+    0x6308,     /*  00 101     */
+    0x6308,     /*  00 10     */
+    0x6008,
+    0x6008,     /*  00 11     */
+    0x4409,
+    0x2509,
+    0x5209,     /*  0      */
+    0x0509,     /*  0 00     */
+    0x1508,     /*  0 0      */
+    0x1508,     /*  0 000     */
+    0x6207,     /*  0        */
+    0x6207,     /*  0 00     */
+    0x6207,     /*  0 00     */
+    0x6207,     /*  0 00     */
+    0x2608,
+    0x2608,     /*  0 010     */
+    0x0608,
+    0x0608,
+    0x1607,
+    0x1607,
+    0x1607,
+    0x1607,
+    0x6107,
+    0x6107,
+    0x6107,
+    0x6107,
+    0x5108,
+    0x5108,
+    0x3408,
+    0x3408,
+    0x5008,
+    0x5008,
+    0x4309,
+    0x3309,
+    0x2408,
+    0x2408,     /*  0 111     */
+    0x4208,     /*  0 1111     */
+    0x4208,     /*  0 111     */
+    0x560a,
+    0x650a,
+    0x3709,
+    0x3709,
+    0x7309,
+    0x7309,
+    0x4609,
+    0x4609,
+    0x450a,
+    0x540a,     /*  000 0    */
+    0x350a,     /*  000  0   */
+    0x530a,     /*  000  1   */
+    0x770a,
+    0x770a,
+    0x670a,
+    0x670a,
+    0x760a,     /*    0   */
+    0x760a,     /*       */
+    0x750a,     /*    1   */
+    0x750a,     /*       */
+    0x660a,     /*    00   */
+    0x660a,     /*    0   */
+    0x470a,     /*    01   */
+    0x470a,     /*    0   */
+    0x740a,     /*    10   */
+    0x740a,     /*    1   */
+    0x570b,     /*    110  */
+    0x550b  /*    111  */
+
+};
+
+const uint16 huffTable_12[134] =
+{
+
+    0x1103,     /*  101          */
+    0x0103,     /*  110          */
+    0x1003,     /*  111          */
+    0x1204,
+    0x1204,     /*  011         */
+    0x2104,     /*  0111         */
+    0x2104,     /*  011         */
+    0x0205,     /*  10000        */
+    0x2005,     /*  10         */
+    0x0004,     /*  1          */
+    0x0004,     /*  100         */
+    0x3006,
+    0x1305,     /*  01         */
+    0x1305,     /*  0100        */
+    0x3105,
+    0x3105,
+    0x2205,
+    0x2205,     /*  0101        */
+    0x1507,
+    0x1507,     /*   000      */
+    0x5107,     /*   0       */
+    0x5107,     /*   000      */
+    0x3407,     /*    0      */
+    0x3407,     /*          */
+    0x4307,     /*    1      */
+    0x4307,     /*          */
+    0x5008,
+    0x0408,
+    0x2407,
+    0x2407,     /*   010      */
+    0x4207,
+    0x4207,
+    0x1407,     /*   0111      */
+    0x1407,     /*   011      */
+    0x3306,
+    0x3306,
+    0x3306,
+    0x3306,
+    0x4106,
+    0x4106,
+    0x4106,
+    0x4106,
+    0x2306,
+    0x2306,
+    0x2306,
+    0x2306,
+    0x3206,
+    0x3206,
+    0x3206,
+    0x3206,
+    0x4007,
+    0x4007,
+    0x0307,
+    0x0307,     /*  010000      */
+    0x7208,
+    0x7208,     /*  00 00     */
+    0x4608,     /*  00       */
+    0x4608,     /*  00 00     */
+    0x6408,
+    0x6408,     /*  00 01     */
+    0x1708,     /*  00 011     */
+    0x1708,
+    0x7108,     /*  00 100     */
+    0x7108,
+    0x0709,
+    0x7009,
+    0x3608,
+    0x3608,     /*  00 11     */
+    0x6308,
+    0x6308,
+    0x4508,
+    0x4508,
+    0x5408,     /*  0 0      */
+    0x5408,     /*  0 000     */
+    0x4408,     /*  0  0     */
+    0x4408,     /*  0       */
+    0x0609,     /*  0  10    */
+    0x0509,     /*  0  11    */
+    0x2607,
+    0x2607,
+    0x2607,
+    0x2607,
+    0x6207,
+    0x6207,
+    0x6207,
+    0x6207,
+    0x6107,
+    0x6107,
+    0x6107,
+    0x6107,
+    0x1608,     /*  0 1010     */
+    0x1608,     /*  0 101     */
+    0x6008,     /*  0 1011     */
+    0x6008,     /*  0 101     */
+    0x3508,
+    0x3508,     /*  0 110     */
+    0x5308,     /*  0 1101     */
+    0x5308,     /*  0 110     */
+    0x2508,
+    0x2508,     /*  0 111     */
+    0x5208,     /*  0 1111     */
+    0x5208,     /*  0 111     */
+    0x770a,
+    0x670a,
+    0x7609,     /*        */
+    0x7609,
+    0x5709,     /*    0    */
+    0x5709,     /*        */
+    0x7509,     /*    1    */
+    0x7509,     /*        */
+    0x6609,
+    0x6609,
+    0x4709,     /*  0000 01    */
+    0x4709,     /*  0000 0    */
+    0x7409,
+    0x7409,     /*  0000 1    */
+    0x6509,
+    0x6509,     /*  0000 1    */
+    0x5608,
+    0x5608,
+    0x5608,
+    0x5608,
+    0x3708,
+    0x3708,
+    0x3708,
+    0x3708,
+    0x7309,     /*  000 100    */
+    0x7309,     /*  000 10    */
+    0x5509,
+    0x5509,     /*  000 10    */
+    0x2708,
+    0x2708,
+    0x2708,
+    0x2708,
+};
+
+
+
+const uint16 huffTable_13[491] =
+{
+    0x0001,
+    0x1104,
+    0x0104,
+    0x1003,
+    0x1003,
+    0x4107,
+    0x4107,
+    0x0408,
+    0x4008,
+    0x2308,
+    0x3208,
+    0x1307,
+    0x1307,
+    0x3107,
+    0x3107,
+    0x0307,
+    0x0307,
+    0x3007,
+    0x3007,
+    0x2207,
+    0x2207,
+    0x1206,
+    0x1206,
+    0x1206,
+    0x1206,
+    0x2106,
+    0x2106,
+    0x2106,
+    0x2106,
+    0x0206,
+    0x0206,
+    0x0206,
+    0x0206,
+    0x2006,
+    0x2006,
+    0x2006,
+    0x2006,
+    0x370a,
+    0x270a,     /*  0 000           */
+    0x1709,     /*  0 00            */
+    0x1709,
+    0x7109,
+    0x7109,     /*  0 0            */
+    0x550a,
+    0x070a,     /*  0 0 11          */
+    0x700a,
+    0x360a,     /*  0             */
+    0x630a,
+    0x450a,     /*  0  011          */
+    0x540a,
+    0x260a,     /*  0  101          */
+    0x620a,
+    0x350a,     /*  0  111          */
+    0x8108,
+    0x8108,     /*  0 010            */
+    0x8108,
+    0x8108,     /*  0 010            */
+    0x0809,
+    0x0809,     /*  0 0101           */
+    0x8009,
+    0x8009,     /*  0 0101           */
+    0x1609,
+    0x1609,     /*  0 0110           */
+    0x6109,
+    0x6109,     /*  0 0110           */
+    0x0609,
+    0x0609,     /*  0 0111           */
+    0x6009,
+    0x6009,     /*  0 0111           */
+    0x530a,
+    0x440a,     /*  0 100           */
+    0x2509,
+    0x2509,     /*  0 1000           */
+    0x5209,
+    0x5209,     /*  0 1            */
+    0x0509,
+    0x0509,     /*  0 1            */
+    0x1508,
+    0x1508,     /*  0 101            */
+    0x1508,
+    0x1508,     /*  0 101            */
+    0x5108,
+    0x5108,     /*  0 101           */
+    0x5108,
+    0x5108,     /*  0 101           */
+    0x3409,
+    0x3409,     /*  0 1100           */
+    0x4309,
+    0x4309,     /*  0 1100           */
+    0x5009,
+    0x5009,     /*  0 1101           */
+    0x2409,
+    0x2409,     /*  0 1101           */
+    0x4209,
+    0x4209,     /*  0 1110           */
+    0x3309,
+    0x3309,     /*  0 1110           */
+    0x1408,
+    0x1408,     /*  0 111           */
+    0x1408,
+    0x1408,     /*  0 111           */
+    0x1a0a,
+    0x1a0a,
+    0xa10a,     /*  00 00           */
+    0xa10a,
+    0x0a0b,
+    0x680b,
+    0xa00a,
+    0xa00a,
+    0x860b,
+    0x490b,
+    0x930a,
+    0x930a,
+    0x390b,
+    0x580b,
+    0x850b,
+    0x670b,
+    0x290a,
+    0x290a,
+    0x920a,
+    0x920a,
+    0x570b,
+    0x750b,
+    0x380a,
+    0x380a,
+    0x830a,
+    0x830a,
+    0x660b,
+    0x470b,
+    0x740b,
+    0x560b,
+    0x650b,
+    0x730b,
+    0x1909,
+    0x1909,
+    0x1909,
+    0x1909,
+    0x9109,
+    0x9109,
+    0x9109,
+    0x9109,
+    0x090a,     /*  00 10100          */
+    0x090a,
+    0x900a,     /*  00 10101          */
+    0x900a,
+    0x480a,     /*  00 10110          */
+    0x480a,
+    0x840a,     /*  00 10111          */
+    0x840a,
+    0x720a,     /*  00 11000          */
+    0x720a,
+    0x460b,     /*  00 11 0         */
+    0x640b,
+    0x2809,
+    0x2809,
+    0x2809,
+    0x2809,
+    0x8209,
+    0x8209,
+    0x8209,
+    0x8209,
+    0x1809,
+    0x1809,
+    0x1809,
+    0x1809,
+    0xc10b,
+    0xc10b,     /*  000 0000         */
+    0x980c,
+    0x0c0c,     /*  000 00 1        */
+    0xc00b,
+    0xc00b,     /*  000 0          */
+    0xb40c,
+    0x6a0c,     /*  000 0 11        */
+    0xa60c,
+    0x790c,     /*  000           */
+    0x3b0b,
+    0x3b0b,     /*  000  0         */
+    0xb30b,
+    0xb30b,     /*  000  1         */
+    0x880c,
+    0x5a0c,     /*  000  111        */
+    0x2b0b,
+    0x2b0b,     /*  000 0100         */
+    0xa50c,
+    0x690c,     /*  000 01 1        */
+    0xa40b,
+    0xa40b,     /*  000 0101         */
+    0x780c,
+    0x870c,
+    0x940b,
+    0x940b,     /*  000 0110         */
+    0x770c,
+    0x760c,     /*  000 011011        */
+    0xb20a,
+    0xb20a,     /*  000 011         */
+    0xb20a,
+    0xb20a,     /*  000 011         */
+    0x1b0a,
+    0x1b0a,     /*  000 100          */
+    0x1b0a,
+    0x1b0a,     /*  000 100          */
+    0xb10a,
+    0xb10a,
+    0xb10a,     /*  000 100         */
+    0xb10a,     /*  000 100         */
+    0x0b0b,     /*  000 10100         */
+    0x0b0b,     /*  000 1010         */
+    0xb00b,
+    0xb00b,     /*  000 1010         */
+    0x960b,     /*  000 10110         */
+    0x960b,     /*  000 1011         */
+    0x4a0b,
+    0x4a0b,     /*  000 1011         */
+    0x3a0b,     /*  000 11000         */
+    0x3a0b,     /*  000 1100         */
+    0xa30b,     /*  000 11          */
+    0xa30b,     /*  000 1100         */
+    0x590b,
+    0x590b,     /*  000 1101         */
+    0x950b,     /*  000 11011         */
+    0x950b,     /*  000 1101         */
+    0x2a0a,
+    0x2a0a,
+    0x2a0a,
+    0x2a0a,
+    0xa20a,
+    0xa20a,
+    0xa20a,
+    0xa20a,
+    0xf00c,
+    0xf00c,     /*    000        */
+    0xba0d,
+    0xe50d,     /*    0 1       */
+    0xe40d,
+    0x8c0d,     /*     01       */
+    0x6d0d,
+    0xe30d,     /*     11       */
+    0xe20c,     /*    0100        */
+    0xe20c,
+    0x2e0d,     /*    01010       */
+    0x0e0d,
+    0x1e0c,     /*    0110        */
+    0x1e0c,
+    0xe10c,     /*    0111        */
+    0xe10c,
+    0xe00d,     /*    10000       */
+    0x5d0d,
+    0xd50d,     /*    1 0       */
+    0x7c0d,
+    0xc70d,
+    0x4d0d,
+    0x8b0d,
+    0xb80d,
+    0xd40d,
+    0x9a0d,
+    0xa90d,
+    0x6c0d,
+    0xc60c,
+    0xc60c,
+    0x3d0c,
+    0x3d0c,     /*    111        */
+    0xd30d,     /*  0000         */
+    0x7b0d,
+    0x2d0c,
+    0x2d0c,
+    0xd20c,
+    0xd20c,
+    0x1d0c,
+    0x1d0c,
+    0xb70c,
+    0xb70c,     /*  0000  0        */
+    0x5c0d,
+    0xc50d,     /*  0000  011       */
+    0x990d,
+    0x7a0d,
+    0xc30c,
+    0xc30c,     /*  0000  1        */
+    0xa70d,
+    0x970d,
+    0x4b0c,
+    0x4b0c,
+    0xd10b,
+    0xd10b,
+    0xd10b,     /*  0000 010        */
+    0xd10b,
+    0x0d0c,
+    0x0d0c,
+    0xd00c,
+    0xd00c,
+    0x8a0c,
+    0x8a0c,
+    0xa80c,
+    0xa80c,
+    0x4c0c,
+    0x4c0c,
+    0xc40c,
+    0xc40c,
+    0x6b0c,
+    0x6b0c,     /*  0000 1         */
+    0xb60c,     /*  0000 1 1        */
+    0xb60c,     /*  0000 1         */
+    0x3c0b,
+    0x3c0b,
+    0x3c0b,
+    0x3c0b,
+    0x2c0b,     /*  0000 1011         */
+    0x2c0b,     /*  0000 101        */
+    0x2c0b,     /*  0000 101        */
+    0x2c0b,     /*  0000 101        */
+    0xc20b,
+    0xc20b,
+    0xc20b,
+    0xc20b,
+    0x5b0b,     /*  0000 1101         */
+    0x5b0b,
+    0x5b0b,     /*  0000 110        */
+    0x5b0b,     /*  0000 110        */
+    0xb50c,
+    0xb50c,
+    0x890c,
+    0x890c,     /*  0000 1110        */
+    0x1c0b,
+    0x1c0b,
+    0x1c0b,
+    0x1c0b,
+    0x2f0d,
+    0x2f0d,     /*    000       */
+    0xf20d,     /*    0        */
+    0xf20d,     /*    000       */
+    0x6e0e,     /*     00      */
+    0x9c0e,     /*     01      */
+    0x0f0d,     /*     1       */
+    0x0f0d,     /*            */
+    0xc90e,
+    0x5e0e,     /*    01       */
+    0xab0d,     /*    0101       */
+    0xab0d,
+    0x7d0e,     /*    01100      */
+    0xd70e,
+    0x4e0d,     /*    0111       */
+    0x4e0d,
+    0xc80e,
+    0xd60e,     /*    10       */
+    0x3e0d,
+    0x3e0d,     /*    100       */
+    0xb90d,
+    0xb90d,     /*    101       */
+    0x9b0e,
+    0xaa0e,     /*    10111      */
+    0x1f0c,
+    0x1f0c,     /*    11        */
+    0x1f0c,     /*    11        */
+    0x1f0c,
+    0xf10c,     /*    111        */
+    0xf10c,     /*    11       */
+    0xf10c,     /*    11       */
+    0xf10c,     /*    11       */
+    0xe80e,
+    0xe80e,
+    0x5f0e,
+    0x5f0e,
+    0x9d0e,
+    0x9d0e,
+    0xd90e,
+    0xd90e,     /*  0000000        */
+    0xf50e,
+    0xf50e,
+    0xe70e,
+    0xe70e,
+    0xac0e,
+    0xac0e,
+    0xbb0e,
+    0xbb0e,
+    0x4f0e,
+    0x4f0e,
+    0xf40e,     /*  0000000 1       */
+    0xf40e,
+    0xca0f,
+    0xe60f,
+    0xf30e,
+    0xf30e,     /*  0000000 101      */
+    0x3f0d,
+    0x3f0d,     /*  0000000 11       */
+    0x3f0d,
+    0x3f0d,     /*  0000000 11       */
+    0x8d0e,
+    0x8d0e,
+    0xd80e,     /*  0000000 1111      */
+    0xd80e,
+    0x8f0f,
+    0x8f0f,     /*  00000000 000     */
+    0xf80f,     /*  00000000 0      */
+    0xf80f,
+    0xcc0f,     /*  00000000  0     */
+    0xcc0f,
+    0xae10,
+    0x9e10,     /*  00000000  11    */
+    0x8e0f,
+    0x8e0f,
+    0x7f10,
+    0x7e10,
+    0xf70e,     /*  00000000 011      */
+    0xf70e,
+    0xf70e,
+    0xf70e,     /*  00000000 01     */
+    0xda0e,
+    0xda0e,     /*  00000000 10      */
+    0xda0e,
+    0xda0e,     /*  00000000 10      */
+    0xad0f,
+    0xad0f,     /*  00000000 101     */
+    0xbc0f,
+    0xbc0f,     /*  00000000 101     */
+    0xcb0f,
+    0xcb0f,     /*  00000000 110     */
+    0xf60f,
+    0xf60f,     /*  00000000 110     */
+    0x6f0e,
+    0x6f0e,     /*  00000000 11     */
+    0x6f0e,     /*  00000000 11     */
+    0x6f0e,     /*  00000000 11     */
+    0xff10,
+    0xff10,
+    0xef10,
+    0xef10,     /*  000000000000     */
+    0xdf10,     /*  000000000000 1    */
+    0xdf10,     /*  000000000000     */
+    0xee10,     /*  00000000000 00    */
+    0xee10,     /*  00000000000 0    */
+    0xcf10,     /*  00000000000 01    */
+    0xcf10,
+    0xde10,     /*  00000000000 10    */
+    0xde10,
+    0xbf10,     /*  00000000000 11    */
+    0xbf10,     /*  00000000000 1    */
+    0xfb10,
+    0xfb10,
+    0xce10,
+    0xce10,     /*  0000000000 00    */
+    0xdc10,     /*  0000000000 010    */
+    0xdc10,
+    0xaf11,
+    0xe911,
+    0xec0f,     /*  0000000000 10     */
+    0xec0f,     /*  0000000000 1     */
+    0xec0f,     /*  0000000000 1     */
+    0xec0f,     /*  0000000000 1     */
+    0xdd0f,     /*  0000000000 11     */
+    0xdd0f,     /*  0000000000 1    */
+    0xdd0f,     /*  0000000000 1    */
+    0xdd0f,     /*  0000000000 1    */
+    0xfa10,     /*  000000000 0000    */
+    0xfa10,     /*  000000000 000    */
+    0xcd10,     /*  000000000 0     */
+    0xcd10,     /*  000000000 000    */
+    0xbe0f,     /*  000000000       */
+    0xbe0f,
+    0xbe0f,
+    0xbe0f,
+    0xeb0f,
+    0xeb0f,
+    0xeb0f,
+    0xeb0f,     /*  000000000 01     */
+    0x9f0f,     /*  000000000 011     */
+    0x9f0f,     /*  000000000 01    */
+    0x9f0f,
+    0x9f0f,
+    0xf90f,     /*  000000000 100     */
+    0xf90f,     /*  000000000 10     */
+    0xf90f,     /*  000000000 10     */
+    0xf90f,     /*  000000000 10     */
+    0xea0f,     /*  000000000 101     */
+    0xea0f,     /*  000000000 10    */
+    0xea0f,     /*  000000000 10    */
+    0xea0f,     /*  000000000 10    */
+    0xbd0f,     /*  000000000 110     */
+    0xbd0f,     /*  000000000 11     */
+    0xbd0f,     /*  000000000 11     */
+    0xbd0f,     /*  000000000 11     */
+    0xdb0f,     /*  000000000 111     */
+    0xdb0f,     /*  000000000 11    */
+    0xdb0f,     /*  000000000 11    */
+    0xdb0f,     /*  000000000 11    */
+    0xfe13,
+    0xfc13,
+    0xfd12,
+    0xfd12,
+    0xed11,
+    0xed11,
+    0xed11,
+    0xed11
+
+};
+
+
+
+const uint16 huffTable_15[421] =
+{
+    0x1103,
+    0x1103,
+    0x0104,
+    0x1004,
+    0x0003,     /*  111                 */
+    0x0003, /*  11                 */
+    0x3407,
+    0x4307,
+    0x2407,     /*  0101              */
+    0x4207,     /*  0101010             */
+    0x3307,
+    0x4106,     /*  010110              */
+    0x4106,
+    0x1407,     /*  0101110             */
+    0x0407,
+    0x2306,     /*  011000              */
+    0x2306,
+    0x3206,     /*  011               */
+    0x3206,
+    0x4007,
+    0x0307,
+    0x1306,     /*  011011              */
+    0x1306,     /*  01101              */
+    0x3106,     /*  011100              */
+    0x3106,     /*  01110              */
+    0x3006,     /*  011101              */
+    0x3006,     /*  01110              */
+    0x2205,     /*  01111               */
+    0x2205,     /*  0111              */
+    0x2205,     /*  0111              */
+    0x2205,     /*  0111              */
+    0x1205,     /*  10000               */
+    0x1205,     /*  1000               */
+    0x1205,     /*  1000               */
+    0x1205,     /*  1000               */
+    0x2105,     /*  10                */
+    0x2105,     /*  1000              */
+    0x2105,     /*  1000              */
+    0x2105,     /*  1000              */
+    0x0205,
+    0x0205,     /*  1                */
+    0x0205,     /*  1                */
+    0x0205,     /*  1                */
+    0x2005,     /*  1 1               */
+    0x2005,     /*  1               */
+    0x2005,     /*  1               */
+    0x2005,     /*  1               */
+    0x5809,
+    0x8509,
+    0x2909,     /*               */
+    0x6709,     /*   000            */
+    0x7609,     /*   00 0           */
+    0x9209,     /*   00 1           */
+    0x9108,     /*   0 0            */
+    0x9108,     /*   0             */
+    0x1909,     /*   0 10           */
+    0x9009,     /*   0 11           */
+    0x4809,     /*    000           */
+    0x8409,     /*                */
+    0x5709,     /*    010           */
+    0x7509,     /*    011           */
+    0x3809,     /*    100           */
+    0x8309,     /*    101           */
+    0x6609,     /*    110           */
+    0x4709,     /*    111           */
+    0x2808,
+    0x2808,     /*   0100            */
+    0x8208,     /*   01             */
+    0x8208,     /*   0100            */
+    0x1808,     /*   01010            */
+    0x1808,     /*   0101            */
+    0x8108,     /*   01011            */
+    0x8108,     /*   0101            */
+    0x7409,
+    0x0809,     /*   011            */
+    0x8009,     /*   011010           */
+    0x5609,
+    0x6509,     /*   011100           */
+    0x3709,
+    0x7309,     /*   011110           */
+    0x4609,
+    0x2708,     /*   10000            */
+    0x2708,     /*   1000            */
+    0x7208,     /*   10             */
+    0x7208,     /*   1000            */
+    0x6408,     /*   1 0            */
+    0x6408,     /*   1             */
+    0x1708,     /*   1 1            */
+    0x1708,     /*   1             */
+    0x5508,     /*   10100            */
+    0x5508,
+    0x7108,     /*   10101            */
+    0x7108,
+    0x0709,     /*   101100           */
+    0x7009,     /*   101101           */
+    0x3608,     /*   10111            */
+    0x3608,     /*   1011            */
+    0x6308,     /*   11000            */
+    0x6308,     /*   1100            */
+    0x4508,     /*   11             */
+    0x4508,     /*   1100            */
+    0x5408,     /*   11010            */
+    0x5408,     /*   1101            */
+    0x2608,     /*   11011            */
+    0x2608,     /*   1101            */
+    0x6208,     /*   11100            */
+    0x6208,     /*   1110            */
+    0x1608,     /*   11101            */
+    0x1608,     /*   1110            */
+    0x0609,     /*   111100           */
+    0x6009,     /*   111101           */
+    0x3508,     /*   11111            */
+    0x3508,     /*   1111            */
+    0x6107,
+    0x6107,
+    0x6107,
+    0x6107,
+    0x5308,     /*  0100 0            */
+    0x5308,     /*  0100             */
+    0x4408,     /*  0100 1            */
+    0x4408,     /*  0100             */
+    0x2507,     /*  010 0             */
+    0x2507,     /*  010              */
+    0x2507,     /*  010              */
+    0x2507,     /*  010              */
+    0x5207,     /*  010 1             */
+    0x5207,     /*  010             */
+    0x5207,     /*  010             */
+    0x5207,     /*  010             */
+    0x1507,     /*  01 00             */
+    0x1507,     /*  01 0             */
+    0x1507,     /*  01 0             */
+    0x1507,     /*  01 0             */
+    0x5107,     /*  01 01             */
+    0x5107,     /*  01 0            */
+    0x5107,     /*  01 0            */
+    0x5107,     /*  01 0            */
+    0x0508,     /*  01 100            */
+    0x0508,     /*  01 10            */
+    0x5008,     /*  01 101            */
+    0x5008,     /*  01 10            */
+    0xc209,
+    0xc209,
+    0x2c0a,     /*  00 11110          */
+    0x5b0a,
+    0xb50a,     /*  0            */
+    0x1c0a,     /*  0 000           */
+    0x890a,     /*  0 00 0          */
+    0x980a,
+    0xc10a,     /*  0 0 00          */
+    0x4b0a,     /*  0 0 01          */
+    0xb40a,     /*  0 0 10          */
+    0x6a0a,     /*  0 0 11          */
+    0x3b0a,     /*  0  000          */
+    0x790a,     /*  0             */
+    0xb309,     /*  0  01           */
+    0xb309,     /*  0  0           */
+    0x970a,     /*  0  100          */
+    0x880a,     /*  0  101          */
+    0x2b0a,     /*  0  110          */
+    0x5a0a,     /*  0  111          */
+    0xb209,     /*  0 01000           */
+    0xb209,     /*  0 0100           */
+    0xa50a,     /*  0 01 0          */
+    0x1b0a,     /*  0 01 1          */
+    0xb109,     /*  0 01010           */
+    0xb109,     /*  0 0101           */
+    0xb00a,     /*  0 010110          */
+    0x690a,     /*  0 010111          */
+    0x960a,     /*  0 011000          */
+    0x4a0a,     /*  0 011           */
+    0xa40a,     /*  0 011010          */
+    0x780a,     /*  0 011011          */
+    0x870a,     /*  0 011100          */
+    0x3a0a,     /*  0 011101          */
+    0xa309,     /*  0 01111           */
+    0xa309,     /*  0 0111           */
+    0x5909,     /*  0 10000           */
+    0x5909,     /*  0 1000           */
+    0x9509,     /*  0 10            */
+    0x9509,     /*  0 1000           */
+    0x2a09,     /*  0 1 0           */
+    0x2a09,     /*  0 1            */
+    0xa209,     /*  0 1 1           */
+    0xa209,     /*  0 1            */
+    0x1a09,     /*  0 10100           */
+    0x1a09,     /*  0 1010           */
+    0xa109,     /*  0 10101           */
+    0xa109,     /*  0 1010           */
+    0x0a0a,     /*  0 101100          */
+    0xa00a,     /*  0 101101          */
+    0x6809,     /*  0 10111           */
+    0x6809,     /*  0 1011           */
+    0x8609,     /*  0 11000           */
+    0x8609,     /*  0 1100           */
+    0x4909,     /*  0 11            */
+    0x4909,     /*  0 1100           */
+    0x9409,     /*  0 11010           */
+    0x9409,     /*  0 1101           */
+    0x3909,     /*  0 11011           */
+    0x3909,     /*  0 1101           */
+    0x9309,     /*  0 11100           */
+    0x9309,     /*  0 1110           */
+    0x770a,     /*  0 111010          */
+    0x090a,     /*  0 111011          */
+    0x7c0b,
+    0xc70b,     /*  00 000          */
+    0x4d0b,     /*  00 00 0         */
+    0x8b0b,     /*  00 00 1         */
+    0xd40a,     /*  00 0 0          */
+    0xd40a,     /*  00 0           */
+    0xb80b,     /*  00 0 10         */
+    0x9a0b,     /*  00 0 11         */
+    0xa90b,     /*  00  000         */
+    0x6c0b,     /*  00            */
+    0xc60b,     /*  00  010         */
+    0x3d0b,     /*  00  011         */
+    0xd30a,     /*  00  10          */
+    0xd30a,     /*  00  1          */
+    0xd20a,     /*  00  11          */
+    0xd20a,     /*  00  1          */
+    0x2d0b,     /*  00 010000         */
+    0x0d0b,     /*  00 010          */
+    0x1d0a,     /*  00 01           */
+    0x1d0a,     /*  00 0100          */
+    0x7b0a,     /*  00 01010          */
+    0x7b0a,     /*  00 0101          */
+    0xb70a,     /*  00 01011          */
+    0xb70a,     /*  00 0101          */
+    0xd10a,     /*  00 01100          */
+    0xd10a,     /*  00 0110          */
+    0x5c0b,     /*  00 011010         */
+    0xd00b,     /*  00 011011         */
+    0xc50a,     /*  00 01110          */
+    0xc50a,     /*  00 0111          */
+    0x8a0a,     /*  00 01111          */
+    0x8a0a,     /*  00 0111          */
+    0xa80a,     /*  00 10000          */
+    0xa80a,     /*  00 1000          */
+    0x4c0a,     /*  00 10           */
+    0x4c0a,     /*  00 1000          */
+    0xc40a,     /*  00 1 0          */
+    0xc40a,     /*  00 1           */
+    0x6b0a,     /*  00 1 1          */
+    0x6b0a,     /*  00 1           */
+    0xb60a,     /*  00 10100          */
+    0xb60a,     /*  00 1010          */
+    0x990b,     /*  00 101010         */
+    0x0c0b,     /*  00 101011         */
+    0x3c0a,     /*  00 10110          */
+    0x3c0a,     /*  00 1011          */
+    0xc30a,     /*  00 10111          */
+    0xc30a,     /*  00 1011          */
+    0x7a0a,     /*  00 11000          */
+    0x7a0a,     /*  00 1100          */
+    0xa70a,     /*  00 11           */
+    0xa70a,     /*  00 1100          */
+    0xa60a,     /*  00 11010          */
+    0xa60a,     /*  00 1101          */
+    0xc00b,     /*  00 110110         */
+    0x0b0b,     /*  00 110111         */
+    0xcb0b,
+    0xcb0b,     /*  0000 000         */
+    0xf60b,     /*  0000 0          */
+    0xf60b,     /*  0000 000         */
+    0x8e0c,     /*  0000  00        */
+    0xe80c,     /*  0000  01        */
+    0x5f0c,     /*  0000  10        */
+    0x9d0c,     /*  0000  11        */
+    0xf50b,     /*  0000 0100         */
+    0xf50b,     /*  0000 010         */
+    0x7e0b,     /*  0000 0101         */
+    0x7e0b,     /*  0000 010         */
+    0xe70b,     /*  0000 0110         */
+    0xe70b,     /*  0000 011         */
+    0xac0b,     /*  0000 0111         */
+    0xac0b,     /*  0000 011         */
+    0xca0b,     /*  0000 1000         */
+    0xca0b,     /*  0000 100         */
+    0xbb0b,     /*  0000 1          */
+    0xbb0b,     /*  0000 100         */
+    0xd90c,     /*  0000 10100        */
+    0x8d0c,     /*  0000 10101        */
+    0x4f0b,     /*  0000 1011         */
+    0x4f0b,     /*  0000 101         */
+    0xf40b,     /*  0000 1100         */
+    0xf40b,     /*  0000 110         */
+    0x3f0b,     /*  0000 1101         */
+    0x3f0b,     /*  0000 110         */
+    0xf30b,     /*  0000 1110         */
+    0xf30b,     /*  0000 111         */
+    0xd80b,     /*  0000 1111         */
+    0xd80b,     /*  0000 111         */
+    0xe60b,     /*  000           */
+    0xe60b,     /*  000 0000         */
+    0x2f0b,     /*  000 00          */
+    0x2f0b,     /*  000 0000         */
+    0xf20b,     /*  000 0 0         */
+    0xf20b,     /*  000 0          */
+    0x6e0c,     /*  000 0 10        */
+    0xf00c,     /*  000 0 11        */
+    0x1f0b,     /*  000  00         */
+    0x1f0b,     /*  000  0         */
+    0xf10b,     /*  000  01         */
+    0xf10b,     /*  000  0         */
+    0x9c0b,     /*  000  10         */
+    0x9c0b,     /*  000  1         */
+    0xc90b,     /*  000  11         */
+    0xc90b,     /*  000  1         */
+    0x5e0b,     /*  000 01000         */
+    0x5e0b,     /*  000 0100         */
+    0xab0b,     /*  000 01          */
+    0xab0b,     /*  000 0100         */
+    0xba0b,     /*  000 01010         */
+    0xba0b,     /*  000 0101         */
+    0xe50b,     /*  000 01011         */
+    0xe50b,     /*  000 0101         */
+    0x7d0b,     /*  000 01100         */
+    0x7d0b,     /*  000 0110         */
+    0xd70b,     /*  000 01101         */
+    0xd70b,
+    0x4e0b,     /*  000 01110         */
+    0x4e0b,
+    0xe40b,     /*  000 01111         */
+    0xe40b,     /*  000 0111         */
+    0x8c0b,
+    0x8c0b,     /*  000 1000         */
+    0xc80b,     /*  000 10          */
+    0xc80b,
+    0x3e0b,     /*  000 1 0         */
+    0x3e0b,     /*  000 1          */
+    0x6d0b,
+    0x6d0b,     /*  000 1          */
+    0xd60b,     /*  000 10100         */
+    0xd60b,     /*  000 1010         */
+    0xe30b,
+    0xe30b,     /*  000 1010         */
+    0x9b0b,     /*  000 10110         */
+    0x9b0b,     /*  000 1011         */
+    0xb90b,
+    0xb90b,     /*  000 1011         */
+    0x2e0b,     /*  000 11000         */
+    0x2e0b,     /*  000 1100         */
+    0xaa0b,
+    0xaa0b,     /*  000 1100         */
+    0xe20b,
+    0xe20b,     /*  000 1101         */
+    0x1e0b,
+    0x1e0b,     /*  000 1101         */
+    0xe10b,
+    0xe10b,     /*  000 1110         */
+    0x0e0c,
+    0xe00c,     /*  000 111011        */
+    0x5d0b,
+    0x5d0b,     /*  000 1111         */
+    0xd50b,
+    0xd50b,     /*  000 1111         */
+    0xff0d,
+    0xef0d,
+    0xfe0d,
+    0xdf0d,
+    0xee0c,
+    0xee0c,
+    0xfd0d,
+    0xcf0d,
+    0xfc0d,
+    0xde0d,
+    0xed0d,
+    0xbf0d,
+    0xfb0c,
+    0xfb0c,
+    0xce0d,
+    0xec0d,
+    0xdd0c,     /*    000        */
+    0xdd0c,     /*    00        */
+    0xaf0c,     /*             */
+    0xaf0c,     /*    00        */
+    0xfa0c,     /*    010        */
+    0xfa0c,     /*    01        */
+    0xbe0c,     /*    011        */
+    0xbe0c,     /*    01        */
+    0xeb0c,     /*    100        */
+    0xeb0c,     /*    10        */
+    0xcd0c,     /*    101        */
+    0xcd0c,     /*    10        */
+    0xdc0c,     /*    110        */
+    0xdc0c,     /*    11        */
+    0x9f0c,     /*    111        */
+    0x9f0c,     /*    11        */
+    0xf90c,     /*    0000        */
+    0xf90c,     /*    000        */
+    0xea0c,     /*    0         */
+    0xea0c,     /*    000        */
+    0xbd0c,     /*     0        */
+    0xbd0c,     /*             */
+    0xdb0c,     /*     1        */
+    0xdb0c,     /*             */
+    0x8f0c,     /*    0100        */
+    0x8f0c,     /*    010        */
+    0xf80c,     /*    0101        */
+    0xf80c,     /*    010        */
+    0xcc0c,
+    0xcc0c,     /*    011        */
+    0x9e0c,     /*    0111        */
+    0x9e0c,     /*    011        */
+    0xe90c,     /*    1000        */
+    0xe90c,     /*    100        */
+    0x7f0c,     /*    1         */
+    0x7f0c,
+    0xf70c,     /*    1010        */
+    0xf70c,     /*    101        */
+    0xad0c,     /*    1011        */
+    0xad0c,     /*    101        */
+    0xda0c,     /*    1100        */
+    0xda0c,     /*    110        */
+    0xbc0c,
+    0xbc0c,     /*    110        */
+    0x6f0c,     /*    1110        */
+    0x6f0c,     /*    111        */
+    0xae0d,     /*    11110       */
+    0x0f0d
+};
+
+const uint16 huffTable_16[465] =
+{
+    0x0001,
+    0x1104,
+    0x0104,
+    0x1003,
+    0x1003,
+    0x2308,
+    0x3208,     /*    11            */
+    0x1307,     /*   0100             */
+    0x1307,     /*   010             */
+    0x3107,
+    0x3107,
+    0x0308,
+    0x3008,
+    0x2207,     /*   0111             */
+    0x2207,     /*   011             */
+    0x1206,     /*   100              */
+    0x1206,     /*   10              */
+    0x1206,     /*   10              */
+    0x1206,     /*   10              */
+    0x2106,     /*   101              */
+    0x2106,     /*   10             */
+    0x2106,     /*   10             */
+    0x2106,     /*   10             */
+    0x0206,
+    0x0206,
+    0x0206,
+    0x0206,
+    0x2006,
+    0x2006,
+    0x2006,
+    0x2006,
+    0x1709,
+    0x1709,     /*  0 0111           */
+    0x7109,     /*  0 10000           */
+    0x7109,     /*  0 1000           */
+    0x700a,     /*  0 10 0          */
+    0x360a,     /*  0 10 1          */
+    0x630a,     /*  0 1 00          */
+    0x450a,     /*  0 1 01          */
+    0x540a,     /*  0 1 10          */
+    0x260a,     /*  0 1 11          */
+    0x6209,     /*  0 10100           */
+    0x6209,     /*  0 1010           */
+    0x1609,
+    0x1609,
+    0x6109,     /*  0 10110           */
+    0x6109,     /*  0 1011           */
+    0x060a,     /*  0 101110          */
+    0x600a,
+    0x5309,
+    0x5309,     /*  0 1100           */
+    0x350a,     /*  0 11 0          */
+    0x440a,     /*  0 11 1          */
+    0x2509,     /*  0 11010           */
+    0x2509,     /*  0 1101           */
+    0x5209,     /*  0 11011           */
+    0x5209,     /*  0 1101           */
+    0x5108,
+    0x5108,
+    0x5108,
+    0x5108,
+    0x1509,
+    0x1509,     /*  0 1111           */
+    0x0509,     /*  0 11111           */
+    0x0509,     /*  0 1111           */
+    0x3409,     /*               */
+    0x3409,     /*               */
+    0x4309,     /*   000            */
+    0x4309,     /*               */
+    0x5009,     /*   00 0           */
+    0x5009,     /*   00            */
+    0x2409,     /*   00 1           */
+    0x2409,     /*   00            */
+    0x4209,     /*   0 00           */
+    0x4209,     /*   0 0           */
+    0x3309,     /*   0 01           */
+    0x3309,     /*   0 0           */
+    0x1408,     /*   0 1            */
+    0x1408,     /*   0            */
+    0x1408,     /*   0            */
+    0x1408,     /*   0            */
+    0x4108,     /*    00            */
+    0x4108,     /*    0            */
+    0x4108,     /*    0            */
+    0x4108,     /*    0            */
+    0x0409,     /*    010           */
+    0x0409,     /*    01           */
+    0x4009,     /*    011           */
+    0x4009,     /*    01           */
+    0x1d0b,
+    0x1d0b,     /*  00 10101         */
+    0xc40c,     /*  00 1011000        */
+    0x6b0c,     /*  00 1011         */
+    0xc30c,     /*  00 1011010        */
+    0xa70c,     /*  00 1011011        */
+    0x2c0b,     /*  00 101110         */
+    0x2c0b,     /*  00 10111         */
+    0xc20c,     /*  00 1011110        */
+    0xb50c,     /*  00 1011111        */
+    0xc10c,     /*  00 1100000        */
+    0x0c0c,     /*  00 1100         */
+    0x4b0c,     /*  00 110 0        */
+    0xb40c,     /*  00 110 1        */
+    0x6a0c,     /*  00 11 00        */
+    0xa60c,     /*  00 11 01        */
+    0xb30b,     /*  00 11 1         */
+    0xb30b,     /*  00 11          */
+    0x5a0c,     /*  00 1101000        */
+    0xa50c,     /*  00 1101         */
+    0x2b0b,     /*  00 110101         */
+    0x2b0b,     /*  00 11010         */
+    0xb20b,     /*  00 110110         */
+    0xb20b,     /*  00 11011         */
+    0x1b0b,     /*  00 110111         */
+    0x1b0b,     /*  00 11011         */
+    0xb10b,     /*  00 111000         */
+    0xb10b,     /*  00 11100         */
+    0x0b0c,     /*  00 111 0        */
+    0xb00c,     /*  00 111 1        */
+    0x690c,     /*  00 1110100        */
+    0x960c,     /*  00 1110101        */
+    0x4a0c,     /*  00 1110110        */
+    0xa40c,     /*  00 1110111        */
+    0x780c,     /*  00 1111000        */
+    0x870c,     /*  00 1111         */
+    0xa30b,     /*  00 111101         */
+    0xa30b,     /*  00 11110         */
+    0x3a0c,     /*  00 1111100        */
+    0x590c,     /*  00 1111101        */
+    0x2a0b,     /*  00 111111         */
+    0x2a0b,     /*  00 11111         */
+    0x950c,     /*  0 00000000        */
+    0x680c,     /*  0           */
+    0xa10b,     /*  0 0000          */
+    0xa10b,     /*  0           */
+    0x860c,     /*  0 000 00        */
+    0x770c,     /*  0 000 01        */
+    0x940b,     /*  0 000 1         */
+    0x940b,     /*  0 000          */
+    0x490c,     /*  0 00 000        */
+    0x570c,     /*  0 00          */
+    0x670b,     /*  0 00 01         */
+    0x670b,     /*  0 00 0         */
+    0xa20a,     /*  0 00 1          */
+    0xa20a,     /*  0 00          */
+    0xa20a,     /*  0 00          */
+    0xa20a,     /*  0 00          */
+    0x1a0a,     /*  0 0 00          */
+    0x1a0a,     /*  0 0 0          */
+    0x1a0a,     /*  0 0 0          */
+    0x1a0a,     /*  0 0 0          */
+    0x0a0b,     /*  0 0 010         */
+    0x0a0b,     /*  0 0 01         */
+    0xa00b,     /*  0 0 011         */
+    0xa00b,     /*  0 0 01         */
+    0x390b,     /*  0 0 100         */
+    0x390b,     /*  0 0 10         */
+    0x930b,     /*  0 0 101         */
+    0x930b,     /*  0 0 10         */
+    0x580b,     /*  0 0 110         */
+    0x580b,     /*  0 0 11         */
+    0x850b,     /*  0 0 111         */
+    0x850b,     /*  0 0 11         */
+    0x290a,     /*  0  000          */
+    0x290a,     /*  0  00          */
+    0x290a,     /*  0  00          */
+    0x290a,     /*  0  00          */
+    0x920a,     /*  0             */
+    0x920a,     /*  0  00         */
+    0x920a,     /*  0  00         */
+    0x920a,     /*  0  00         */
+    0x760b,     /*  0  0100         */
+    0x760b,     /*  0  010         */
+    0x090b,     /*  0  0101         */
+    0x090b,     /*  0  010         */
+    0x190a,     /*  0  011          */
+    0x190a,     /*  0  01         */
+    0x190a,     /*  0  01         */
+    0x190a,     /*  0  01         */
+    0x910a,     /*  0  100          */
+    0x910a,     /*  0  10          */
+    0x910a,     /*  0  10          */
+    0x910a,     /*  0  10          */
+    0x900b,     /*  0  1010         */
+    0x900b,     /*  0  101         */
+    0x480b,     /*  0  1011         */
+    0x480b,     /*  0  101         */
+    0x840b,     /*  0  1100         */
+    0x840b,     /*  0  110         */
+    0x750b,     /*  0  1101         */
+    0x750b,     /*  0  110         */
+    0x380b,     /*  0  1110         */
+    0x380b,     /*  0  111         */
+    0x830b,     /*  0  1111         */
+    0x830b,     /*  0  111         */
+    0x660b,     /*  0 0100000         */
+    0x660b,     /*  0 010000         */
+    0x280b,     /*  0 0100          */
+    0x280b,     /*  0 010000         */
+    0x820a,     /*  0 010           */
+    0x820a,     /*  0 01000         */
+    0x820a,     /*  0 01000         */
+    0x820a,     /*  0 01000         */
+    0x470b,     /*  0 01 00         */
+    0x470b,     /*  0 01 0         */
+    0x740b,     /*  0 01 01         */
+    0x740b,     /*  0 01 0         */
+    0x180a,     /*  0 01 1          */
+    0x180a,     /*  0 01          */
+    0x180a,     /*  0 01          */
+    0x180a,     /*  0 01          */
+    0x810a,     /*  0 010100          */
+    0x810a,     /*  0 01010          */
+    0x810a,     /*  0 01010          */
+    0x810a,     /*  0 01010          */
+    0x800a,     /*  0 010101          */
+    0x800a,     /*  0 01010         */
+    0x800a,     /*  0 01010         */
+    0x800a,     /*  0 01010         */
+    0x080b,     /*  0 0101100         */
+    0x080b,     /*  0 010110         */
+    0x560b,     /*  0 0101101         */
+    0x560b,     /*  0 010110         */
+    0x370a,     /*  0 010111          */
+    0x370a,     /*  0 01011         */
+    0x370a,     /*  0 01011         */
+    0x370a,     /*  0 01011         */
+    0x730a,     /*  0 011000          */
+    0x730a,     /*  0 01100          */
+    0x730a,     /*  0 01100          */
+    0x730a,     /*  0 01100          */
+    0x650b,     /*  0 011 0         */
+    0x650b,     /*  0 011          */
+    0x460b,     /*  0 011 1         */
+    0x460b,     /*  0 011          */
+    0x270a,     /*  0 011010          */
+    0x270a,     /*  0 01101          */
+    0x270a,     /*  0 01101          */
+    0x270a,     /*  0 01101          */
+    0x720a,     /*  0 011011          */
+    0x720a,     /*  0 01101         */
+    0x720a,     /*  0 01101         */
+    0x720a,     /*  0 01101         */
+    0x640b,     /*  0 0111000         */
+    0x640b,     /*  0 011100         */
+    0x550b,     /*  0 0111          */
+    0x550b,     /*  0 011100         */
+    0x070a,     /*  0 011101          */
+    0x070a,     /*  0 01110         */
+    0x070a,     /*  0 01110         */
+    0x070a,     /*  0 01110         */
+    0x9e0d,
+    0x9e0d,     /*  00 0110000       */
+    0xbc0e,     /*  00 01100 0      */
+    0xcb0e,     /*  00 01100 1      */
+    0x8e0e,     /*  00 0110 00      */
+    0xe80e,     /*  00 0110 01      */
+    0x9d0e,     /*  00 0110 10      */
+    0xe70e,     /*  00 0110 11      */
+    0xbb0e,     /*  00 011 000      */
+    0x8d0e,     /*  00 011        */
+    0xd80e,     /*  00 011 010      */
+    0x6e0e,     /*  00 011 011      */
+    0xe60d,     /*  00 011 10       */
+    0xe60d,     /*  00 011 1       */
+    0x9c0d,     /*  00 011 11       */
+    0x9c0d,     /*  00 011 1       */
+    0xab0e,     /*  00 011010000      */
+    0xba0e,     /*  00 011010       */
+    0xe50e,     /*  00 01101 0      */
+    0xd70e,     /*  00 01101 1      */
+    0x4e0d,     /*  00 01101010       */
+    0x4e0d,     /*  00 0110101       */
+    0xe40e,     /*  00 011010110      */
+    0x8c0e,     /*  00 011010111      */
+    0xc80d,     /*  00 01101100       */
+    0xc80d,     /*  00 0110110       */
+    0x3e0d,     /*  00 01101101       */
+    0x3e0d,     /*  00 0110110       */
+    0x6d0d,     /*  00 01101110       */
+    0x6d0d,     /*  00 0110111       */
+    0xd60e,     /*  00 011011110      */
+    0x9b0e,     /*  00 011011111      */
+    0xb90e,     /*  00 011100000      */
+    0xaa0e,     /*  00 011100       */
+    0xe10d,     /*  00 01110        */
+    0xe10d,     /*  00 0111000       */
+    0xd40d,     /*  00 0111 0       */
+    0xd40d,     /*  00 0111        */
+    0xb80e,     /*  00 0111 10      */
+    0xa90e,     /*  00 0111 11      */
+    0x7b0d,     /*  00 01110100       */
+    0x7b0d,     /*  00 0111010       */
+    0xb70e,     /*  00 011101010      */
+    0xd00e,     /*  00 011101011      */
+    0xe30c,     /*  00 0111011        */
+    0xe30c,     /*  00 011101       */
+    0xe30c,     /*  00 011101       */
+    0xe30c,     /*  00 011101       */
+    0x0e0d,     /*  00 01111000       */
+    0x0e0d,     /*  00 0111100       */
+    0xe00d,     /*  00 01111        */
+    0xe00d,     /*  00 0111100       */
+    0x5d0d,     /*  00 01111010       */
+    0x5d0d,     /*  00 0111101       */
+    0xd50d,     /*  00 01111011       */
+    0xd50d,     /*  00 0111101       */
+    0x7c0d,     /*  00 01111100       */
+    0x7c0d,     /*  00 0111110       */
+    0xc70d,     /*  00 01111101       */
+    0xc70d,     /*  00 0111110       */
+    0x4d0d,     /*  00 01111110       */
+    0x4d0d,     /*  00 0111111       */
+    0x8b0d,     /*  00 01111111       */
+    0x8b0d,     /*  00 0111111       */
+    0x9a0d,
+    0x6c0d,     /*  00 10000        */
+    0xc60d,     /*  00 1000 0       */
+    0x3d0d,     /*  00 1000 1       */
+    0x5c0d,     /*  00 100 00       */
+    0xc50d,     /*  00 100 01       */
+    0x0d0c,     /*  00 100 1        */
+    0x0d0c,     /*  00 100         */
+    0x8a0d,     /*  00 10 000       */
+    0xa80d,     /*  00 10         */
+    0x990d,     /*  00 10 010       */
+    0x4c0d,     /*  00 10 011       */
+    0xb60d,     /*  00 10 100       */
+    0x7a0d,     /*  00 10 101       */
+    0x3c0c,     /*  00 10 11        */
+    0x3c0c,     /*  00 10 1        */
+    0x5b0d,     /*  00 1 0000       */
+    0x890d,     /*  00 1 0        */
+    0x1c0c,     /*  00 1          */
+    0x1c0c,     /*  00 1 00        */
+    0xc00c,     /*  00 1 010        */
+    0xc00c,     /*  00 1 01        */
+    0x980d,     /*  00 1 0110       */
+    0x790d,     /*  00 1 0111       */
+    0xe20b,     /*  00 1 10         */
+    0xe20b,     /*  00 1 1         */
+    0xe20b,     /*  00 1 1         */
+    0xe20b,     /*  00 1 1         */
+    0x2e0c,     /*  00 1 110        */
+    0x2e0c,     /*  00 1 11        */
+    0x1e0c,     /*  00 1 111        */
+    0x1e0c,     /*  00 1 11        */
+    0xd30c,     /*  00 1010000        */
+    0xd30c,     /*  00 101000        */
+    0x2d0c,     /*  00 1010         */
+    0x2d0c,     /*  00 101000        */
+    0xd20c,     /*  00 101 0        */
+    0xd20c,     /*  00 101         */
+    0xd10c,     /*  00 101 1        */
+    0xd10c,     /*  00 101         */
+    0x3b0c,     /*  00 1010100        */
+    0x3b0c,     /*  00 101010        */
+    0x970d,     /*  00 10101010       */
+    0x880d,     /*  00 10101011       */
+    0xf208,
+    0xf208,     /*  000 1            */
+    0x2f09,     /*  00 0000           */
+    0x0f09,     /*  00 0            */
+    0x1f08,     /*  00              */
+    0x1f08,     /*  00 00            */
+    0xf108,     /*  00 010            */
+    0xf108,     /*  00 01            */
+    0xce10,
+    0xce10,     /*  000 101100000    */
+    0xec11,     /*  000 1011000 0   */
+    0xdd11,     /*  000 1011000 1   */
+    0xde0f,     /*  000 101100      */
+    0xde0f,     /*  000 10110000    */
+    0xde0f,     /*  000 10110000    */
+    0xde0f,     /*  000 10110000    */
+    0xe90f,     /*  000 10110 0     */
+    0xe90f,     /*  000 10110      */
+    0xe90f,     /*  000 10110      */
+    0xe90f,     /*  000 10110      */
+    0xea10,     /*  000 10110 10    */
+    0xea10,     /*  000 10110 1    */
+    0xd910,     /*  000 10110 11    */
+    0xd910,     /*  000 10110 1    */
+    0xee0e,
+    0xee0e,     /*  000 1011       */
+    0xed0f,     /*  000 1011 10     */
+    0xeb0f,     /*  000 1011 11     */
+    0xbe0e,     /*  000 10110100      */
+    0xbe0e,     /*  000 1011010      */
+    0xcd0e,     /*  000 10110101      */
+    0xcd0e,     /*  000 1011010      */
+    0xdc0f,     /*  000 101101100     */
+    0xdb0f,     /*  000 101101101     */
+    0xae0e,     /*  000 10110111      */
+    0xae0e,     /*  000 1011011      */
+    0xcc0e,     /*  000 10111000      */
+    0xcc0e,     /*  000 1011100      */
+    0xad0f,     /*  000 10111 0     */
+    0xda0f,     /*  000 10111 1     */
+    0x7e0f,     /*  000 101110100     */
+    0xac0f,     /*  000 101110101     */
+    0xca0e,     /*  000 10111011      */
+    0xca0e,     /*  000 1011101      */
+    0xc90f,     /*  000 101111000     */
+    0x7d0f,     /*  000 101111      */
+    0x5e0e,     /*  000 10111101      */
+    0x5e0e,     /*  000 1011110      */
+    0xbd0d,     /*  000 1011111       */
+    0xbd0d,     /*  000 101111      */
+    0xbd0d,     /*  000 101111      */
+    0xbd0d,     /*  000 101111      */
+    0xef0b,
+    0xfe0b,     /*  00000000          */
+    0xdf0b,     /*  0000000 0         */
+    0xfd0b,     /*  0000000 1         */
+    0xcf0b,     /*    00         */
+    0xfc0b,     /*    01         */
+    0xbf0b,     /*    10         */
+    0xfb0b,     /*    11         */
+    0xaf0a,     /*    00          */
+    0xaf0a,     /*    0          */
+    0xfa0b,     /*    010         */
+    0x9f0b,     /*    011         */
+    0xf90b,     /*    100         */
+    0xf80b,     /*    101         */
+    0x8f0a,     /*    11          */
+    0x8f0a,     /*    1          */
+    0x7f0a,     /*  0000 000          */
+    0x7f0a,     /*  0000 00          */
+    0xf70a,     /*  0000            */
+    0xf70a,     /*  0000 00          */
+    0x6f0a,     /*  0000 010          */
+    0x6f0a,     /*  0000 01          */
+    0xf60a,     /*  0000 011          */
+    0xf60a,     /*  0000 01          */
+    0xff08,     /*  0000 1            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0xff08,     /*  0000            */
+    0x5f0a,     /*  000 0000          */
+    0x5f0a,     /*  000 000          */
+    0xf50a,     /*  000 0           */
+    0xf50a,     /*  000 000          */
+    0x4f09,     /*  000             */
+    0x4f09,     /*  000 00          */
+    0x4f09,     /*  000 00          */
+    0x4f09,     /*  000 00          */
+    0xf409,     /*  000 010           */
+    0xf409,     /*  000 01           */
+    0xf409,     /*  000 01           */
+    0xf409,     /*  000 01           */
+    0xf309,     /*  000 011           */
+    0xf309,     /*  000 01          */
+    0xf309,     /*  000 01          */
+    0xf309,     /*  000 01          */
+    0xf009,     /*  000 100           */
+    0xf009,     /*  000 10           */
+    0xf009,     /*  000 10           */
+    0xf009,     /*  000 10           */
+    0x3f0a,
+    0x3f0a
+};
+
+
+
+const uint16 huffTable_24[478] =
+{
+
+    0x2206,     /*  101               */
+    0x1205,     /*  10101               */
+    0x1205,     /*  1010               */
+    0x2105,     /*  10110               */
+    0x2105,     /*  1011               */
+    0x0206,     /*  101110              */
+    0x2006,     /*  101111              */
+    0x1104,
+    0x1104,
+    0x1104,
+    0x1104,
+    0x0104,
+    0x0104,
+    0x0104,
+    0x0104,
+    0x1004,
+    0x1004,
+    0x1004,
+    0x1004,
+    0x0004,
+    0x0004,
+    0x0004,
+    0x0004,
+    0x7308,
+    0x7308,
+    0x3709,
+    0x2709,
+    0x7208,
+    0x7208,
+    0x4608,     /*  01110000            */
+    0x4608,     /*  0111000            */
+    0x6408,     /*  01110             */
+    0x6408,     /*  0111000            */
+    0x5508,     /*  0111 0            */
+    0x5508,     /*  0111             */
+    0x7108,     /*  0111 1            */
+    0x7108,     /*  0111             */
+    0x3608,     /*  01110100            */
+    0x3608,     /*  0111010            */
+    0x6308,     /*  01110101            */
+    0x6308,     /*  0111010            */
+    0x4508,     /*  01110110            */
+    0x4508,     /*  0111011            */
+    0x5408,     /*  01110111            */
+    0x5408,     /*  0111011            */
+    0x2608,     /*  01111000            */
+    0x2608,     /*  0111100            */
+    0x6208,     /*  01111             */
+    0x6208,     /*  0111100            */
+    0x1608,     /*  01111010            */
+    0x1608,     /*  0111101            */
+    0x6108,     /*  01111011            */
+    0x6108,     /*  0111101            */
+    0x0609,     /*  011111000           */
+    0x6009,     /*  011111            */
+    0x3508,     /*  01111101            */
+    0x3508,     /*  0111110            */
+    0x5308,     /*  01111110            */
+    0x5308,     /*  0111111            */
+    0x4408,     /*  01111111            */
+    0x4408,     /*  0111111            */
+    0x2508,     /*  10000000            */
+    0x2508,     /*  1000000            */
+    0x5208,     /*  10000             */
+    0x5208,     /*  1000000            */
+    0x1508,     /*  1000 0            */
+    0x1508,     /*  1000             */
+    0x0509,     /*  1000 10           */
+    0x5009,     /*  1000 11           */
+    0x5107,     /*  100 0             */
+    0x5107,     /*  100              */
+    0x5107,     /*  100              */
+    0x5107,     /*  100              */
+    0x3408,     /*  100 10            */
+    0x3408,     /*  100 1            */
+    0x4308,     /*  100 11            */
+    0x4308,     /*  100 1            */
+    0x2407,     /*  10 00             */
+    0x2407,     /*  10 0             */
+    0x2407,     /*  10 0             */
+    0x2407,     /*  10 0             */
+    0x4207,     /*  10 01             */
+    0x4207,     /*  10 0            */
+    0x4207,     /*  10 0            */
+    0x4207,     /*  10 0            */
+    0x3307,     /*  10 10             */
+    0x3307,     /*  10 1             */
+    0x3307,     /*  10 1             */
+    0x3307,     /*  10 1             */
+    0x1407,     /*  10 11             */
+    0x1407,     /*  10 1            */
+    0x1407,     /*  10 1            */
+    0x1407,     /*  10 1            */
+    0x4107,     /*  1 000             */
+    0x4107,     /*  1 00             */
+    0x4107,     /*  1 00             */
+    0x4107,     /*  1 00             */
+    0x0408,     /*  1  0            */
+    0x0408,     /*  1              */
+    0x4008,     /*  1  1            */
+    0x4008,     /*  1              */
+    0x2307,     /*  1 010             */
+    0x2307,     /*  1 01             */
+    0x2307,     /*  1 01             */
+    0x2307,     /*  1 01             */
+    0x3207,     /*  1 011             */
+    0x3207,     /*  1 01            */
+    0x3207,     /*  1 01            */
+    0x3207,     /*  1 01            */
+    0x1306,     /*  1 10              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x1306,     /*  1 1              */
+    0x3106,     /*  1 11              */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x3106,     /*  1 1             */
+    0x0307,     /*  1010000             */
+    0x0307,     /*  101000             */
+    0x0307,     /*  101000             */
+    0x0307,     /*  101000             */
+    0x3007,     /*  1010              */
+    0x3007,     /*  101000            */
+    0x3007,     /*  101000            */
+    0x3007,     /*  101000            */
+    0xb309,
+    0xb309,
+    0x8809,     /*  010101            */
+    0x8809,     /*  01010100           */
+    0x2b0a,     /*  0101010100          */
+    0x5a0a,     /*  0101010101          */
+    0xb209,     /*  010101011           */
+    0xb209,     /*  01010101           */
+    0xa50a,     /*  0101011000          */
+    0x1b0a,     /*  0101011           */
+    0xb10a,     /*  0101011010          */
+    0x690a,     /*  0101011011          */
+    0x9609,     /*  010101110           */
+    0x9609,     /*  01010111           */
+    0xa409,     /*  010101111           */
+    0xa409,     /*  01010111           */
+    0x4a0a,     /*  0101100000          */
+    0x780a,     /*  0101100           */
+    0x8709,     /*  010110            */
+    0x8709,     /*  01011000           */
+    0x3a09,     /*  01011 0           */
+    0x3a09,     /*  01011            */
+    0xa309,     /*  01011 1           */
+    0xa309,     /*  01011            */
+    0x5909,     /*  010110100           */
+    0x5909,     /*  01011010           */
+    0x9509,     /*  010110101           */
+    0x9509,     /*  01011010           */
+    0x2a09,     /*  010110110           */
+    0x2a09,     /*  01011011           */
+    0xa209,     /*  010110111           */
+    0xa209,     /*  01011011           */
+    0xa109,     /*  010111000           */
+    0xa109,     /*  01011100           */
+    0x6809,     /*  010111            */
+    0x6809,     /*  01011100           */
+    0x8609,     /*  010111010           */
+    0x8609,     /*  01011101           */
+    0x7709,     /*  010111011           */
+    0x7709,     /*  01011101           */
+    0x4909,     /*  010111100           */
+    0x4909,     /*  01011110           */
+    0x9409,     /*  010111101           */
+    0x9409,     /*  01011110           */
+    0x3909,     /*  010111110           */
+    0x3909,     /*  01011111           */
+    0x9309,     /*  010111111           */
+    0x9309,     /*  01011111           */
+    0x5809,     /*  011000000           */
+    0x5809,     /*  01100000           */
+    0x8509,     /*  011000            */
+    0x8509,     /*  01100000           */
+    0x2909,     /*  01100 0           */
+    0x2909,     /*  01100            */
+    0x6709,     /*  01100 1           */
+    0x6709,     /*  01100            */
+    0x7609,     /*  0110 00           */
+    0x7609,     /*  0110 0           */
+    0x9209,     /*  0110 01           */
+    0x9209,     /*  0110 0           */
+    0x1909,     /*  0110 10           */
+    0x1909,     /*  0110 1           */
+    0x9109,     /*  0110 11           */
+    0x9109,     /*  0110 1           */
+    0x4809,     /*  011 000           */
+    0x4809,     /*  011 00           */
+    0x8409,     /*  011             */
+    0x8409,     /*  011 00           */
+    0x5709,     /*  011 010           */
+    0x5709,     /*  011 01           */
+    0x7509,     /*  011 011           */
+    0x7509,     /*  011 01           */
+    0x3809,     /*  011 100           */
+    0x3809,     /*  011 10           */
+    0x8309,     /*  011 101           */
+    0x8309,     /*  011 10           */
+    0x6609,     /*  011 110           */
+    0x6609,     /*  011 11           */
+    0x2809,     /*  011 111           */
+    0x2809,     /*  011 11           */
+    0x8209,     /*  011010000           */
+    0x8209,     /*  01101000           */
+    0x1809,     /*  011010            */
+    0x1809,     /*  01101000           */
+    0x4709,     /*  01101 0           */
+    0x4709,     /*  01101            */
+    0x7409,     /*  01101 1           */
+    0x7409,     /*  01101            */
+    0x8109,     /*  011010100           */
+    0x8109,     /*  01101010           */
+    0x080a,     /*  0110101010          */
+    0x800a,     /*  0110101011          */
+    0x5609,     /*  011010110           */
+    0x5609,     /*  01101011           */
+    0x6509,     /*  011010111           */
+    0x6509,     /*  01101011           */
+    0x1709,     /*  011011000           */
+    0x1709,     /*  01101100           */
+    0x070a,     /*  011011 0          */
+    0x700a,     /*  011011 1          */
+    0x6e0b,
+    0x9c0b,
+    0xc90a,     /*  01000 01          */
+    0xc90a,     /*  01000 0          */
+    0x5e0a,     /*  01000 10          */
+    0x5e0a,     /*  01000 1          */
+    0xba0a,     /*  01000 11          */
+    0xba0a,     /*  01000 1          */
+    0xe50a,     /*  0100 000          */
+    0xe50a,     /*  0100 00          */
+    0xab0b,     /*  0100  0         */
+    0x7d0b,     /*  0100  1         */
+    0xd70a,     /*  0100 010          */
+    0xd70a,     /*  0100 01          */
+    0xe40a,     /*  0100 011          */
+    0xe40a,     /*  0100 01          */
+    0x8c0a,     /*  0100 100          */
+    0x8c0a,
+    0xc80a,
+    0xc80a,
+    0x4e0b,     /*  0100 1100         */
+    0x2e0b,     /*  0100 1101         */
+    0x3e0a,     /*  0100 111          */
+    0x3e0a,     /*  0100 11          */
+    0x6d0a,     /*  010 0000          */
+    0x6d0a,     /*  010 000          */
+    0xd60a,     /*  010 0           */
+    0xd60a,     /*  010 000          */
+    0xe30a,     /*  010  0          */
+    0xe30a,     /*  010            */
+    0x9b0a,     /*  010  1          */
+    0x9b0a,     /*  010            */
+    0xb90a,     /*  010 0100          */
+    0xb90a,     /*  010 010          */
+    0xaa0a,     /*  010 0101          */
+    0xaa0a,
+    0xe20a,
+    0xe20a,
+    0x1e0a,
+    0x1e0a,
+    0xe10a,
+    0xe10a,
+    0x5d0a,
+    0x5d0a,
+    0xd50a,
+    0xd50a,
+    0x7c0a,
+    0x7c0a,
+    0xc70a,
+    0xc70a,
+    0x4d0a,
+    0x4d0a,
+    0x8b0a,
+    0x8b0a,
+    0xb80a,
+    0xb80a,
+    0xd40a,
+    0xd40a,
+    0x9a0a,
+    0x9a0a,
+    0xa90a,     /*  01 0 0          */
+    0xa90a,     /*  01 0           */
+    0x6c0a,     /*  01 0 1          */
+    0x6c0a,     /*  01 0           */
+    0xc60a,     /*  01  00          */
+    0xc60a,     /*  01  0          */
+    0x3d0a,     /*  01  01          */
+    0x3d0a,     /*  01  0          */
+    0xd30a,     /*  01  10          */
+    0xd30a,     /*  01  1          */
+    0x2d0a,     /*  01  11          */
+    0x2d0a,     /*  01  1          */
+    0xd20a,
+    0xd20a,
+    0x1d0a,     /*  01 01           */
+    0x1d0a,     /*  01 0100          */
+    0x7b0a,     /*  01 01010          */
+    0x7b0a,     /*  01 0101          */
+    0xb70a,     /*  01 01011          */
+    0xb70a,
+    0xd10a,
+    0xd10a,     /*  01 0110          */
+    0x5c0a,     /*  01 01101          */
+    0x5c0a,     /*  01 0110          */
+    0xc50a,     /*  01 01110          */
+    0xc50a,     /*  01 0111          */
+    0x8a0a,     /*  01 01111          */
+    0x8a0a,     /*  01 0111          */
+    0xa80a,     /*  01 10000          */
+    0xa80a,     /*  01 1000          */
+    0x990a,     /*  01 10           */
+    0x990a,     /*  01 1000          */
+    0x4c0a,     /*  01 1 0          */
+    0x4c0a,     /*  01 1           */
+    0xc40a,     /*  01 1 1          */
+    0xc40a,     /*  01 1           */
+    0x6b0a,     /*  01 10100          */
+    0x6b0a,     /*  01 1010          */
+    0xb60a,     /*  01 10101          */
+    0xb60a,     /*  01 1010          */
+    0xd00b,     /*  01 101100         */
+    0x0c0b,     /*  01 101101         */
+    0x3c0a,     /*  01 10111          */
+    0x3c0a,     /*  01 1011          */
+    0xc30a,     /*  01 11000          */
+    0xc30a,     /*  01 1100          */
+    0x7a0a,     /*  01 11           */
+    0x7a0a,     /*  01 1100          */
+    0xa70a,     /*  01 11010          */
+    0xa70a,     /*  01 1101          */
+    0x2c0a,     /*  01 11011          */
+    0x2c0a,     /*  01 1101          */
+    0xc20a,     /*  01 11100          */
+    0xc20a,     /*  01 1110          */
+    0x5b0a,     /*  01 11101          */
+    0x5b0a,     /*  01 1110          */
+    0xb50a,     /*  01 11110          */
+    0xb50a,     /*  01 1111          */
+    0x1c0a,
+    0x1c0a,
+    0x890a,
+    0x890a,
+    0x980a,
+    0x980a,
+    0xc10a,     /*  010100 0          */
+    0xc10a,     /*  010100           */
+    0x4b0a,     /*  010100 1          */
+    0x4b0a,     /*  010100           */
+    0xc00b,     /*  01010 000         */
+    0x0b0b,     /*  01010           */
+    0x3b0a,     /*  01010 01          */
+    0x3b0a,     /*  01010 0          */
+    0xb00b,     /*  01010 100         */
+    0x0a0b,     /*  01010 101         */
+    0x1a0a,     /*  01010 11          */
+    0x1a0a,     /*  01010 1          */
+    0xb409,     /*  0101 00           */
+    0xb409,     /*  0101 0           */
+    0xb409,     /*  0101 0           */
+    0xb409,     /*  0101 0           */
+    0x6a0a,     /*  0101 010          */
+    0x6a0a,     /*  0101 01          */
+    0xa60a,     /*  0101 011          */
+    0xa60a,     /*  0101 01          */
+    0x790a,     /*  0101 100          */
+    0x790a,     /*  0101 10          */
+    0x970a,     /*  0101 101          */
+    0x970a,     /*  0101 10          */
+    0xa00b,     /*  0101 1100         */
+    0x090b,     /*  0101 1101         */
+    0x900a,     /*  0101 111          */
+    0x900a,     /*  0101 11          */
+    0xca0b,
+    0xca0b,
+    0xbb0b,
+    0xbb0b,
+    0x8d0b,
+    0x8d0b,     /*  0100000          */
+    0xd80b,     /*  0100000 1         */
+    0xd80b,     /*  0100000          */
+    0x0e0c,     /*  010000 000        */
+    0xe00c,     /*  010000          */
+    0x0d0b,     /*  010000 01         */
+    0x0d0b,     /*  010000 0         */
+    0xe60a,     /*  010000 1          */
+    0xe60a,     /*  010000          */
+    0xe60a,     /*  010000          */
+    0xe60a,     /*  010000          */
+    0x0f09,     /*   011000      401  */
+    0x0f09,     /*   01100           */
+    0x0f09,     /*   01100           */
+    0x0f09,     /*   01100           */
+    0xee0b,     /*   011 00         */
+    0xde0b,     /*   011 01         */
+    0xed0b,     /*   011 10         */
+    0xce0b,     /*   011 11         */
+    0xec0b,     /*   01101000         */
+    0xdd0b,     /*   01101          */
+    0xbe0b,     /*   01101010         */
+    0xeb0b,     /*   01101011         */
+    0xcd0b,     /*   01101100         */
+    0xdc0b,     /*   01101101         */
+    0xae0b,     /*   01101110         */
+    0xea0b,     /*   01101111         */
+    0xbd0b,     /*   01110000         */
+    0xdb0b,     /*   01110          */
+    0xcc0b,     /*   0111 0         */
+    0x9e0b,     /*   0111 1         */
+    0xe90b,     /*   01110100         */
+    0xad0b,     /*   01110101         */
+    0xda0b,     /*   01110110         */
+    0xbc0b,     /*   01110111         */
+    0xcb0b,     /*   01111000         */
+    0x8e0b,
+    0xe80b,
+    0x9d0b,
+    0xd90b,
+    0x7e0b,
+    0xe70b,
+    0xac0b,
+    0xff04,
+    0xef08,
+    0xfe08,
+    0xdf08,     /*  0000 0            */
+    0xfd08,     /*  0000 1            */
+    0xcf08,     /*  000 00            */
+    0xfc08,     /*  000 01            */
+    0xbf08,     /*  000 10            */
+    0xfb08,     /*  000 11            */
+    0xfa07,     /*  00 00             */
+    0xfa07,     /*  00 0             */
+    0xaf08,     /*  00 010            */
+    0x9f08,     /*  00 011            */
+    0xf907,     /*  00 10             */
+    0xf907,     /*  00 1             */
+    0xf807,     /*  00 11             */
+    0xf807,     /*  00 1             */
+    0x8f08,
+    0x7f08,     /*  0 0             */
+    0xf707,     /*  0               */
+    0xf707,     /*  0 00             */
+    0x6f07,     /*  0 010             */
+    0x6f07,     /*  0 01             */
+    0xf607,     /*  0 011             */
+    0xf607,     /*  0 01             */
+    0x5f07,
+    0x5f07,     /*  0 10             */
+    0xf507,     /*  0 101             */
+    0xf507,     /*  0 10             */
+    0x4f07,     /*  0 110             */
+    0x4f07,     /*  0 11             */
+    0xf407,     /*  0 111             */
+    0xf407,     /*  0 11             */
+    0x3f07,
+    0x3f07,
+    0xf307,     /*   0              */
+    0xf307,
+    0x2f07,     /*    0             */
+    0x2f07,     /*                 */
+    0xf207,     /*    1             */
+    0xf207,     /*                 */
+    0xf107,
+    0xf107,
+    0x1f08,
+    0xf008
+
+};
+
+
+const uint16 huffTable_32[33] =
+{
+
+    0x0b06,
+    0x0f06,
+    0x0d06,
+    0x0e06,
+    0x0706,
+    0x0506,
+    0x0905,
+    0x0905,
+    0x0605,
+    0x0605,
+    0x0305,
+    0x0305,
+    0x0a05,
+    0x0a05,
+    0x0c05,
+    0x0c05,
+    0x0204,
+    0x0204,
+    0x0204,
+    0x0204,
+    0x0104,
+    0x0104,
+    0x0104,
+    0x0104,
+    0x0404,
+    0x0404,
+    0x0404,
+    0x0404,
+    0x0804,
+    0x0804,
+    0x0804,
+    0x0804,
+    0x0001
+
+};
+
+
+/*
+ *  MM = 512; z = [0:(MM)]; a = z.^(1/3);
+ *  Table is in Q27
+ */
+const int32  power_one_third[513] =
+{
+
+    0x00000000,  0x08000000,  0x0A14517D,  0x0B89BA25,
+    0x0CB2FF53,  0x0DAE07DE,  0x0E897685,  0x0F4DAEDD,
+    0x10000000,  0x10A402FD,  0x113C4841,  0x11CAB613,
+    0x1250BFE2,  0x12CF8890,  0x1347F8AB,  0x13BACD65,
+    0x1428A2FA,  0x1491FC15,  0x14F74744,  0x1558E2F7,
+    0x15B72095,  0x161246D7,  0x166A9399,  0x16C03D55,
+    0x17137449,  0x17646369,  0x17B33124,  0x18000000,
+    0x184AEF29,  0x18941AD8,  0x18DB9CB7,  0x19218C2E,
+    0x1965FEA5,  0x19A907C2,  0x19EAB998,  0x1A2B24D0,
+    0x1A6A58D5,  0x1AA863EE,  0x1AE5535D,  0x1B213377,
+    0x1B5C0FBD,  0x1B95F2EC,  0x1BCEE70F,  0x1C06F590,
+    0x1C3E2745,  0x1C74847A,  0x1CAA1501,  0x1CDEE035,
+    0x1D12ED0B,  0x1D464212,  0x1D78E582,  0x1DAADD3A,
+    0x1DDC2ECF,  0x1E0CDF8C,  0x1E3CF476,  0x1E6C7257,
+    0x1E9B5DBA,  0x1EC9BAF6,  0x1EF78E2C,  0x1F24DB4E,
+    0x1F51A620,  0x1F7DF23C,  0x1FA9C314,  0x1FD51BF2,
+    0x20000000,  0x202A7244,  0x205475A6,  0x207E0CEE,
+    0x20A73ACA,  0x20D001CC,  0x20F8646D,  0x2120650E,
+    0x214805FA,  0x216F4963,  0x2196316C,  0x21BCC020,
+    0x21E2F77A,  0x2208D961,  0x222E67AD,  0x2253A425,
+    0x22789082,  0x229D2E6E,  0x22C17F82,  0x22E5854F,
+    0x23094155,  0x232CB509,  0x234FE1D5,  0x2372C918,
+    0x23956C26,  0x23B7CC47,  0x23D9EABB,  0x23FBC8B9,
+    0x241D676E,  0x243EC7FF,  0x245FEB86,  0x2480D319,
+    0x24A17FC3,  0x24C1F28B,  0x24E22C6C,  0x25022E5F,
+    0x2521F954,  0x25418E33,  0x2560EDE2,  0x2580193E,
+    0x259F111F,  0x25BDD657,  0x25DC69B4,  0x25FACBFE,
+    0x2618FDF8,  0x26370060,  0x2654D3EF,  0x2672795C,
+    0x268FF156,  0x26AD3C8A,  0x26CA5BA2,  0x26E74F41,
+    0x27041808,  0x2720B695,  0x273D2B81,  0x27597762,
+    0x27759ACB,  0x2791964B,  0x27AD6A6F,  0x27C917C0,
+    0x27E49EC5,  0x28000000,  0x281B3BF3,  0x2836531B,
+    0x285145F3,  0x286C14F5,  0x2886C096,  0x28A1494B,
+    0x28BBAF85,  0x28D5F3B3,  0x28F01641,  0x290A179B,
+    0x2923F82A,  0x293DB854,  0x2957587E,  0x2970D90A,
+    0x298A3A59,  0x29A37CCA,  0x29BCA0BB,  0x29D5A687,
+    0x29EE8E87,  0x2A075914,  0x2A200684,  0x2A38972C,
+    0x2A510B5F,  0x2A696370,  0x2A819FAE,  0x2A99C069,
+    0x2AB1C5ED,  0x2AC9B088,  0x2AE18085,  0x2AF9362C,
+    0x2B10D1C6,  0x2B28539B,  0x2B3FBBEF,  0x2B570B09,
+    0x2B6E412B,  0x2B855E97,  0x2B9C6390,  0x2BB35056,
+    0x2BCA2527,  0x2BE0E242,  0x2BF787E4,  0x2C0E1649,
+    0x2C248DAD,  0x2C3AEE4A,  0x2C513859,  0x2C676C13,
+    0x2C7D89AF,  0x2C939164,  0x2CA98368,  0x2CBF5FF1,
+    0x2CD52731,  0x2CEAD95E,  0x2D0076A9,  0x2D15FF45,
+    0x2D2B7363,  0x2D40D332,  0x2D561EE4,  0x2D6B56A7,
+    0x2D807AAA,  0x2D958B19,  0x2DAA8823,  0x2DBF71F4,
+    0x2DD448B7,  0x2DE90C98,  0x2DFDBDC0,  0x2E125C5C,
+    0x2E26E892,  0x2E3B628D,  0x2E4FCA75,  0x2E642070,
+    0x2E7864A8,  0x2E8C9741,  0x2EA0B862,  0x2EB4C831,
+    0x2EC8C6D3,  0x2EDCB46C,  0x2EF09121,  0x2F045D14,
+    0x2F18186A,  0x2F2BC345,  0x2F3F5DC7,  0x2F52E812,
+    0x2F666247,  0x2F79CC88,  0x2F8D26F4,  0x2FA071AC,
+    0x2FB3ACD0,  0x2FC6D87F,  0x2FD9F4D7,  0x2FED01F8,
+    0x30000000,  0x3012EF0C,  0x3025CF39,  0x3038A0A6,
+    0x304B636D,  0x305E17AD,  0x3070BD81,  0x30835504,
+    0x3095DE51,  0x30A85985,  0x30BAC6B9,  0x30CD2609,
+    0x30DF778D,  0x30F1BB60,  0x3103F19C,  0x31161A59,
+    0x312835B0,  0x313A43BA,  0x314C4490,  0x315E3849,
+    0x31701EFD,  0x3181F8C4,  0x3193C5B4,  0x31A585E6,
+    0x31B7396F,  0x31C8E066,  0x31DA7AE1,  0x31EC08F6,
+    0x31FD8ABC,  0x320F0047,  0x322069AC,  0x3231C702,
+    0x3243185C,  0x32545DCF,  0x32659770,  0x3276C552,
+    0x3287E78A,  0x3298FE2C,  0x32AA094A,  0x32BB08F9,
+    0x32CBFD4A,  0x32DCE652,  0x32EDC423,  0x32FE96D0,
+    0x330F5E6A,  0x33201B04,  0x3330CCB0,  0x33417380,
+    0x33520F85,  0x3362A0D0,  0x33732774,  0x3383A380,
+    0x33941506,  0x33A47C17,  0x33B4D8C4,  0x33C52B1B,
+    0x33D5732F,  0x33E5B10F,  0x33F5E4CA,  0x34060E71,
+    0x34162E14,  0x342643C1,  0x34364F88,  0x34465178,
+    0x345649A1,  0x34663810,  0x34761CD6,  0x3485F800,
+    0x3495C99D,  0x34A591BB,  0x34B55069,  0x34C505B4,
+    0x34D4B1AB,  0x34E4545B,  0x34F3EDD2,  0x35037E1D,
+    0x3513054B,  0x35228367,  0x3531F881,  0x354164A3,
+    0x3550C7DC,  0x35602239,  0x356F73C5,  0x357EBC8E,
+    0x358DFCA0,  0x359D3408,  0x35AC62D1,  0x35BB8908,
+    0x35CAA6B9,  0x35D9BBF0,  0x35E8C8B9,  0x35F7CD20,
+    0x3606C92F,  0x3615BCF3,  0x3624A878,  0x36338BC8,
+    0x364266EE,  0x365139F6,  0x366004EC,  0x366EC7D9,
+    0x367D82C9,  0x368C35C6,  0x369AE0DC,  0x36A98414,
+    0x36B81F7A,  0x36C6B317,  0x36D53EF7,  0x36E3C323,
+    0x36F23FA5,  0x3700B488,  0x370F21D5,  0x371D8797,
+    0x372BE5D7,  0x373A3CA0,  0x37488BF9,  0x3756D3EF,
+    0x37651489,  0x37734DD1,  0x37817FD1,  0x378FAA92,
+    0x379DCE1D,  0x37ABEA7C,  0x37B9FFB7,  0x37C80DD7,
+    0x37D614E6,  0x37E414EC,  0x37F20DF1,  0x38000000,
+    0x380DEB20,  0x381BCF5A,  0x3829ACB6,  0x3837833D,
+    0x384552F8,  0x38531BEE,  0x3860DE28,  0x386E99AF,
+    0x387C4E89,  0x3889FCC0,  0x3897A45B,  0x38A54563,
+    0x38B2DFDF,  0x38C073D7,  0x38CE0152,  0x38DB885A,
+    0x38E908F4,  0x38F68329,  0x3903F701,  0x39116483,
+    0x391ECBB6,  0x392C2CA1,  0x3939874D,  0x3946DBC0,
+    0x39542A01,  0x39617218,  0x396EB40C,  0x397BEFE4,
+    0x398925A7,  0x3996555C,  0x39A37F09,  0x39B0A2B7,
+    0x39BDC06A,  0x39CAD82B,  0x39D7EA01,  0x39E4F5F0,
+    0x39F1FC01,  0x39FEFC3A,  0x3A0BF6A2,  0x3A18EB3E,
+    0x3A25DA16,  0x3A32C32F,  0x3A3FA691,  0x3A4C8441,
+    0x3A595C46,  0x3A662EA6,  0x3A72FB67,  0x3A7FC28F,
+    0x3A8C8425,  0x3A99402E,  0x3AA5F6B1,  0x3AB2A7B3,
+    0x3ABF533A,  0x3ACBF94D,  0x3AD899F1,  0x3AE5352C,
+    0x3AF1CB03,  0x3AFE5B7D,  0x3B0AE6A0,  0x3B176C70,
+    0x3B23ECF3,  0x3B306830,  0x3B3CDE2C,  0x3B494EEB,
+    0x3B55BA74,  0x3B6220CC,  0x3B6E81F9,  0x3B7ADE00,
+    0x3B8734E5,  0x3B9386B0,  0x3B9FD364,  0x3BAC1B07,
+    0x3BB85D9E,  0x3BC49B2F,  0x3BD0D3BE,  0x3BDD0751,
+    0x3BE935ED,  0x3BF55F97,  0x3C018453,  0x3C0DA427,
+    0x3C19BF17,  0x3C25D52A,  0x3C31E662,  0x3C3DF2C6,
+    0x3C49FA5B,  0x3C55FD24,  0x3C61FB27,  0x3C6DF468,
+    0x3C79E8ED,  0x3C85D8B9,  0x3C91C3D2,  0x3C9DAA3C,
+    0x3CA98BFC,  0x3CB56915,  0x3CC1418E,  0x3CCD156A,
+    0x3CD8E4AE,  0x3CE4AF5E,  0x3CF0757F,  0x3CFC3714,
+    0x3D07F423,  0x3D13ACB0,  0x3D1F60BF,  0x3D2B1055,
+    0x3D36BB75,  0x3D426224,  0x3D4E0466,  0x3D59A23F,
+    0x3D653BB4,  0x3D70D0C8,  0x3D7C6180,  0x3D87EDE0,
+    0x3D9375EC,  0x3D9EF9A8,  0x3DAA7918,  0x3DB5F43F,
+    0x3DC16B23,  0x3DCCDDC7,  0x3DD84C2E,  0x3DE3B65D,
+    0x3DEF1C58,  0x3DFA7E22,  0x3E05DBC0,  0x3E113535,
+    0x3E1C8A85,  0x3E27DBB3,  0x3E3328C4,  0x3E3E71BB,
+    0x3E49B69C,  0x3E54F76B,  0x3E60342B,  0x3E6B6CE0,
+    0x3E76A18D,  0x3E81D237,  0x3E8CFEE0,  0x3E98278D,
+    0x3EA34C40,  0x3EAE6CFE,  0x3EB989CA,  0x3EC4A2A8,
+    0x3ECFB79A,  0x3EDAC8A5,  0x3EE5D5CB,  0x3EF0DF10,
+    0x3EFBE478,  0x3F06E606,  0x3F11E3BE,  0x3F1CDDA2,
+    0x3F27D3B6,  0x3F32C5FD,  0x3F3DB47B,  0x3F489F32,
+    0x3F538627,  0x3F5E695C,  0x3F6948D5,  0x3F742494,
+    0x3F7EFC9D,  0x3F89D0F3,  0x3F94A19A,  0x3F9F6E94,
+    0x3FAA37E4,  0x3FB4FD8E,  0x3FBFBF94,  0x3FCA7DFB,
+    0x3FD538C4,  0x3FDFEFF3,  0x3FEAA38A,  0x3FF5538E,
+    0x40000000
+};
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.h b/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.h
new file mode 100644
index 0000000..b54c5bf
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/pvmp3_tables.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.
+ * -------------------------------------------------------------------
+ */
+/*
+   Filename: pvmp3_tables.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+------------------------------------------------------------------------------
+*/
+
+#ifndef PVMP3_TABLES_H
+#define PVMP3_TABLES_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+
+#include "pvmp3_dec_defs.h"
+#include "pv_mp3_huffman.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES AND SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+#define Qfmt_28(a) (int32(double(0x10000000)*a))
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+typedef struct
+{
+    int16 l[23];
+    int16 s[14];
+} mp3_scaleFactorBandIndex;
+
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    extern const int32    mp3_s_freq[4][4];
+    extern const int32    inv_sfreq[4];
+    extern const int16    mp3_bitrate[3][15];
+    extern const int32    power_one_third[513];
+
+    extern const  mp3_scaleFactorBandIndex mp3_sfBandIndex[9];
+    extern const int32 mp3_shortwindBandWidths[9][13];
+    extern const int32 pqmfSynthWin[(HAN_SIZE/2) + 8];
+
+
+    extern const uint16 huffTable_1[];
+    extern const uint16 huffTable_2[];
+    extern const uint16 huffTable_3[];
+    extern const uint16 huffTable_5[];
+    extern const uint16 huffTable_6[];
+    extern const uint16 huffTable_7[];
+    extern const uint16 huffTable_8[];
+    extern const uint16 huffTable_9[];
+    extern const uint16 huffTable_10[];
+    extern const uint16 huffTable_11[];
+    extern const uint16 huffTable_12[];
+    extern const uint16 huffTable_13[];
+    extern const uint16 huffTable_15[];
+    extern const uint16 huffTable_16[];
+    extern const uint16 huffTable_24[];
+    extern const uint16 huffTable_32[];
+    extern const uint16 huffTable_33[];
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
diff --git a/media/libstagefright/codecs/mp3dec/src/s_huffcodetab.h b/media/libstagefright/codecs/mp3dec/src/s_huffcodetab.h
new file mode 100644
index 0000000..874943d
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/s_huffcodetab.h
@@ -0,0 +1,98 @@
+/* ------------------------------------------------------------------
+ * Copyright (C) 1998-2009 PacketVideo
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: s_huffcodetab.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+
+------------------------------------------------------------------------------
+ REFERENCES
+
+ [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
+     ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
+
+----------------------------------------------------------------------------*/
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef  S_HUFFCODETAB_H
+#define  S_HUFFCODETAB_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+
+/*----------------------------------------------------------------------------
+; MACROS
+; Define module specific macros here
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; DEFINES
+; Include all pre-processor statements here.
+----------------------------------------------------------------------------*/
+#define HUFF_TBL    34
+
+/*----------------------------------------------------------------------------
+; EXTERNAL VARIABLES REFERENCES
+; Declare variables used in this module but defined elsewhere
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; SIMPLE TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; ENUMERATED TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; STRUCTURES TYPEDEF'S
+----------------------------------------------------------------------------*/
+
+struct huffcodetab
+{
+    uint32 linbits;                  /*number of linbits  */
+    uint16(*pdec_huff_tab)(tmp3Bits *);
+};
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/s_mp3bits.h b/media/libstagefright/codecs/mp3dec/src/s_mp3bits.h
new file mode 100644
index 0000000..b905b9a
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/s_mp3bits.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: s_mp3bits.h
+
+   Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, BITS
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef  S_MP3BITS_H
+#define  S_MP3BITS_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.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
+----------------------------------------------------------------------------*/
+/*
+ * Name: BITS
+ * Description: Holds information for processing the input data buffer
+ *    as a "stream". The data is in packed format.
+ * Fields:
+ *    pBuffer - pointer to the beginning of the buffer. If the data type of
+ *        this changes, make sure to update the constants in ibstream.h
+ *    usedBits - number of bits read thus far from the buffer. Bit 0 is
+ *        the LSB of pBuffer[0].
+ */
+
+
+typedef struct
+{
+    uint8       *pBuffer;
+    uint32      usedBits;
+    uint32      inputBufferCurrentLength;
+    uint32      offset;
+} tmp3Bits;
+
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+#endif
+
diff --git a/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_chan.h b/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_chan.h
new file mode 100644
index 0000000..6eb8835
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_chan.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: s_tmp3dec_chan.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, tmp3dec_chan.
+ This structure contains information per channel that needs to persist
+ between calls
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TMP3DEC_CHAN_H
+#define S_TMP3DEC_CHAN_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "pvmp3_audio_type_defs.h"
+#include "pvmp3_dec_defs.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    typedef struct
+    {
+        int32  used_freq_lines;
+        int32  overlap[SUBBANDS_NUMBER*FILTERBANK_BANDS];
+        int32  work_buf_int32[SUBBANDS_NUMBER*FILTERBANK_BANDS]; /* working buffer */
+        int32  circ_buffer[480 + 576];
+
+    } tmp3dec_chan;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
diff --git a/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_file.h b/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_file.h
new file mode 100644
index 0000000..805cedb
--- /dev/null
+++ b/media/libstagefright/codecs/mp3dec/src/s_tmp3dec_file.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.
+ * -------------------------------------------------------------------
+ */
+/*
+------------------------------------------------------------------------------
+   PacketVideo Corp.
+   MP3 Decoder Library
+
+   Filename: s_tmp3dec_file.h
+
+     Date: 09/21/2007
+
+------------------------------------------------------------------------------
+ REVISION HISTORY
+
+ Description:
+
+------------------------------------------------------------------------------
+ INCLUDE DESCRIPTION
+
+ This include file defines the structure, tmp3dec_file.
+ This structure contains information that needs to persist between calls
+
+------------------------------------------------------------------------------
+*/
+
+/*----------------------------------------------------------------------------
+; CONTINUE ONLY IF NOT ALREADY DEFINED
+----------------------------------------------------------------------------*/
+#ifndef S_TMP3DEC_FILE_H
+#define S_TMP3DEC_FILE_H
+
+/*----------------------------------------------------------------------------
+; INCLUDES
+----------------------------------------------------------------------------*/
+#include "s_tmp3dec_chan.h"
+#include "s_mp3bits.h"
+#include "s_huffcodetab.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
+----------------------------------------------------------------------------*/
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    typedef struct
+    {
+        int32           num_channels;
+        int32           predicted_frame_size;
+        int32           frame_start;
+        int32           Scratch_mem[168];
+        tmp3dec_chan    perChan[CHAN];
+        mp3ScaleFactors scaleFactors[CHAN];
+        mp3SideInfo     sideInfo;
+        tmp3Bits        mainDataStream;
+        uint8           mainDataBuffer[BUFSIZE];
+        tmp3Bits        inputStream;
+        huffcodetab     ht[HUFF_TBL];
+    } tmp3dec_file;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/*----------------------------------------------------------------------------
+; GLOBAL FUNCTION DEFINITIONS
+; Function Prototype declaration
+----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+; END
+----------------------------------------------------------------------------*/
+
+#endif
+
+
+
+
diff --git a/media/libstagefright/include/AACDecoder.h b/media/libstagefright/include/AACDecoder.h
new file mode 100644
index 0000000..303d854
--- /dev/null
+++ b/media/libstagefright/include/AACDecoder.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 AAC_DECODER_H_
+
+#define AAC_DECODER_H_
+
+#include <media/stagefright/MediaSource.h>
+
+struct tPVMP4AudioDecoderExternal;
+
+namespace android {
+
+struct MediaBufferGroup;
+
+struct AACDecoder : public MediaSource {
+    AACDecoder(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 ~AACDecoder();
+
+private:
+    sp<MediaSource> mSource;
+    bool mStarted;
+
+    MediaBufferGroup *mBufferGroup;
+
+    tPVMP4AudioDecoderExternal *mConfig;
+    void *mDecoderBuf;
+    int64_t mLastSeekTimeUs;
+    int64_t mNumSamplesOutput;
+
+    MediaBuffer *mInputBuffer;
+
+    AACDecoder(const AACDecoder &);
+    AACDecoder &operator=(const AACDecoder &);
+};
+
+}  // namespace android
+
+#endif  // AAC_DECODER_H_
diff --git a/media/libstagefright/include/MP3Decoder.h b/media/libstagefright/include/MP3Decoder.h
new file mode 100644
index 0000000..88aa4c6
--- /dev/null
+++ b/media/libstagefright/include/MP3Decoder.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 MP3_DECODER_H_
+
+#define MP3_DECODER_H_
+
+#include <media/stagefright/MediaSource.h>
+
+struct tPVMP3DecoderExternal;
+
+namespace android {
+
+struct MediaBufferGroup;
+
+struct MP3Decoder : public MediaSource {
+    MP3Decoder(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 ~MP3Decoder();
+
+private:
+    sp<MediaSource> mSource;
+    bool mStarted;
+
+    MediaBufferGroup *mBufferGroup;
+
+    tPVMP3DecoderExternal *mConfig;
+    void *mDecoderBuf;
+    int64_t mAnchorTimeUs;
+    int64_t mNumSamplesOutput;
+
+    MediaBuffer *mInputBuffer;
+
+    MP3Decoder(const MP3Decoder &);
+    MP3Decoder &operator=(const MP3Decoder &);
+};
+
+}  // namespace android
+
+#endif  // MP3_DECODER_H_
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h
index 09a8816..19d3940 100644
--- a/media/libstagefright/include/OMXNodeInstance.h
+++ b/media/libstagefright/include/OMXNodeInstance.h
@@ -26,6 +26,7 @@
 namespace android {
 
 class IOMXObserver;
+struct OMXMaster;
 
 struct OMXNodeInstance {
     OMXNodeInstance(
@@ -37,7 +38,7 @@
     sp<IOMXObserver> observer();
     OMX::node_id nodeID();
 
-    status_t freeNode();
+    status_t freeNode(OMXMaster *master);
 
     status_t sendCommand(OMX_COMMANDTYPE cmd, OMX_S32 param);
     status_t getParameter(OMX_INDEXTYPE index, void *params, size_t size);
@@ -72,7 +73,7 @@
             const char *parameterName, OMX_INDEXTYPE *index);
 
     void onMessage(const omx_message &msg);
-    void onObserverDied();
+    void onObserverDied(OMXMaster *master);
     void onGetHandleFailed();
 
     static OMX_CALLBACKTYPE kCallbacks;
diff --git a/media/libstagefright/omx/Android.mk b/media/libstagefright/omx/Android.mk
index de2e1ac..7dfab11 100644
--- a/media/libstagefright/omx/Android.mk
+++ b/media/libstagefright/omx/Android.mk
@@ -36,9 +36,6 @@
         libopencore_common
 endif
 
-LOCAL_STATIC_LIBRARIES :=       \
-        libstagefright_mp3
-
 ifeq ($(TARGET_OS)-$(TARGET_SIMULATOR),linux-true)
         LOCAL_LDLIBS += -lpthread -ldl
 endif
@@ -52,5 +49,3 @@
 LOCAL_MODULE:= libstagefright_omx
 
 include $(BUILD_SHARED_LIBRARY)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp
index 9f93c31..61be8f7 100644
--- a/media/libstagefright/omx/OMX.cpp
+++ b/media/libstagefright/omx/OMX.cpp
@@ -205,7 +205,7 @@
         invalidateNodeID_l(instance->nodeID());
     }
 
-    instance->onObserverDied();
+    instance->onObserverDied(mMaster);
 }
 
 status_t OMX::listNodes(List<String8> *list) {
@@ -262,7 +262,7 @@
     mLiveNodes.removeItemsAt(index);
     instance->observer()->asBinder()->unlinkToDeath(this);
 
-    return instance->freeNode();
+    return instance->freeNode(mMaster);
 }
 
 status_t OMX::sendCommand(
diff --git a/media/libstagefright/omx/OMXMaster.cpp b/media/libstagefright/omx/OMXMaster.cpp
index 838a9f7..12302f3 100644
--- a/media/libstagefright/omx/OMXMaster.cpp
+++ b/media/libstagefright/omx/OMXMaster.cpp
@@ -60,7 +60,9 @@
         (CreateOMXPluginFunc)dlsym(
                 mVendorLibHandle, "_ZN7android15createOMXPluginEv");
 
-    addPlugin((*createOMXPlugin)());
+    if (createOMXPlugin) {
+        addPlugin((*createOMXPlugin)());
+    }
 }
 
 void OMXMaster::addPlugin(OMXPluginBase *plugin) {
@@ -118,7 +120,32 @@
     }
 
     OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
-    return plugin->makeComponentInstance(name, callbacks, appData, component);
+    OMX_ERRORTYPE err =
+        plugin->makeComponentInstance(name, callbacks, appData, component);
+
+    if (err != OMX_ErrorNone) {
+        return err;
+    }
+
+    mPluginByInstance.add(*component, plugin);
+
+    return err;
+}
+
+OMX_ERRORTYPE OMXMaster::destroyComponentInstance(
+        OMX_COMPONENTTYPE *component) {
+    Mutex::Autolock autoLock(mLock);
+
+    ssize_t index = mPluginByInstance.indexOfKey(component);
+
+    if (index < 0) {
+        return OMX_ErrorBadParameter;
+    }
+
+    OMXPluginBase *plugin = mPluginByInstance.valueAt(index);
+    mPluginByInstance.removeItemsAt(index);
+
+    return plugin->destroyComponentInstance(component);
 }
 
 OMX_ERRORTYPE OMXMaster::enumerateComponents(
diff --git a/media/libstagefright/omx/OMXMaster.h b/media/libstagefright/omx/OMXMaster.h
index 63cd664..e944c4a 100644
--- a/media/libstagefright/omx/OMXMaster.h
+++ b/media/libstagefright/omx/OMXMaster.h
@@ -37,6 +37,9 @@
             OMX_PTR appData,
             OMX_COMPONENTTYPE **component);
 
+    virtual OMX_ERRORTYPE destroyComponentInstance(
+            OMX_COMPONENTTYPE *component);
+
     virtual OMX_ERRORTYPE enumerateComponents(
             OMX_STRING name,
             size_t size,
@@ -46,6 +49,8 @@
     Mutex mLock;
     List<OMXPluginBase *> mPlugins;
     KeyedVector<String8, OMXPluginBase *> mPluginByComponentName;
+    KeyedVector<OMX_COMPONENTTYPE *, OMXPluginBase *> mPluginByInstance;
+
     void *mVendorLibHandle;
 
     void addVendorPlugin();
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp
index 099139a..288710e 100644
--- a/media/libstagefright/omx/OMXNodeInstance.cpp
+++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -19,6 +19,7 @@
 #include <utils/Log.h>
 
 #include "../include/OMXNodeInstance.h"
+#include "OMXMaster.h"
 
 #include <OMX_Component.h>
 
@@ -106,7 +107,7 @@
     return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR;
 }
 
-status_t OMXNodeInstance::freeNode() {
+status_t OMXNodeInstance::freeNode(OMXMaster *master) {
     // Transition the node from its current state all the way down
     // to "Loaded".
     // This ensures that all active buffers are properly freed even
@@ -157,8 +158,9 @@
             break;
     }
 
-    OMX_ERRORTYPE err =
-        (*static_cast<OMX_COMPONENTTYPE *>(mHandle)->ComponentDeInit)(mHandle);
+    OMX_ERRORTYPE err = master->destroyComponentInstance(
+            static_cast<OMX_COMPONENTTYPE *>(mHandle));
+
     mHandle = NULL;
 
     if (err != OMX_ErrorNone) {
@@ -384,11 +386,11 @@
     mObserver->onMessage(msg);
 }
 
-void OMXNodeInstance::onObserverDied() {
+void OMXNodeInstance::onObserverDied(OMXMaster *master) {
     LOGE("!!! Observer died. Quickly, do something, ... anything...");
 
     // Try to force shutdown of the node and hope for the best.
-    freeNode();
+    freeNode(master);
 }
 
 void OMXNodeInstance::onGetHandleFailed() {
diff --git a/media/libstagefright/omx/OMXPVCodecsPlugin.cpp b/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
index 3957901..2bd8094 100644
--- a/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
+++ b/media/libstagefright/omx/OMXPVCodecsPlugin.cpp
@@ -35,20 +35,16 @@
         const OMX_CALLBACKTYPE *callbacks,
         OMX_PTR appData,
         OMX_COMPONENTTYPE **component) {
-    OMX_ERRORTYPE err = OMX_MasterGetHandle(
+    return OMX_MasterGetHandle(
             reinterpret_cast<OMX_HANDLETYPE *>(component),
             const_cast<char *>(name),
             appData,
             const_cast<OMX_CALLBACKTYPE *>(callbacks));
+}
 
-    if (err != OMX_ErrorNone) {
-        return err;
-    }
-
-    // PV is not even filling this in...
-    (*component)->ComponentDeInit = &OMX_MasterFreeHandle;
-
-    return OMX_ErrorNone;
+OMX_ERRORTYPE OMXPVCodecsPlugin::destroyComponentInstance(
+        OMX_COMPONENTTYPE *component) {
+    return OMX_MasterFreeHandle(component);
 }
 
 OMX_ERRORTYPE OMXPVCodecsPlugin::enumerateComponents(
diff --git a/media/libstagefright/omx/OMXPVCodecsPlugin.h b/media/libstagefright/omx/OMXPVCodecsPlugin.h
index 55ca87a..f32eede 100644
--- a/media/libstagefright/omx/OMXPVCodecsPlugin.h
+++ b/media/libstagefright/omx/OMXPVCodecsPlugin.h
@@ -32,6 +32,9 @@
             OMX_PTR appData,
             OMX_COMPONENTTYPE **component);
 
+    virtual OMX_ERRORTYPE destroyComponentInstance(
+            OMX_COMPONENTTYPE *component);
+
     virtual OMX_ERRORTYPE enumerateComponents(
             OMX_STRING name,
             size_t size,
diff --git a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
index 22f58cc..51c7029 100644
--- a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
+++ b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.cpp
@@ -16,7 +16,7 @@
 
 #include "OMXSoftwareCodecsPlugin.h"
 
-#include "mp3dec/MP3Decoder.h"
+#include <string.h>
 
 namespace android {
 
@@ -24,20 +24,10 @@
         const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData,
         OMX_COMPONENTTYPE **component);
 
-static OMX_ERRORTYPE MakeMP3Decoder(
-        const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData,
-        OMX_COMPONENTTYPE **component) {
-    *component = OMXComponentBase::MakeComponent(
-            new MP3Decoder(callbacks, appData));
-
-    return OMX_ErrorNone;
-}
-
 static const struct ComponentInfo {
     const char *mName;
     ComponentFactory mFactory;
 } kComponentInfos[] = {
-    { "OMX.google.mp3dec", MakeMP3Decoder }
 };
 
 OMXSoftwareCodecsPlugin::OMXSoftwareCodecsPlugin() {
@@ -63,6 +53,11 @@
     return OMX_ErrorInvalidComponentName;
 }
 
+OMX_ERRORTYPE OMXSoftwareCodecsPlugin::destroyComponentInstance(
+        OMX_COMPONENTTYPE *component) {
+    return (*component->ComponentDeInit)(component);
+}
+
 OMX_ERRORTYPE OMXSoftwareCodecsPlugin::enumerateComponents(
         OMX_STRING name,
         size_t size,
diff --git a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
index dcb5b19..5beeb26 100644
--- a/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
+++ b/media/libstagefright/omx/OMXSoftwareCodecsPlugin.h
@@ -31,6 +31,9 @@
             OMX_PTR appData,
             OMX_COMPONENTTYPE **component);
 
+    virtual OMX_ERRORTYPE destroyComponentInstance(
+            OMX_COMPONENTTYPE *component);
+
     virtual OMX_ERRORTYPE enumerateComponents(
             OMX_STRING name,
             size_t size,
diff --git a/media/libstagefright/omx/mp3dec/Android.mk b/media/libstagefright/omx/mp3dec/Android.mk
deleted file mode 100644
index cd8b1f2..0000000
--- a/media/libstagefright/omx/mp3dec/Android.mk
+++ /dev/null
@@ -1,16 +0,0 @@
-LOCAL_PATH:= $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES:= \
-    MP3Decoder.cpp
-
-LOCAL_C_INCLUDES:= \
-        $(TOP)/external/opencore/extern_libs_v2/khronos/openmax/include
-
-LOCAL_SHARED_LIBRARIES:= \
-        libstagefright_omx   \
-        libutils
-
-LOCAL_MODULE:= libstagefright_mp3
-
-include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/omx/mp3dec/MP3Decoder.cpp b/media/libstagefright/omx/mp3dec/MP3Decoder.cpp
deleted file mode 100644
index 588973f..0000000
--- a/media/libstagefright/omx/mp3dec/MP3Decoder.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- * 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 "MP3Decoder.h"
-
-#include <media/stagefright/MediaDebug.h>
-
-namespace android {
-
-MP3Decoder::MP3Decoder(
-        const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData)
-    : OMXComponentBase(callbacks, appData),
-      mState(OMX_StateLoaded),
-      mTargetState(OMX_StateLoaded) {
-    initPort(kPortIndexInput);
-    initPort(kPortIndexOutput);
-}
-
-void MP3Decoder::initPort(OMX_U32 portIndex) {
-    mPorts[portIndex].mFlags = 0;
-
-    OMX_PARAM_PORTDEFINITIONTYPE *def = &mPorts[portIndex].mDefinition;
-
-    def->nSize = sizeof(*def);
-    def->nVersion.s.nVersionMajor = 1;
-    def->nVersion.s.nVersionMinor = 0;
-    def->nVersion.s.nRevision = 0;
-    def->nVersion.s.nStep = 0;
-    def->nPortIndex = portIndex;
-    def->eDir = (portIndex == kPortIndexInput) ? OMX_DirInput : OMX_DirOutput;
-    def->nBufferCountActual = 1;
-    def->nBufferCountMin = 1;
-    def->bEnabled = OMX_TRUE;
-    def->bPopulated = OMX_FALSE;
-    def->eDomain = OMX_PortDomainAudio;
-
-    OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def->format.audio;
-
-    if (portIndex == kPortIndexInput) {
-        def->nBufferSize = 8192;
-        strcpy(audioDef->cMIMEType, "audio/mpeg");
-        audioDef->pNativeRender = NULL;
-        audioDef->bFlagErrorConcealment = OMX_FALSE;
-        audioDef->eEncoding = OMX_AUDIO_CodingMP3;
-    } else {
-        CHECK_EQ(portIndex, kPortIndexOutput);
-
-        def->nBufferSize = 8192;
-        strcpy(audioDef->cMIMEType, "audio/raw");
-        audioDef->pNativeRender = NULL;
-        audioDef->bFlagErrorConcealment = OMX_FALSE;
-        audioDef->eEncoding = OMX_AUDIO_CodingPCM;
-    }
-
-    def->bBuffersContiguous = OMX_TRUE;  // XXX What's this?
-    def->nBufferAlignment = 1;
-}
-
-MP3Decoder::~MP3Decoder() {
-}
-
-OMX_ERRORTYPE MP3Decoder::sendCommand(
-        OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR cmdData) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::getParameter(
-        OMX_INDEXTYPE index, OMX_PTR params) {
-    switch (index) {
-        case OMX_IndexParamPortDefinition:
-        {
-            OMX_PARAM_PORTDEFINITIONTYPE *def =
-                (OMX_PARAM_PORTDEFINITIONTYPE *)params;
-
-            if (def->nSize < sizeof(OMX_PARAM_PORTDEFINITIONTYPE)) {
-                return OMX_ErrorBadParameter;
-            }
-
-            if (def->nPortIndex != kPortIndexInput
-                && def->nPortIndex != kPortIndexOutput) {
-                return OMX_ErrorBadPortIndex;
-            }
-
-            if (mPorts[def->nPortIndex].mDefinition.bEnabled
-                    && mState != OMX_StateLoaded) {
-                return OMX_ErrorIncorrectStateOperation;
-            }
-
-            memcpy(def, &mPorts[def->nPortIndex].mDefinition,
-                   sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
-
-            return OMX_ErrorNone;
-        }
-
-        default:
-            return OMX_ErrorUnsupportedIndex;
-    }
-}
-
-OMX_ERRORTYPE MP3Decoder::setParameter(
-        OMX_INDEXTYPE index, const OMX_PTR params) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::getConfig(
-        OMX_INDEXTYPE index, OMX_PTR config) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::setConfig(
-        OMX_INDEXTYPE index, const OMX_PTR config) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::getExtensionIndex(
-        const OMX_STRING name, OMX_INDEXTYPE *index) {
-    return OMX_ErrorUndefined;
-}
-
-bool MP3Decoder::portIsDisabledOrPopulated(OMX_U32 portIndex) const {
-    return !mPorts[portIndex].mDefinition.bEnabled
-        || mPorts[portIndex].mDefinition.bPopulated;
-}
-
-OMX_ERRORTYPE MP3Decoder::useOrAllocateBuffer(
-        OMX_BUFFERHEADERTYPE **out,
-        OMX_U32 portIndex,
-        OMX_PTR appPrivate,
-        OMX_U32 size,
-        OMX_U8 *buffer) {
-    if (portIndex != kPortIndexInput && portIndex != kPortIndexOutput) {
-        return OMX_ErrorBadPortIndex;
-    }
-
-    if (!mPorts[portIndex].mDefinition.bEnabled) {
-        if (!(mPorts[portIndex].mFlags & kPortFlagEnabling)) {
-            return OMX_ErrorIncorrectStateOperation;
-        }
-    } else if (mState != OMX_StateLoaded || mTargetState != OMX_StateIdle)  {
-        return OMX_ErrorIncorrectStateOperation;
-    }
-
-    if (size < mPorts[portIndex].mDefinition.nBufferSize) {
-        return OMX_ErrorBadParameter;
-    }
-
-    if (out == NULL) {
-        return OMX_ErrorBadParameter;
-    }
-
-    if (buffer == NULL) {
-        // We need to allocate memory.
-        buffer = new OMX_U8[size];
-
-        // XXX Keep track of buffers we allocated and free them later.
-    }
-
-    OMX_BUFFERHEADERTYPE *bufHdr = new OMX_BUFFERHEADERTYPE;
-    bufHdr->nSize = sizeof(*bufHdr);
-    bufHdr->nVersion.s.nVersionMajor = 1;
-    bufHdr->nVersion.s.nVersionMinor = 0;
-    bufHdr->nVersion.s.nRevision = 0;
-    bufHdr->nVersion.s.nStep = 0;
-    bufHdr->pBuffer = buffer;
-    bufHdr->nAllocLen = size;
-    bufHdr->nFilledLen = 0;
-    bufHdr->nOffset = 0;
-    bufHdr->pAppPrivate = appPrivate;
-    bufHdr->pPlatformPrivate = NULL;
-    bufHdr->pInputPortPrivate = NULL;
-    bufHdr->pOutputPortPrivate = NULL;
-    bufHdr->hMarkTargetComponent = NULL;
-    bufHdr->pMarkData = NULL;
-    bufHdr->nTickCount = 0;
-    bufHdr->nTimeStamp = 0;
-    bufHdr->nFlags = 0;
-    bufHdr->nOutputPortIndex = 0;
-    bufHdr->nInputPortIndex = 0;
-
-    mPorts[portIndex].mBuffers.push(bufHdr);
-
-    if (mPorts[portIndex].mBuffers.size()
-            == mPorts[portIndex].mDefinition.nBufferCountActual) {
-        if (mPorts[portIndex].mDefinition.bEnabled) {
-            mPorts[portIndex].mDefinition.bPopulated = OMX_TRUE;
-        } else if (mPorts[portIndex].mFlags & kPortFlagEnabling) {
-            mPorts[portIndex].mFlags &= ~kPortFlagEnabling;
-            mPorts[portIndex].mDefinition.bEnabled = OMX_TRUE;
-            mPorts[portIndex].mDefinition.bPopulated = OMX_TRUE;
-            postEvent(OMX_EventCmdComplete, OMX_CommandPortEnable, portIndex);
-        }
-    }
-
-    if (mState == OMX_StateLoaded
-        && portIsDisabledOrPopulated(kPortIndexInput)
-        && portIsDisabledOrPopulated(kPortIndexOutput)) {
-        mState = OMX_StateIdle;
-        postEvent(OMX_EventCmdComplete, OMX_CommandStateSet, mState);
-    }
-
-    *out = bufHdr;
-
-    return OMX_ErrorNone;
-}
-
-OMX_ERRORTYPE MP3Decoder::useBuffer(
-        OMX_BUFFERHEADERTYPE **out,
-        OMX_U32 portIndex,
-        OMX_PTR appPrivate,
-        OMX_U32 size,
-        OMX_U8 *buffer) {
-    if (buffer == NULL) {
-        return OMX_ErrorBadParameter;
-    }
-
-    return useOrAllocateBuffer(out, portIndex, appPrivate, size, buffer);
-}
-
-OMX_ERRORTYPE MP3Decoder::allocateBuffer(
-        OMX_BUFFERHEADERTYPE **out,
-        OMX_U32 portIndex,
-        OMX_PTR appPrivate,
-        OMX_U32 size) {
-    return useOrAllocateBuffer(out, portIndex, appPrivate, size, NULL);
-}
-
-OMX_ERRORTYPE MP3Decoder::freeBuffer(
-        OMX_U32 portIndex,
-        OMX_BUFFERHEADERTYPE *buffer) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::emptyThisBuffer(OMX_BUFFERHEADERTYPE *buffer) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::fillThisBuffer(OMX_BUFFERHEADERTYPE *buffer) {
-    return OMX_ErrorUndefined;
-}
-
-OMX_ERRORTYPE MP3Decoder::enumerateRoles(OMX_U8 *role, OMX_U32 index) {
-    return OMX_ErrorNoMore;
-}
-
-OMX_ERRORTYPE MP3Decoder::getState(OMX_STATETYPE *state) {
-    *state = mState;
-
-    return OMX_ErrorNone;
-}
-
-}  // namespace android
diff --git a/media/libstagefright/omx/mp3dec/MP3Decoder.h b/media/libstagefright/omx/mp3dec/MP3Decoder.h
deleted file mode 100644
index 555acce..0000000
--- a/media/libstagefright/omx/mp3dec/MP3Decoder.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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 MP3_DECODER_H_
-
-#define MP3_DECODER_H_
-
-#include "../OMXComponentBase.h"
-
-#include <OMX_Component.h>
-
-#include <utils/Vector.h>
-
-namespace android {
-
-struct MP3Decoder : public OMXComponentBase {
-    MP3Decoder(const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData);
-    virtual ~MP3Decoder();
-
-    virtual OMX_ERRORTYPE sendCommand(
-            OMX_COMMANDTYPE cmd, OMX_U32 param, OMX_PTR cmdData);
-
-    virtual OMX_ERRORTYPE getParameter(
-            OMX_INDEXTYPE index, OMX_PTR params);
-
-    virtual OMX_ERRORTYPE setParameter(
-            OMX_INDEXTYPE index, const OMX_PTR params);
-
-    virtual OMX_ERRORTYPE getConfig(
-            OMX_INDEXTYPE index, OMX_PTR config);
-
-    virtual OMX_ERRORTYPE setConfig(
-            OMX_INDEXTYPE index, const OMX_PTR config);
-
-    virtual OMX_ERRORTYPE getExtensionIndex(
-            const OMX_STRING name, OMX_INDEXTYPE *index);
-
-    virtual OMX_ERRORTYPE useBuffer(
-            OMX_BUFFERHEADERTYPE **bufHdr,
-            OMX_U32 portIndex,
-            OMX_PTR appPrivate,
-            OMX_U32 size,
-            OMX_U8 *buffer);
-
-    virtual OMX_ERRORTYPE allocateBuffer(
-            OMX_BUFFERHEADERTYPE **bufHdr,
-            OMX_U32 portIndex,
-            OMX_PTR appPrivate,
-            OMX_U32 size);
-
-    virtual OMX_ERRORTYPE freeBuffer(
-            OMX_U32 portIndex,
-            OMX_BUFFERHEADERTYPE *buffer);
-
-    virtual OMX_ERRORTYPE emptyThisBuffer(OMX_BUFFERHEADERTYPE *buffer);
-    virtual OMX_ERRORTYPE fillThisBuffer(OMX_BUFFERHEADERTYPE *buffer);
-
-    virtual OMX_ERRORTYPE enumerateRoles(OMX_U8 *role, OMX_U32 index);
-
-    virtual OMX_ERRORTYPE getState(OMX_STATETYPE *state);
-
-private:
-    enum {
-        kPortIndexInput  = 0,
-        kPortIndexOutput = 1,
-
-        kNumPorts
-    };
-
-    enum {
-        kPortFlagEnabling = 1
-    };
-
-    struct Port {
-        uint32_t mFlags;
-        Vector<OMX_BUFFERHEADERTYPE *> mBuffers;
-        OMX_PARAM_PORTDEFINITIONTYPE mDefinition;
-    };
-
-    OMX_STATETYPE mState;
-    OMX_STATETYPE mTargetState;
-
-    Port mPorts[kNumPorts];
-
-    void initPort(OMX_U32 portIndex);
-
-    bool portIsDisabledOrPopulated(OMX_U32 portIndex) const;
-
-    OMX_ERRORTYPE useOrAllocateBuffer(
-            OMX_BUFFERHEADERTYPE **out,
-            OMX_U32 portIndex,
-            OMX_PTR appPrivate,
-            OMX_U32 size,
-            OMX_U8 *buffer);
-
-    MP3Decoder(const MP3Decoder &);
-    MP3Decoder &operator=(const MP3Decoder &);
-};
-
-}  // namespace android
-
-#endif  // MP3_DECODER_H_
diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
index 6e3f5e3..4cdc06d 100644
--- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
+++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/performance/MediaPlayerPerformance.java
@@ -315,16 +315,19 @@
         mEndMemory = getMediaserverVsize();
         Log.v(TAG, "End Memory " + mEndMemory);
         output.write("End Memory :" + mEndMemory + "\n");
-        //Write the total memory different into the output file
-        output.write("The total diff = " + (mEndMemory - startMemory));
+        int memDiff = mEndMemory - startMemory;
+        if (memDiff < 0)
+            memDiff = 0;
+        else
+            output.write("The total diff = " + memDiff);
         output.write("\n\n");
-        //mediaserver crash
-        if (startPid != mEndPid){
+        // mediaserver crash
+        if (startPid != mEndPid) {
             output.write("mediaserver died. Test failed\n");
             return false;
         }
         //memory leak greter than the tolerant
-        if ((mEndMemory - startMemory) > MAX_ACCEPTED_MEMORY_LEAK_KB )
+        if (memDiff > MAX_ACCEPTED_MEMORY_LEAK_KB )
             return false;
         return true;
     }
@@ -345,13 +348,11 @@
         File h263MemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(h263MemoryOut, true));
         output.write("H263 Video Playback Only\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             mediaStressPlayback(MediaNames.VIDEO_HIGHRES_H263);
-            if (i == 0) {
-                mStartMemory = getMediaserverVsize();
-                output.write("Start memory : " + mStartMemory + "\n");
-                Log.v(TAG, "first mem : " + mStartMemory);
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
@@ -369,12 +370,11 @@
         File h264MemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(h264MemoryOut, true));
         output.write("H264 Video Playback only\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             mediaStressPlayback(MediaNames.VIDEO_H264_AMR);
-            if (i == 0) {
-              mStartMemory = getMediaserverVsize();
-              output.write("Start memory : " + mStartMemory + "\n");
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
@@ -392,12 +392,11 @@
             File wmvMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
             Writer output = new BufferedWriter(new FileWriter(wmvMemoryOut, true));
             output.write("WMV video playback only\n");
+            mStartMemory = getMediaserverVsize();
+            output.write("Start memory : " + mStartMemory + "\n");
+            Log.v(TAG, "first mem : " + mStartMemory);
             for (int i = 0; i < NUM_STRESS_LOOP; i++) {
                 mediaStressPlayback(MediaNames.VIDEO_WMV);
-                if (i == 0) {
-                    mStartMemory = getMediaserverVsize();
-                    output.write("Start memory : " + mStartMemory + "\n");
-                }
                 getMemoryWriteToLog(output);
             }
             output.write("\n");
@@ -416,13 +415,13 @@
         File videoH263RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(videoH263RecordOnlyMemoryOut, true));
         output.write("H263 video record only\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
+
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263,
                     MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true);
-            if (i == 0) {
-              mStartMemory = getMediaserverVsize();
-              output.write("Start memory : " + mStartMemory + "\n");
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
@@ -440,13 +439,13 @@
         File videoMp4RecordOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(videoMp4RecordOnlyMemoryOut, true));
         output.write("MPEG4 video record only\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
+
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.MPEG_4_SP,
                     MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, true);
-            if (i == 0) {
-              mStartMemory = getMediaserverVsize();
-              output.write("Start memory : " + mStartMemory + "\n");
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
@@ -465,13 +464,13 @@
         File videoRecordAudioMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(videoRecordAudioMemoryOut, true));
         output.write("Audio and h263 video record\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
+
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             stressVideoRecord(20, 352, 288, MediaRecorder.VideoEncoder.H263,
                     MediaRecorder.OutputFormat.MPEG_4, MediaNames.RECORDED_VIDEO_3GP, false);
-            if (i == 0) {
-              mStartMemory = getMediaserverVsize();
-              output.write("Start memory : " + mStartMemory + "\n");
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
@@ -489,12 +488,12 @@
         File audioOnlyMemoryOut = new File(MEDIA_MEMORY_OUTPUT);
         Writer output = new BufferedWriter(new FileWriter(audioOnlyMemoryOut, true));
         output.write("Audio record only\n");
+        mStartMemory = getMediaserverVsize();
+        output.write("Start memory : " + mStartMemory + "\n");
+        Log.v(TAG, "first mem : " + mStartMemory);
+
         for (int i = 0; i < NUM_STRESS_LOOP; i++) {
             stressAudioRecord(MediaNames.RECORDER_OUTPUT);
-            if (i == 0) {
-              mStartMemory = getMediaserverVsize();
-              output.write("Start memory : " + mStartMemory + "\n");
-            }
             getMemoryWriteToLog(output);
         }
         output.write("\n");
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 6beca2c..185398b 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -901,7 +901,7 @@
             */
             mEglContext = mEGLContextFactory.createContext(mEgl, mEglDisplay, mEglConfig);
             if (mEglContext == null || mEglContext == EGL10.EGL_NO_CONTEXT) {
-                throw new RuntimeException("createContext failed");
+                throwEglException("createContext");
             }
 
             mEglSurface = null;
diff --git a/opengl/java/com/google/android/gles_jni/EGLImpl.java b/opengl/java/com/google/android/gles_jni/EGLImpl.java
index a667e8d..3e06ded 100644
--- a/opengl/java/com/google/android/gles_jni/EGLImpl.java
+++ b/opengl/java/com/google/android/gles_jni/EGLImpl.java
@@ -2,16 +2,16 @@
 **
 ** Copyright 2006, 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 
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
 **
-**     http://www.apache.org/licenses/LICENSE-2.0 
+**     http://www.apache.org/licenses/LICENSE-2.0
 **
-** Unless required by applicable law or agreed to in writing, software 
-** distributed under the License is distributed on an "AS IS" BASIS, 
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-** See the License for the specific language governing permissions and 
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
 ** limitations under the License.
 */
 
@@ -30,11 +30,11 @@
     private EGLSurfaceImpl mSurface = new EGLSurfaceImpl(-1);
 
     public native boolean     eglInitialize(EGLDisplay display, int[] major_minor);
-    public native boolean     eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value);    
+    public native boolean     eglQueryContext(EGLDisplay display, EGLContext context, int attribute, int[] value);
     public native boolean     eglQuerySurface(EGLDisplay display, EGLSurface surface, int attribute, int[] value);
     public native boolean     eglChooseConfig(EGLDisplay display, int[] attrib_list, EGLConfig[] configs, int config_size, int[] num_config);
     public native boolean     eglGetConfigAttrib(EGLDisplay display, EGLConfig config, int attribute, int[] value);
-    public native boolean     eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config);    
+    public native boolean     eglGetConfigs(EGLDisplay display, EGLConfig[] configs, int config_size, int[] num_config);
     public native int         eglGetError();
     public native boolean     eglDestroyContext(EGLDisplay display, EGLContext context);
     public native boolean     eglDestroySurface(EGLDisplay display, EGLSurface surface);
@@ -47,16 +47,27 @@
     public native boolean     eglWaitNative(int engine, Object bindTarget);
 
     public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) {
-        return new EGLContextImpl( _eglCreateContext(display, config, share_context, attrib_list) );
+        int eglContextId = _eglCreateContext(display, config, share_context, attrib_list);
+        if (eglContextId == 0) {
+            return EGL10.EGL_NO_CONTEXT;
+        }
+        return new EGLContextImpl( eglContextId );
     }
 
     public EGLSurface eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list) {
-        return new EGLSurfaceImpl( _eglCreatePbufferSurface(display, config, attrib_list) );
+        int eglSurfaceId = _eglCreatePbufferSurface(display, config, attrib_list);
+        if (eglSurfaceId == 0) {
+            return EGL10.EGL_NO_SURFACE;
+        }
+        return new EGLSurfaceImpl( eglSurfaceId );
     }
-    
+
     public EGLSurface eglCreatePixmapSurface(EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list) {
         EGLSurfaceImpl sur = new EGLSurfaceImpl();
         _eglCreatePixmapSurface(sur, display, config, native_pixmap, attrib_list);
+        if (sur.mEGLSurface == 0) {
+            return EGL10.EGL_NO_SURFACE;
+        }
         return sur;
     }
 
@@ -73,11 +84,18 @@
                 "eglCreateWindowSurface() can only be called with an instance of " +
                 "SurfaceView or SurfaceHolder at the moment, this will be fixed later.");
         }
-        return new EGLSurfaceImpl( _eglCreateWindowSurface(display, config, sur, attrib_list) );
+        int eglSurfaceId = _eglCreateWindowSurface(display, config, sur, attrib_list);
+        if (eglSurfaceId == 0) {
+            return EGL10.EGL_NO_SURFACE;
+        }
+        return new EGLSurfaceImpl( eglSurfaceId );
     }
-    
+
     public synchronized EGLDisplay eglGetDisplay(Object native_display) {
         int value = _eglGetDisplay(native_display);
+        if (value == 0) {
+            return EGL10.EGL_NO_DISPLAY;
+        }
         if (mDisplay.mEGLDisplay != value)
             mDisplay = new EGLDisplayImpl(value);
         return mDisplay;
@@ -85,13 +103,19 @@
 
     public synchronized EGLContext eglGetCurrentContext() {
         int value = _eglGetCurrentContext();
+        if (value == 0) {
+            return EGL10.EGL_NO_CONTEXT;
+        }
         if (mContext.mEGLContext != value)
             mContext = new EGLContextImpl(value);
         return mContext;
     }
-    
+
     public synchronized EGLDisplay eglGetCurrentDisplay() {
         int value = _eglGetCurrentDisplay();
+        if (value == 0) {
+            return EGL10.EGL_NO_DISPLAY;
+        }
         if (mDisplay.mEGLDisplay != value)
             mDisplay = new EGLDisplayImpl(value);
         return mDisplay;
@@ -99,6 +123,9 @@
 
     public synchronized EGLSurface eglGetCurrentSurface(int readdraw) {
         int value = _eglGetCurrentSurface(readdraw);
+        if (value == 0) {
+            return EGL10.EGL_NO_SURFACE;
+        }
         if (mSurface.mEGLSurface != value)
             mSurface = new EGLSurfaceImpl(value);
         return mSurface;
@@ -107,7 +134,7 @@
     private native int _eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list);
     private native int _eglCreatePbufferSurface(EGLDisplay display, EGLConfig config, int[] attrib_list);
     private native void _eglCreatePixmapSurface(EGLSurface sur, EGLDisplay display, EGLConfig config, Object native_pixmap, int[] attrib_list);
-    private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);    
+    private native int _eglCreateWindowSurface(EGLDisplay display, EGLConfig config, Object native_window, int[] attrib_list);
     private native int _eglGetDisplay(Object native_display);
     private native int _eglGetCurrentContext();
     private native int _eglGetCurrentDisplay();
diff --git a/services/java/Android.mk b/services/java/Android.mk
index 5e912d6..934712c 100644
--- a/services/java/Android.mk
+++ b/services/java/Android.mk
@@ -5,7 +5,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := \
-            $(call all-subdir-java-files)
+            $(call all-subdir-java-files) \
+	    com/android/server/EventLogTags.logtags \
+	    com/android/server/am/EventLogTags.logtags
 
 LOCAL_MODULE:= services
 
diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java
index 1171416..ad0fb0c 100644
--- a/services/java/com/android/server/BackupManagerService.java
+++ b/services/java/com/android/server/BackupManagerService.java
@@ -99,22 +99,6 @@
     private static final int MSG_RUN_CLEAR = 4;
     private static final int MSG_RUN_INITIALIZE = 5;
 
-    // Event tags -- see system/core/logcat/event-log-tags
-    private static final int BACKUP_DATA_CHANGED_EVENT = 2820;
-    private static final int BACKUP_START_EVENT = 2821;
-    private static final int BACKUP_TRANSPORT_FAILURE_EVENT = 2822;
-    private static final int BACKUP_AGENT_FAILURE_EVENT = 2823;
-    private static final int BACKUP_PACKAGE_EVENT = 2824;
-    private static final int BACKUP_SUCCESS_EVENT = 2825;
-    private static final int BACKUP_RESET_EVENT = 2826;
-    private static final int BACKUP_INITIALIZE_EVENT = 2827;
-
-    private static final int RESTORE_START_EVENT = 2830;
-    private static final int RESTORE_TRANSPORT_FAILURE_EVENT = 2831;
-    private static final int RESTORE_AGENT_FAILURE_EVENT = 2832;
-    private static final int RESTORE_PACKAGE_EVENT = 2833;
-    private static final int RESTORE_SUCCESS_EVENT = 2834;
-
     // Timeout interval for deciding that a bind or clear-data has taken too long
     static final long TIMEOUT_INTERVAL = 10 * 1000;
 
@@ -1016,7 +1000,7 @@
             Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
 
             try {
-                EventLog.writeEvent(BACKUP_START_EVENT, mTransport.transportDirName());
+                EventLog.writeEvent(EventLogTags.BACKUP_START, mTransport.transportDirName());
 
                 // If we haven't stored package manager metadata yet, we must init the transport.
                 File pmState = new File(mStateDir, PACKAGE_MANAGER_SENTINEL);
@@ -1025,9 +1009,9 @@
                     resetBackupState(mStateDir);  // Just to make sure.
                     status = mTransport.initializeDevice();
                     if (status == BackupConstants.TRANSPORT_OK) {
-                        EventLog.writeEvent(BACKUP_INITIALIZE_EVENT);
+                        EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
                     } else {
-                        EventLog.writeEvent(BACKUP_TRANSPORT_FAILURE_EVENT, "(initialize)");
+                        EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
                         Log.e(TAG, "Transport error in initializeDevice()");
                     }
                 }
@@ -1056,9 +1040,9 @@
                     status = mTransport.finishBackup();
                     if (status == BackupConstants.TRANSPORT_OK) {
                         int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
-                        EventLog.writeEvent(BACKUP_SUCCESS_EVENT, mQueue.size(), millis);
+                        EventLog.writeEvent(EventLogTags.BACKUP_SUCCESS, mQueue.size(), millis);
                     } else {
-                        EventLog.writeEvent(BACKUP_TRANSPORT_FAILURE_EVENT, "(finish)");
+                        EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(finish)");
                         Log.e(TAG, "Transport error in finishBackup()");
                     }
                 }
@@ -1067,7 +1051,7 @@
                     // The backend reports that our dataset has been wiped.  We need to
                     // reset all of our bookkeeping and instead run a new backup pass for
                     // everything.  This must come after mBackupOrRestoreInProgress is cleared.
-                    EventLog.writeEvent(BACKUP_RESET_EVENT, mTransport.transportDirName());
+                    EventLog.writeEvent(EventLogTags.BACKUP_RESET, mTransport.transportDirName());
                     resetBackupState(mStateDir);
                 }
             } catch (Exception e) {
@@ -1201,7 +1185,7 @@
                 if (DEBUG) Log.v(TAG, "doBackup() success");
             } catch (Exception e) {
                 Log.e(TAG, "Error backing up " + packageName, e);
-                EventLog.writeEvent(BACKUP_AGENT_FAILURE_EVENT, packageName, e.toString());
+                EventLog.writeEvent(EventLogTags.BACKUP_AGENT_FAILURE, packageName, e.toString());
                 backupDataName.delete();
                 newStateName.delete();
                 return BackupConstants.TRANSPORT_ERROR;
@@ -1241,13 +1225,13 @@
                 if (result == BackupConstants.TRANSPORT_OK) {
                     backupDataName.delete();
                     newStateName.renameTo(savedStateName);
-                    EventLog.writeEvent(BACKUP_PACKAGE_EVENT, packageName, size);
+                    EventLog.writeEvent(EventLogTags.BACKUP_PACKAGE, packageName, size);
                 } else {
-                    EventLog.writeEvent(BACKUP_TRANSPORT_FAILURE_EVENT, packageName);
+                    EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
                 }
             } catch (Exception e) {
                 Log.e(TAG, "Transport error backing up " + packageName, e);
-                EventLog.writeEvent(BACKUP_TRANSPORT_FAILURE_EVENT, packageName);
+                EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, packageName);
                 result = BackupConstants.TRANSPORT_ERROR;
             } finally {
                 try { if (backupData != null) backupData.close(); } catch (IOException e) {}
@@ -1364,7 +1348,7 @@
             // build the set of apps to restore
             try {
                 // TODO: Log this before getAvailableRestoreSets, somehow
-                EventLog.writeEvent(RESTORE_START_EVENT, mTransport.transportDirName(), mToken);
+                EventLog.writeEvent(EventLogTags.RESTORE_START, mTransport.transportDirName(), mToken);
 
                 // Get the list of all packages which have backup enabled.
                 // (Include the Package Manager metadata pseudo-package first.)
@@ -1391,24 +1375,24 @@
                 if (mTransport.startRestore(mToken, restorePackages.toArray(new PackageInfo[0])) !=
                         BackupConstants.TRANSPORT_OK) {
                     Log.e(TAG, "Error starting restore operation");
-                    EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
+                    EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 }
 
                 String packageName = mTransport.nextRestorePackage();
                 if (packageName == null) {
                     Log.e(TAG, "Error getting first restore package");
-                    EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
+                    EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 } else if (packageName.equals("")) {
                     Log.i(TAG, "No restore data available");
                     int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
-                    EventLog.writeEvent(RESTORE_SUCCESS_EVENT, 0, millis);
+                    EventLog.writeEvent(EventLogTags.RESTORE_SUCCESS, 0, millis);
                     return;
                 } else if (!packageName.equals(PACKAGE_MANAGER_SENTINEL)) {
                     Log.e(TAG, "Expected restore data for \"" + PACKAGE_MANAGER_SENTINEL
                           + "\", found only \"" + packageName + "\"");
-                    EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, PACKAGE_MANAGER_SENTINEL,
+                    EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, PACKAGE_MANAGER_SENTINEL,
                             "Package manager data missing");
                     return;
                 }
@@ -1423,7 +1407,7 @@
                 // the restore operation.
                 if (!pmAgent.hasMetadata()) {
                     Log.e(TAG, "No restore metadata available, so not restoring settings");
-                    EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, PACKAGE_MANAGER_SENTINEL,
+                    EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, PACKAGE_MANAGER_SENTINEL,
                             "Package manager restore metadata missing");
                     return;
                 }
@@ -1434,7 +1418,7 @@
 
                     if (packageName == null) {
                         Log.e(TAG, "Error getting next restore package");
-                        EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
+                        EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                         return;
                     } else if (packageName.equals("")) {
                         break;
@@ -1452,7 +1436,7 @@
                     Metadata metaInfo = pmAgent.getRestoredMetadata(packageName);
                     if (metaInfo == null) {
                         Log.e(TAG, "Missing metadata for " + packageName);
-                        EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName,
+                        EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Package metadata missing");
                         continue;
                     }
@@ -1463,7 +1447,7 @@
                         packageInfo = mPackageManager.getPackageInfo(packageName, flags);
                     } catch (NameNotFoundException e) {
                         Log.e(TAG, "Invalid package restoring data", e);
-                        EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName,
+                        EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Package missing on device");
                         continue;
                     }
@@ -1472,13 +1456,13 @@
                         String message = "Version " + metaInfo.versionCode
                                 + " > installed version " + packageInfo.versionCode;
                         Log.w(TAG, "Package " + packageName + ": " + message);
-                        EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName, message);
+                        EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, message);
                         continue;
                     }
 
                     if (!signaturesMatch(metaInfo.signatures, packageInfo)) {
                         Log.w(TAG, "Signature mismatch restoring " + packageName);
-                        EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName,
+                        EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Signature mismatch");
                         continue;
                     }
@@ -1505,7 +1489,7 @@
                                     : IApplicationThread.BACKUP_MODE_RESTORE));
                     if (agent == null) {
                         Log.w(TAG, "Can't find backup agent for " + packageName);
-                        EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName,
+                        EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName,
                                 "Restore agent missing");
                         continue;
                     }
@@ -1536,7 +1520,7 @@
                 // if we get this far, report success to the observer
                 error = 0;
                 int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
-                EventLog.writeEvent(RESTORE_SUCCESS_EVENT, count, millis);
+                EventLog.writeEvent(EventLogTags.RESTORE_SUCCESS, count, millis);
             } catch (Exception e) {
                 Log.e(TAG, "Error in restore thread", e);
             } finally {
@@ -1594,7 +1578,7 @@
 
                 if (mTransport.getRestoreData(backupData) != BackupConstants.TRANSPORT_OK) {
                     Log.e(TAG, "Error getting restore data for " + packageName);
-                    EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
+                    EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                     return;
                 }
 
@@ -1627,10 +1611,10 @@
                 //newStateName.renameTo(savedStateName);    // TODO: replace with this
 
                 int size = (int) backupDataName.length();
-                EventLog.writeEvent(RESTORE_PACKAGE_EVENT, packageName, size);
+                EventLog.writeEvent(EventLogTags.RESTORE_PACKAGE, packageName, size);
             } catch (Exception e) {
                 Log.e(TAG, "Error restoring data for " + packageName, e);
-                EventLog.writeEvent(RESTORE_AGENT_FAILURE_EVENT, packageName, e.toString());
+                EventLog.writeEvent(EventLogTags.RESTORE_AGENT_FAILURE, packageName, e.toString());
 
                 // If the agent fails restore, it might have put the app's data
                 // into an incoherent state.  For consistency we wipe its data
@@ -1702,7 +1686,7 @@
                     }
 
                     Log.i(TAG, "Initializing (wiping) backup transport storage: " + transportName);
-                    EventLog.writeEvent(BACKUP_START_EVENT, transport.transportDirName());
+                    EventLog.writeEvent(EventLogTags.BACKUP_START, transport.transportDirName());
                     long startRealtime = SystemClock.elapsedRealtime();
                     int status = transport.initializeDevice();
 
@@ -1714,9 +1698,9 @@
                     if (status == BackupConstants.TRANSPORT_OK) {
                         Log.i(TAG, "Device init successful");
                         int millis = (int) (SystemClock.elapsedRealtime() - startRealtime);
-                        EventLog.writeEvent(BACKUP_INITIALIZE_EVENT);
+                        EventLog.writeEvent(EventLogTags.BACKUP_INITIALIZE);
                         resetBackupState(new File(mBaseStateDir, transport.transportDirName()));
-                        EventLog.writeEvent(BACKUP_SUCCESS_EVENT, 0, millis);
+                        EventLog.writeEvent(EventLogTags.BACKUP_SUCCESS, 0, millis);
                         synchronized (mQueueLock) {
                             recordInitPendingLocked(false, transportName);
                         }
@@ -1724,7 +1708,7 @@
                         // If this didn't work, requeue this one and try again
                         // after a suitable interval
                         Log.e(TAG, "Transport error in initializeDevice()");
-                        EventLog.writeEvent(BACKUP_TRANSPORT_FAILURE_EVENT, "(initialize)");
+                        EventLog.writeEvent(EventLogTags.BACKUP_TRANSPORT_FAILURE, "(initialize)");
                         synchronized (mQueueLock) {
                             recordInitPendingLocked(true, transportName);
                         }
@@ -1757,7 +1741,7 @@
         // Record that we need a backup pass for the caller.  Since multiple callers
         // may share a uid, we need to note all candidates within that uid and schedule
         // a backup pass for each of them.
-        EventLog.writeEvent(BACKUP_DATA_CHANGED_EVENT, packageName);
+        EventLog.writeEvent(EventLogTags.BACKUP_DATA_CHANGED, packageName);
 
         // If the caller does not hold the BACKUP permission, it can only request a
         // backup of its own data.
@@ -2103,7 +2087,7 @@
                 }
                 if (mRestoreSets == null) { // valid transport; do the one-time fetch
                     mRestoreSets = mRestoreTransport.getAvailableRestoreSets();
-                    if (mRestoreSets == null) EventLog.writeEvent(RESTORE_TRANSPORT_FAILURE_EVENT);
+                    if (mRestoreSets == null) EventLog.writeEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE);
                 }
                 return mRestoreSets;
             } catch (Exception e) {
diff --git a/services/java/com/android/server/BatteryService.java b/services/java/com/android/server/BatteryService.java
index bb36936..e98fa99 100644
--- a/services/java/com/android/server/BatteryService.java
+++ b/services/java/com/android/server/BatteryService.java
@@ -68,23 +68,19 @@
  */
 class BatteryService extends Binder {
     private static final String TAG = BatteryService.class.getSimpleName();
-    
+
     private static final boolean LOCAL_LOGV = false;
-    
-    static final int LOG_BATTERY_LEVEL = 2722;
-    static final int LOG_BATTERY_STATUS = 2723;
-    static final int LOG_BATTERY_DISCHARGE_STATUS = 2730;
-    
+
     static final int BATTERY_SCALE = 100;    // battery capacity is a percentage
 
     // Used locally for determining when to make a last ditch effort to log
     // discharge stats before the device dies.
-    private static final int CRITICAL_BATTERY_LEVEL = 4; 
+    private static final int CRITICAL_BATTERY_LEVEL = 4;
 
     private static final int DUMP_MAX_LENGTH = 24 * 1024;
     private static final String[] DUMPSYS_ARGS = new String[] { "--checkin", "-u" };
     private static final String BATTERY_STATS_SERVICE_NAME = "batteryinfo";
-    
+
     private static final String DUMPSYS_DATA_PATH = "/data/system/";
 
     // This should probably be exposed in the API, though it's not critical
@@ -92,7 +88,7 @@
 
     private final Context mContext;
     private final IBatteryStats mBatteryStats;
-    
+
     private boolean mAcOnline;
     private boolean mUsbOnline;
     private int mBatteryStatus;
@@ -117,12 +113,12 @@
 
     private int mPlugType;
     private int mLastPlugType = -1; // Extra state so we can detect first run
-    
+
     private long mDischargeStartTime;
     private int mDischargeStartLevel;
-    
+
     private boolean mSentLowBatteryBroadcast = false;
-    
+
     public BatteryService(Context context) {
         mContext = context;
         mBatteryStats = BatteryStatsService.getService();
@@ -219,20 +215,20 @@
                 mPlugType != mLastPlugType ||
                 mBatteryVoltage != mLastBatteryVoltage ||
                 mBatteryTemperature != mLastBatteryTemperature) {
-            
+
             if (mPlugType != mLastPlugType) {
                 if (mLastPlugType == BATTERY_PLUGGED_NONE) {
                     // discharging -> charging
-                    
+
                     // There's no value in this data unless we've discharged at least once and the
                     // battery level has changed; so don't log until it does.
                     if (mDischargeStartTime != 0 && mDischargeStartLevel != mBatteryLevel) {
                         dischargeDuration = SystemClock.elapsedRealtime() - mDischargeStartTime;
                         logOutlier = true;
-                        EventLog.writeEvent(LOG_BATTERY_DISCHARGE_STATUS, dischargeDuration,
+                        EventLog.writeEvent(EventLogTags.BATTERY_DISCHARGE, dischargeDuration,
                                 mDischargeStartLevel, mBatteryLevel);
                         // make sure we see a discharge event before logging again
-                        mDischargeStartTime = 0; 
+                        mDischargeStartTime = 0;
                     }
                 } else if (mPlugType == BATTERY_PLUGGED_NONE) {
                     // charging -> discharging or we just powered up
@@ -244,19 +240,19 @@
                     mBatteryHealth != mLastBatteryHealth ||
                     mBatteryPresent != mLastBatteryPresent ||
                     mPlugType != mLastPlugType) {
-                EventLog.writeEvent(LOG_BATTERY_STATUS,
+                EventLog.writeEvent(EventLogTags.BATTERY_STATUS,
                         mBatteryStatus, mBatteryHealth, mBatteryPresent ? 1 : 0,
                         mPlugType, mBatteryTechnology);
             }
             if (mBatteryLevel != mLastBatteryLevel ||
                     mBatteryVoltage != mLastBatteryVoltage ||
                     mBatteryTemperature != mLastBatteryTemperature) {
-                EventLog.writeEvent(LOG_BATTERY_LEVEL,
+                EventLog.writeEvent(EventLogTags.BATTERY_LEVEL,
                         mBatteryLevel, mBatteryVoltage, mBatteryTemperature);
             }
             if (mBatteryLevel != mLastBatteryLevel && mPlugType == BATTERY_PLUGGED_NONE) {
                 // If the battery level has changed and we are on battery, update the current level.
-                // This is used for discharge cycle tracking so this shouldn't be updated while the 
+                // This is used for discharge cycle tracking so this shouldn't be updated while the
                 // battery is charging.
                 try {
                     mBatteryStats.recordCurrentLevel(mBatteryLevel);
@@ -271,7 +267,7 @@
                 dischargeDuration = SystemClock.elapsedRealtime() - mDischargeStartTime;
                 logOutlier = true;
             }
-            
+
             final boolean plugged = mPlugType != BATTERY_PLUGGED_NONE;
             final boolean oldPlugged = mLastPlugType != BATTERY_PLUGGED_NONE;
 
@@ -285,9 +281,9 @@
                 && mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
                 && mBatteryLevel <= mLowBatteryWarningLevel
                 && (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel);
-            
+
             sendIntent();
-            
+
             // Separate broadcast is sent for power connected / not connected
             // since the standard intent will not wake any applications and some
             // applications may want to have smart behavior based on this.
@@ -311,12 +307,12 @@
                 statusIntent.setAction(Intent.ACTION_BATTERY_OKAY);
                 mContext.sendBroadcast(statusIntent);
             }
-            
+
             // This needs to be done after sendIntent() so that we get the lastest battery stats.
             if (logOutlier && dischargeDuration != 0) {
                 logOutlier(dischargeDuration);
             }
-            
+
             mLastBatteryStatus = mBatteryStatus;
             mLastBatteryHealth = mBatteryHealth;
             mLastBatteryPresent = mBatteryPresent;
@@ -337,7 +333,7 @@
         } catch (RemoteException e) {
             // Should never happen.
         }
-        
+
         int icon = getIcon(mBatteryLevel);
 
         intent.putExtra(BatteryManager.EXTRA_STATUS, mBatteryStatus);
@@ -353,8 +349,8 @@
 
         if (false) {
             Log.d(TAG, "updateBattery level:" + mBatteryLevel +
-                    " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus + 
-                    " health:" + mBatteryHealth +  " present:" + mBatteryPresent + 
+                    " scale:" + BATTERY_SCALE + " status:" + mBatteryStatus +
+                    " health:" + mBatteryHealth +  " present:" + mBatteryPresent +
                     " voltage: " + mBatteryVoltage +
                     " temperature: " + mBatteryTemperature +
                     " technology: " + mBatteryTechnology +
@@ -366,7 +362,7 @@
     }
 
     private final void logBatteryStats() {
-        
+
         IBinder batteryInfoService = ServiceManager.getService(BATTERY_STATS_SERVICE_NAME);
         if (batteryInfoService != null) {
             byte[] buffer = new byte[DUMP_MAX_LENGTH];
@@ -385,15 +381,15 @@
                 FileInputStream fileInputStream = new FileInputStream(dumpFile);
                 int nread = fileInputStream.read(buffer, 0, length);
                 if (nread > 0) {
-                    Checkin.logEvent(mContext.getContentResolver(), 
-                            Checkin.Events.Tag.BATTERY_DISCHARGE_INFO, 
+                    Checkin.logEvent(mContext.getContentResolver(),
+                            Checkin.Events.Tag.BATTERY_DISCHARGE_INFO,
                             new String(buffer, 0, nread));
-                    if (LOCAL_LOGV) Log.v(TAG, "dumped " + nread + "b from " + 
+                    if (LOCAL_LOGV) Log.v(TAG, "dumped " + nread + "b from " +
                             batteryInfoService + "to log");
                     if (LOCAL_LOGV) Log.v(TAG, "actual dump:" + new String(buffer, 0, nread));
                 }
             } catch (RemoteException e) {
-                Log.e(TAG, "failed to dump service '" + BATTERY_STATS_SERVICE_NAME + 
+                Log.e(TAG, "failed to dump service '" + BATTERY_STATS_SERVICE_NAME +
                         "':" + e);
             } catch (IOException e) {
                 Log.e(TAG, "failed to write dumpsys file: " +  e);
@@ -413,29 +409,29 @@
             }
         }
     }
-    
+
     private final void logOutlier(long duration) {
         ContentResolver cr = mContext.getContentResolver();
         String dischargeThresholdString = Settings.Gservices.getString(cr,
                 Settings.Gservices.BATTERY_DISCHARGE_THRESHOLD);
         String durationThresholdString = Settings.Gservices.getString(cr,
                 Settings.Gservices.BATTERY_DISCHARGE_DURATION_THRESHOLD);
-        
+
         if (dischargeThresholdString != null && durationThresholdString != null) {
             try {
                 long durationThreshold = Long.parseLong(durationThresholdString);
                 int dischargeThreshold = Integer.parseInt(dischargeThresholdString);
-                if (duration <= durationThreshold && 
+                if (duration <= durationThreshold &&
                         mDischargeStartLevel - mBatteryLevel >= dischargeThreshold) {
                     // If the discharge cycle is bad enough we want to know about it.
                     logBatteryStats();
                 }
-                if (LOCAL_LOGV) Log.v(TAG, "duration threshold: " + durationThreshold + 
+                if (LOCAL_LOGV) Log.v(TAG, "duration threshold: " + durationThreshold +
                         " discharge threshold: " + dischargeThreshold);
-                if (LOCAL_LOGV) Log.v(TAG, "duration: " + duration + " discharge: " + 
+                if (LOCAL_LOGV) Log.v(TAG, "duration: " + duration + " discharge: " +
                         (mDischargeStartLevel - mBatteryLevel));
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Invalid DischargeThresholds GService string: " + 
+                Log.e(TAG, "Invalid DischargeThresholds GService string: " +
                         durationThresholdString + " or " + dischargeThresholdString);
                 return;
             }
@@ -458,7 +454,7 @@
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                 != PackageManager.PERMISSION_GRANTED) {
-            
+
             pw.println("Permission Denial: can't dump Battery service from from pid="
                     + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid());
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java
index 16d8b7f..9980be7 100644
--- a/services/java/com/android/server/ConnectivityService.java
+++ b/services/java/com/android/server/ConnectivityService.java
@@ -56,9 +56,6 @@
     private static final boolean DBG = true;
     private static final String TAG = "ConnectivityService";
 
-    // Event log tags (must be in sync with event-log-tags)
-    private static final int EVENTLOG_CONNECTIVITY_STATE_CHANGED = 50020;
-
     // how long to wait before switching back to a radio's default network
     private static final int RESTORE_DEFAULT_NETWORK_DELAY = 1 * 60 * 1000;
     // system property that can override the above value
@@ -103,7 +100,7 @@
     private boolean mSystemReady;
     private ArrayList<Intent> mDeferredBroadcasts;
 
-    private class NetworkAttributes {
+    private static class NetworkAttributes {
         /**
          * Class for holding settings read from resources.
          */
@@ -111,12 +108,14 @@
         public int mType;
         public int mRadio;
         public int mPriority;
+        public NetworkInfo.State mLastState;
         public NetworkAttributes(String init) {
             String fragments[] = init.split(",");
             mName = fragments[0].toLowerCase();
             mType = Integer.parseInt(fragments[1]);
             mRadio = Integer.parseInt(fragments[2]);
             mPriority = Integer.parseInt(fragments[3]);
+            mLastState = NetworkInfo.State.UNKNOWN;
         }
         public boolean isDefault() {
             return (mType == mRadio);
@@ -125,7 +124,7 @@
     NetworkAttributes[] mNetAttributes;
     int mNetworksDefined;
 
-    private class RadioAttributes {
+    private static class RadioAttributes {
         public int mSimultaneity;
         public int mType;
         public RadioAttributes(String init) {
@@ -1221,9 +1220,22 @@
             switch (msg.what) {
                 case NetworkStateTracker.EVENT_STATE_CHANGED:
                     info = (NetworkInfo) msg.obj;
+                    int type = info.getType();
+                    NetworkInfo.State state = info.getState();
+                    if(mNetAttributes[type].mLastState == state) {
+                        if (DBG) {
+                            // TODO - remove this after we validate the dropping doesn't break anything
+                            Log.d(TAG, "Dropping ConnectivityChange for " +
+                                    info.getTypeName() +": " +
+                                    state + "/" + info.getDetailedState());
+                        }
+                        return;
+                    }
+                    mNetAttributes[type].mLastState = state;
+
                     if (DBG) Log.d(TAG, "ConnectivityChange for " +
                             info.getTypeName() + ": " +
-                            info.getState() + "/" + info.getDetailedState());
+                            state + "/" + info.getDetailedState());
 
                     // Connectivity state changed:
                     // [31-13] Reserved for future use
@@ -1235,16 +1247,15 @@
                     int eventLogParam = (info.getType() & 0x7) |
                             ((info.getDetailedState().ordinal() & 0x3f) << 3) |
                             (info.getSubtype() << 9);
-                    EventLog.writeEvent(EVENTLOG_CONNECTIVITY_STATE_CHANGED,
+                    EventLog.writeEvent(EventLogTags.CONNECTIVITY_STATE_CHANGED,
                             eventLogParam);
 
                     if (info.getDetailedState() ==
                             NetworkInfo.DetailedState.FAILED) {
                         handleConnectionFailure(info);
-                    } else if (info.getState() ==
-                            NetworkInfo.State.DISCONNECTED) {
+                    } else if (state == NetworkInfo.State.DISCONNECTED) {
                         handleDisconnect(info);
-                    } else if (info.getState() == NetworkInfo.State.SUSPENDED) {
+                    } else if (state == NetworkInfo.State.SUSPENDED) {
                         // TODO: need to think this over.
                         // the logic here is, handle SUSPENDED the same as
                         // DISCONNECTED. The only difference being we are
@@ -1253,7 +1264,7 @@
                         // opportunity to handle DISCONNECTED and SUSPENDED
                         // differently, or not.
                         handleDisconnect(info);
-                    } else if (info.getState() == NetworkInfo.State.CONNECTED) {
+                    } else if (state == NetworkInfo.State.CONNECTED) {
                         handleConnect(info);
                     }
                     break;
diff --git a/services/java/com/android/server/DeviceStorageMonitorService.java b/services/java/com/android/server/DeviceStorageMonitorService.java
index 57af029..8e54c6e 100644
--- a/services/java/com/android/server/DeviceStorageMonitorService.java
+++ b/services/java/com/android/server/DeviceStorageMonitorService.java
@@ -63,9 +63,6 @@
     private static final int LOW_MEMORY_NOTIFICATION_ID = 1;
     private static final int DEFAULT_THRESHOLD_PERCENTAGE = 10;
     private static final int DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES = 12*60; //in minutes
-    private static final int EVENT_LOG_STORAGE_BELOW_THRESHOLD = 2744;
-    private static final int EVENT_LOG_LOW_STORAGE_NOTIFICATION = 2745;
-    private static final int EVENT_LOG_FREE_STORAGE_LEFT = 2746;
     private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB
     private static final long DEFAULT_CHECK_INTERVAL = MONITOR_INTERVAL*60*1000;
     private long mFreeMem;  // on /data
@@ -159,7 +156,7 @@
                 // ignore; report -1
             }
             mCacheFileStats.restat(CACHE_PATH);
-            EventLog.writeEvent(EVENT_LOG_FREE_STORAGE_LEFT,
+            EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
                                 mFreeMem, mFreeSystem, mFreeCache);
         }
         // Read the reporting threshold from Gservices
@@ -170,7 +167,7 @@
         long delta = mFreeMem - mLastReportedFreeMem;
         if (delta > threshold || delta < -threshold) {
             mLastReportedFreeMem = mFreeMem;
-            EventLog.writeEvent(EVENT_LOG_STORAGE_BELOW_THRESHOLD, mFreeMem);
+            EventLog.writeEvent(EventLogTags.FREE_STORAGE_CHANGED, mFreeMem);
         }
     }
 
@@ -292,7 +289,7 @@
     private final void sendNotification() {
         if(localLOGV) Log.i(TAG, "Sending low memory notification");
         //log the event to event log with the amount of free storage(in bytes) left on the device
-        EventLog.writeEvent(EVENT_LOG_LOW_STORAGE_NOTIFICATION, mFreeMem);
+        EventLog.writeEvent(EventLogTags.LOW_STORAGE, mFreeMem);
         //  Pack up the values and broadcast them to everyone
         Intent lowMemIntent = new Intent(Intent.ACTION_MANAGE_PACKAGE_STORAGE);
         lowMemIntent.putExtra("memory", mFreeMem);
diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags
new file mode 100644
index 0000000..5429c0c
--- /dev/null
+++ b/services/java/com/android/server/EventLogTags.logtags
@@ -0,0 +1,139 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package com.android.server
+
+# ---------------------------
+# BatteryService.java
+# ---------------------------
+2722 battery_level (level|1|6),(voltage|1|1),(temperature|1|1)
+2723 battery_status (status|1|5),(health|1|5),(present|1|5),(plugged|1|5),(technology|3)
+# This is logged when battery goes from discharging to charging.
+# It lets us count the total amount of time between charges and the discharge level
+2730 battery_discharge (duration|2|3),(minLevel|1|6),(maxLevel|1|6)
+
+
+# ---------------------------
+# PowerManagerService.java
+# ---------------------------
+# This is logged when the device is being forced to sleep (typically by
+# the user pressing the power button).
+2724 power_sleep_requested (wakeLocksCleared|1|1)
+# This is logged when the screen on broadcast has completed
+2725 power_screen_broadcast_send (wakelockCount|1|1)
+# This is logged when the screen broadcast has completed
+2726 power_screen_broadcast_done (on|1|5),(broadcastDuration|2|3),(wakelockCount|1|1)
+# This is logged when the screen on broadcast has completed
+2727 power_screen_broadcast_stop (which|1|5),(wakelockCount|1|1)
+# This is logged when the screen is turned on or off.
+2728 power_screen_state (offOrOn|1|5),(becauseOfUser|1|5),(totalTouchDownTime|2|3),(touchCycles|1|1)
+# This is logged when the partial wake lock (keeping the device awake
+# regardless of whether the screen is off) is acquired or released.
+2729 power_partial_wake_state (releasedorAcquired|1|5),(tag|3)
+
+#
+# Leave IDs through 2739 for more power logs (2730 used by battery_discharge above)
+#
+
+
+# ---------------------------
+# DeviceStorageMonitoryService.java
+# ---------------------------
+# The disk space free on the /data partition, in bytes
+2744 free_storage_changed (data|2|2)
+# Device low memory notification and disk space free on the /data partition, in bytes at that time
+2745 low_storage (data|2|2)
+# disk space free on the /data, /system, and /cache partitions in bytes
+2746 free_storage_left (data|2|2),(system|2|2),(cache|2|2)
+
+
+# ---------------------------
+# NotificationManagerService.java
+# ---------------------------
+# when a NotificationManager.notify is called
+2750 notification_enqueue (pkg|3),(id|1|5),(notification|3)
+# when someone tries to cancel a notification, the notification manager sometimes
+# calls this with flags too
+2751 notification_cancel (pkg|3),(id|1|5),(required_flags|1)
+# when someone tries to cancel all of the notifications for a particular package
+2752 notification_cancel_all (pkg|3),(required_flags|1)
+
+
+# ---------------------------
+# Watchdog.java
+# ---------------------------
+2802 watchdog (Service|3)
+2803 watchdog_proc_pss (Process|3),(Pid|1|5),(Pss|1|2)
+2804 watchdog_soft_reset (Process|3),(Pid|1|5),(MaxPss|1|2),(Pss|1|2),(Skip|3)
+2805 watchdog_hard_reset (Process|3),(Pid|1|5),(MaxPss|1|2),(Pss|1|2)
+2806 watchdog_pss_stats (EmptyPss|1|2),(EmptyCount|1|1),(BackgroundPss|1|2),(BackgroundCount|1|1),(ServicePss|1|2),(ServiceCount|1|1),(VisiblePss|1|2),(VisibleCount|1|1),(ForegroundPss|1|2),(ForegroundCount|1|1),(NoPssCount|1|1)
+2807 watchdog_proc_stats (DeathsInOne|1|1),(DeathsInTwo|1|1),(DeathsInThree|1|1),(DeathsInFour|1|1),(DeathsInFive|1|1)
+2808 watchdog_scheduled_reboot (Now|2|1),(Interval|1|3),(StartTime|1|3),(Window|1|3),(Skip|3)
+2809 watchdog_meminfo (MemFree|1|2),(Buffers|1|2),(Cached|1|2),(Active|1|2),(Inactive|1|2),(AnonPages|1|2),(Mapped|1|2),(Slab|1|2),(SReclaimable|1|2),(SUnreclaim|1|2),(PageTables|1|2)
+2810 watchdog_vmstat (runtime|2|3),(pgfree|1|1),(pgactivate|1|1),(pgdeactivate|1|1),(pgfault|1|1),(pgmajfault|1|1)
+2811 watchdog_requested_reboot (NoWait|1|1),(ScheduleInterval|1|3),(RecheckInterval|1|3),(StartTime|1|3),(Window|1|3),(MinScreenOff|1|3),(MinNextAlarm|1|3)
+
+
+# ---------------------------
+# BackupManagerService.java
+# ---------------------------
+2820 backup_data_changed (Package|3)
+2821 backup_start (Transport|3)
+2822 backup_transport_failure (Package|3)
+2823 backup_agent_failure (Package|3),(Message|3)
+2824 backup_package (Package|3),(Size|1|2)
+2825 backup_success (Packages|1|1),(Time|1|3)
+2826 backup_reset (Transport|3)
+2827 backup_initialize
+2830 restore_start (Transport|3),(Source|2|5)
+2831 restore_transport_failure
+2832 restore_agent_failure (Package|3),(Message|3)
+2833 restore_package (Package|3),(Size|1|2)
+2834 restore_success (Packages|1|1),(Time|1|3)
+
+
+# ---------------------------
+# SystemServer.java
+# ---------------------------
+# SystemServer.run() starts:
+3010 boot_progress_system_run (time|2|3)
+
+
+# ---------------------------
+# PackageManagerService.java
+# ---------------------------
+# Package Manager starts:
+3060 boot_progress_pms_start (time|2|3)
+# Package Manager .apk scan starts:
+3070 boot_progress_pms_system_scan_start (time|2|3)
+# Package Manager .apk scan starts:
+3080 boot_progress_pms_data_scan_start (time|2|3)
+# Package Manager .apk scan ends:
+3090 boot_progress_pms_scan_end (time|2|3)
+# Package Manager ready:
+3100 boot_progress_pms_ready (time|2|3)
+# + check activity_launch_time for Home app
+
+
+# ---------------------------
+# WindowManagerService.java
+# ---------------------------
+# Out of memory for surfaces.
+31000 wm_no_surface_memory (Window|3),(PID|1|5),(Operation|3)
+
+
+# ---------------------------
+# InputMethodManagerService.java
+# ---------------------------
+# Re-connecting to input method service because we haven't received its interface
+32000 imf_force_reconnect_ime (IME|4),(Time Since Connect|2|3),(Showing|1|1)
+
+
+# ---------------------------
+# ConnectivityService.java
+# ---------------------------
+# Connectivity state changed:
+# [31-13] Reserved for future use
+# [12- 9] Network subtype (for mobile network, as defined by TelephonyManager)
+# [ 8- 3] Detailed state ordinal (as defined by NetworkInfo.DetailedState)
+# [ 2- 0] Network type (as defined by ConnectivityManager)
+50020 connectivity_state_changed (custom|1|5)
diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java
index e2e0ba9..a64cb1a 100644
--- a/services/java/com/android/server/InputMethodManagerService.java
+++ b/services/java/com/android/server/InputMethodManagerService.java
@@ -1,12 +1,12 @@
 /*
  * Copyright (C) 2006-2008 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
@@ -89,24 +89,22 @@
     static final String TAG = "InputManagerService";
 
     static final int MSG_SHOW_IM_PICKER = 1;
-    
+
     static final int MSG_UNBIND_INPUT = 1000;
     static final int MSG_BIND_INPUT = 1010;
     static final int MSG_SHOW_SOFT_INPUT = 1020;
     static final int MSG_HIDE_SOFT_INPUT = 1030;
     static final int MSG_ATTACH_TOKEN = 1040;
     static final int MSG_CREATE_SESSION = 1050;
-    
+
     static final int MSG_START_INPUT = 2000;
     static final int MSG_RESTART_INPUT = 2010;
-    
+
     static final int MSG_UNBIND_METHOD = 3000;
     static final int MSG_BIND_METHOD = 3010;
-    
+
     static final long TIME_TO_RECONNECT = 10*1000;
-    
-    static final int LOG_IMF_FORCE_RECONNECT_IME = 32000;
-    
+
     final Context mContext;
     final Handler mHandler;
     final SettingsObserver mSettingsObserver;
@@ -115,9 +113,9 @@
     final IconData mInputMethodData;
     final IWindowManager mIWindowManager;
     final HandlerCaller mCaller;
-    
+
     final InputBindResult mNoBinding = new InputBindResult(null, null, -1);
-    
+
     // All known input methods.  mMethodMap also serves as the global
     // lock for this class.
     final ArrayList<InputMethodInfo> mMethodList
@@ -127,12 +125,12 @@
 
     final TextUtils.SimpleStringSplitter mStringColonSplitter
             = new TextUtils.SimpleStringSplitter(':');
-    
+
     class SessionState {
         final ClientState client;
         final IInputMethod method;
         final IInputMethodSession session;
-        
+
         @Override
         public String toString() {
             return "SessionState{uid " + client.uid + " pid " + client.pid
@@ -150,17 +148,17 @@
             session = _session;
         }
     }
-    
+
     class ClientState {
         final IInputMethodClient client;
         final IInputContext inputContext;
         final int uid;
         final int pid;
         final InputBinding binding;
-        
+
         boolean sessionRequested;
         SessionState curSession;
-        
+
         @Override
         public String toString() {
             return "ClientState{" + Integer.toHexString(
@@ -177,122 +175,122 @@
             binding = new InputBinding(null, inputContext.asBinder(), uid, pid);
         }
     }
-    
+
     final HashMap<IBinder, ClientState> mClients
             = new HashMap<IBinder, ClientState>();
-    
+
     /**
      * Set once the system is ready to run third party code.
      */
     boolean mSystemReady;
-    
+
     /**
      * Id of the currently selected input method.
      */
     String mCurMethodId;
-    
+
     /**
      * The current binding sequence number, incremented every time there is
      * a new bind performed.
      */
     int mCurSeq;
-    
+
     /**
      * The client that is currently bound to an input method.
      */
     ClientState mCurClient;
-    
+
     /**
      * The last window token that gained focus.
      */
     IBinder mCurFocusedWindow;
-    
+
     /**
      * The input context last provided by the current client.
      */
     IInputContext mCurInputContext;
-    
+
     /**
      * The attributes last provided by the current client.
      */
     EditorInfo mCurAttribute;
-    
+
     /**
      * The input method ID of the input method service that we are currently
      * connected to or in the process of connecting to.
      */
     String mCurId;
-    
+
     /**
      * Set to true if our ServiceConnection is currently actively bound to
      * a service (whether or not we have gotten its IBinder back yet).
      */
     boolean mHaveConnection;
-    
+
     /**
      * Set if the client has asked for the input method to be shown.
      */
     boolean mShowRequested;
-    
+
     /**
      * Set if we were explicitly told to show the input method.
      */
     boolean mShowExplicitlyRequested;
-    
+
     /**
      * Set if we were forced to be shown.
      */
     boolean mShowForced;
-    
+
     /**
      * Set if we last told the input method to show itself.
      */
     boolean mInputShown;
-    
+
     /**
      * The Intent used to connect to the current input method.
      */
     Intent mCurIntent;
-    
+
     /**
      * The token we have made for the currently active input method, to
      * identify it in the future.
      */
     IBinder mCurToken;
-    
+
     /**
      * If non-null, this is the input method service we are currently connected
      * to.
      */
     IInputMethod mCurMethod;
-    
+
     /**
      * Time that we last initiated a bind to the input method, to determine
      * if we should try to disconnect and reconnect to it.
      */
     long mLastBindTime;
-    
+
     /**
      * Have we called mCurMethod.bindInput()?
      */
     boolean mBoundToMethod;
-    
+
     /**
      * Currently enabled session.  Only touched by service thread, not
      * protected by a lock.
      */
     SessionState mEnabledSession;
-    
+
     /**
      * True if the screen is on.  The value is true initially.
      */
     boolean mScreenOn = true;
-    
+
     AlertDialog.Builder mDialogBuilder;
     AlertDialog mSwitchingDialog;
     InputMethodInfo[] mIms;
     CharSequence[] mItems;
-    
+
     class SettingsObserver extends ContentObserver {
         SettingsObserver(Handler handler) {
             super(handler);
@@ -300,14 +298,14 @@
             resolver.registerContentObserver(Settings.Secure.getUriFor(
                     Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
         }
-        
+
         @Override public void onChange(boolean selfChange) {
             synchronized (mMethodMap) {
                 updateFromSettingsLocked();
             }
         }
     }
-    
+
     class ScreenOnOffReceiver extends android.content.BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -333,13 +331,13 @@
             }
         }
     }
-    
+
     class PackageReceiver extends android.content.BroadcastReceiver {
         @Override
         public void onReceive(Context context, Intent intent) {
             synchronized (mMethodMap) {
                 buildInputMethodListLocked(mMethodList, mMethodMap);
-                
+
                 InputMethodInfo curIm = null;
                 String curInputMethodId = Settings.Secure.getString(context
                         .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
@@ -351,9 +349,9 @@
                         }
                     }
                 }
-                
+
                 boolean changed = false;
-                
+
                 Uri uri = intent.getData();
                 String pkg = uri != null ? uri.getSchemeSpecificPart() : null;
                 if (curIm != null && curIm.getPackageName().equals(pkg)) {
@@ -377,27 +375,27 @@
                                     curInputMethodId);
                         }
                     }
-                    
+
                 } else if (curIm == null) {
                     // We currently don't have a default input method... is
                     // one now available?
                     changed = chooseNewDefaultIME();
                 }
-                
+
                 if (changed) {
                     updateFromSettingsLocked();
                 }
             }
         }
     }
-    
+
     class MethodCallback extends IInputMethodCallback.Stub {
         final IInputMethod mMethod;
-        
+
         MethodCallback(IInputMethod method) {
             mMethod = method;
         }
-        
+
         public void finishedEvent(int seq, boolean handled) throws RemoteException {
         }
 
@@ -405,7 +403,7 @@
             onSessionCreated(mMethod, session);
         }
     }
-    
+
     public InputMethodManagerService(Context context, StatusBarService statusBar) {
         mContext = context;
         mHandler = new Handler(this);
@@ -416,7 +414,7 @@
                 handleMessage(msg);
             }
         });
-        
+
         IntentFilter packageFilt = new IntentFilter();
         packageFilt.addAction(Intent.ACTION_PACKAGE_ADDED);
         packageFilt.addAction(Intent.ACTION_PACKAGE_CHANGED);
@@ -424,13 +422,13 @@
         packageFilt.addAction(Intent.ACTION_PACKAGE_RESTARTED);
         packageFilt.addDataScheme("package");
         mContext.registerReceiver(new PackageReceiver(), packageFilt);
-        
+
         IntentFilter screenOnOffFilt = new IntentFilter();
         screenOnOffFilt.addAction(Intent.ACTION_SCREEN_ON);
         screenOnOffFilt.addAction(Intent.ACTION_SCREEN_OFF);
         screenOnOffFilt.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
         mContext.registerReceiver(new ScreenOnOffReceiver(), screenOnOffFilt);
-        
+
         buildInputMethodListLocked(mMethodList, mMethodMap);
 
         final String enabledStr = Settings.Secure.getString(
@@ -471,12 +469,12 @@
                         Settings.Secure.DEFAULT_INPUT_METHOD, defIm.getId());
             }
         }
-        
+
         mStatusBar = statusBar;
         mInputMethodData = IconData.makeIcon("ime", null, 0, 0, 0);
         mInputMethodIcon = statusBar.addIcon(mInputMethodData, null);
         statusBar.setIconVisibility(mInputMethodIcon, false);
-        
+
         mSettingsObserver = new SettingsObserver(mHandler);
         updateFromSettingsLocked();
     }
@@ -508,7 +506,7 @@
             }
         }
     }
-    
+
     public List<InputMethodInfo> getInputMethodList() {
         synchronized (mMethodMap) {
             return new ArrayList<InputMethodInfo>(mMethodList);
@@ -523,14 +521,14 @@
 
     List<InputMethodInfo> getEnabledInputMethodListLocked() {
         final ArrayList<InputMethodInfo> res = new ArrayList<InputMethodInfo>();
-        
+
         final String enabledStr = Settings.Secure.getString(
                 mContext.getContentResolver(),
                 Settings.Secure.ENABLED_INPUT_METHODS);
         if (enabledStr != null) {
             final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
             splitter.setString(enabledStr);
-            
+
             while (splitter.hasNext()) {
                 InputMethodInfo info = mMethodMap.get(splitter.next());
                 if (info != null) {
@@ -538,7 +536,7 @@
                 }
             }
         }
-        
+
         return res;
     }
 
@@ -549,13 +547,13 @@
                     inputContext, uid, pid));
         }
     }
-    
+
     public void removeClient(IInputMethodClient client) {
         synchronized (mMethodMap) {
             mClients.remove(client.asBinder());
         }
     }
-    
+
     void executeOrSendMessage(IInterface target, Message msg) {
          if (target.asBinder() instanceof Binder) {
              mCaller.sendMessage(msg);
@@ -564,7 +562,7 @@
              msg.recycle();
          }
     }
-    
+
     void unbindCurrentClientLocked() {
         if (mCurClient != null) {
             if (DEBUG) Log.v(TAG, "unbindCurrentInputLocked: client = "
@@ -579,7 +577,7 @@
             executeOrSendMessage(mCurClient.client, mCaller.obtainMessageIO(
                     MSG_UNBIND_METHOD, mCurSeq, mCurClient.client));
             mCurClient.sessionRequested = false;
-            
+
             // Call setActive(false) on the old client
             try {
                 mCurClient.client.setActive(false);
@@ -588,11 +586,11 @@
                         + mCurClient.pid + " uid " + mCurClient.uid);
             }
             mCurClient = null;
-            
+
             hideInputMethodMenuLocked();
         }
     }
-    
+
     private int getImeShowFlags() {
         int flags = 0;
         if (mShowForced) {
@@ -603,7 +601,7 @@
         }
         return flags;
     }
-    
+
     private int getAppShowFlags() {
         int flags = 0;
         if (mShowForced) {
@@ -613,7 +611,7 @@
         }
         return flags;
     }
-    
+
     InputBindResult attachNewInputLocked(boolean initial, boolean needResult) {
         if (!mBoundToMethod) {
             executeOrSendMessage(mCurMethod, mCaller.obtainMessageOO(
@@ -636,7 +634,7 @@
                 ? new InputBindResult(session.session, mCurId, mCurSeq)
                 : null;
     }
-    
+
     InputBindResult startInputLocked(IInputMethodClient client,
             IInputContext inputContext, EditorInfo attribute,
             boolean initial, boolean needResult) {
@@ -644,13 +642,13 @@
         if (mCurMethodId == null) {
             return mNoBinding;
         }
-        
+
         ClientState cs = mClients.get(client.asBinder());
         if (cs == null) {
             throw new IllegalArgumentException("unknown client "
                     + client.asBinder());
         }
-        
+
         try {
             if (!mIWindowManager.inputMethodClientHasFocus(cs.client)) {
                 // Check with the window manager to make sure this client actually
@@ -664,7 +662,7 @@
             }
         } catch (RemoteException e) {
         }
-        
+
         if (mCurClient != cs) {
             // If the client is changing, we need to switch over to the new
             // one.
@@ -682,14 +680,14 @@
                 }
             }
         }
-        
+
         // Bump up the sequence for this client and attach it.
         mCurSeq++;
         if (mCurSeq <= 0) mCurSeq = 1;
         mCurClient = cs;
         mCurInputContext = inputContext;
         mCurAttribute = attribute;
-        
+
         // Check if the input method is changing.
         if (mCurId != null && mCurId.equals(mCurMethodId)) {
             if (cs.curSession != null) {
@@ -720,33 +718,33 @@
                     // to see if we can get back in touch with the service.
                     return new InputBindResult(null, mCurId, mCurSeq);
                 } else {
-                    EventLog.writeEvent(LOG_IMF_FORCE_RECONNECT_IME, mCurMethodId,
-                            SystemClock.uptimeMillis()-mLastBindTime, 0);
+                    EventLog.writeEvent(EventLogTags.IMF_FORCE_RECONNECT_IME,
+                            mCurMethodId, SystemClock.uptimeMillis()-mLastBindTime, 0);
                 }
             }
         }
-        
+
         return startInputInnerLocked();
     }
-    
+
     InputBindResult startInputInnerLocked() {
         if (mCurMethodId == null) {
             return mNoBinding;
         }
-        
+
         if (!mSystemReady) {
             // If the system is not yet ready, we shouldn't be running third
             // party code.
             return new InputBindResult(null, mCurMethodId, mCurSeq);
         }
-        
+
         InputMethodInfo info = mMethodMap.get(mCurMethodId);
         if (info == null) {
             throw new IllegalArgumentException("Unknown id: " + mCurMethodId);
         }
-        
+
         unbindCurrentMethodLocked(false);
-        
+
         mCurIntent = new Intent(InputMethod.SERVICE_INTERFACE);
         mCurIntent.setComponent(info.getComponent());
         mCurIntent.putExtra(Intent.EXTRA_CLIENT_LABEL,
@@ -772,7 +770,7 @@
         }
         return null;
     }
-    
+
     public InputBindResult startInput(IInputMethodClient client,
             IInputContext inputContext, EditorInfo attribute,
             boolean initial, boolean needResult) {
@@ -786,10 +784,10 @@
             }
         }
     }
-    
+
     public void finishInput(IInputMethodClient client) {
     }
-    
+
     public void onServiceConnected(ComponentName name, IBinder service) {
         synchronized (mMethodMap) {
             if (mCurIntent != null && name.equals(mCurIntent.getComponent())) {
@@ -830,13 +828,13 @@
             }
         }
     }
-    
+
     void unbindCurrentMethodLocked(boolean reportToClient) {
         if (mHaveConnection) {
             mContext.unbindService(this);
             mHaveConnection = false;
         }
-        
+
         if (mCurToken != null) {
             try {
                 if (DEBUG) Log.v(TAG, "Removing window token: " + mCurToken);
@@ -845,16 +843,16 @@
             }
             mCurToken = null;
         }
-        
+
         mCurId = null;
         clearCurMethodLocked();
-        
+
         if (reportToClient && mCurClient != null) {
             executeOrSendMessage(mCurClient.client, mCaller.obtainMessageIO(
                     MSG_UNBIND_METHOD, mCurSeq, mCurClient.client));
         }
     }
-    
+
     void clearCurMethodLocked() {
         if (mCurMethod != null) {
             for (ClientState cs : mClients.values()) {
@@ -865,7 +863,7 @@
         }
         mStatusBar.setIconVisibility(mInputMethodIcon, false);
     }
-    
+
     public void onServiceDisconnected(ComponentName name) {
         synchronized (mMethodMap) {
             if (DEBUG) Log.v(TAG, "Service disconnected: " + name
@@ -893,7 +891,7 @@
                 Log.w(TAG, "Ignoring setInputMethod of token: " + token);
                 return;
             }
-            
+
             synchronized (mMethodMap) {
                 if (iconId == 0) {
                     if (DEBUG) Log.d(TAG, "hide the small icon for the input method");
@@ -932,17 +930,17 @@
             unbindCurrentMethodLocked(true);
         }
     }
-    
+
     void setInputMethodLocked(String id) {
         InputMethodInfo info = mMethodMap.get(id);
         if (info == null) {
             throw new IllegalArgumentException("Unknown id: " + mCurMethodId);
         }
-        
+
         if (id.equals(mCurMethodId)) {
             return;
         }
-        
+
         final long ident = Binder.clearCallingIdentity();
         try {
             mCurMethodId = id;
@@ -959,7 +957,7 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
-    
+
     public boolean showSoftInput(IInputMethodClient client, int flags,
             ResultReceiver resultReceiver) {
         long ident = Binder.clearCallingIdentity();
@@ -979,7 +977,7 @@
                         return false;
                     }
                 }
-    
+
                 if (DEBUG) Log.v(TAG, "Client requesting input be shown");
                 return showCurrentInputLocked(flags, resultReceiver);
             }
@@ -987,7 +985,7 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
-    
+
     boolean showCurrentInputLocked(int flags, ResultReceiver resultReceiver) {
         mShowRequested = true;
         if ((flags&InputMethodManager.SHOW_IMPLICIT) == 0) {
@@ -997,11 +995,11 @@
             mShowExplicitlyRequested = true;
             mShowForced = true;
         }
-        
+
         if (!mSystemReady) {
             return false;
         }
-        
+
         boolean res = false;
         if (mCurMethod != null) {
             executeOrSendMessage(mCurMethod, mCaller.obtainMessageIOO(
@@ -1015,15 +1013,15 @@
             // we have been sitting here too long with a connection to the
             // service and no interface received, so let's disconnect/connect
             // to try to prod things along.
-            EventLog.writeEvent(LOG_IMF_FORCE_RECONNECT_IME, mCurMethodId,
+            EventLog.writeEvent(EventLogTags.IMF_FORCE_RECONNECT_IME, mCurMethodId,
                     SystemClock.uptimeMillis()-mLastBindTime,1);
             mContext.unbindService(this);
             mContext.bindService(mCurIntent, this, Context.BIND_AUTO_CREATE);
         }
-        
+
         return res;
     }
-    
+
     public boolean hideSoftInput(IInputMethodClient client, int flags,
             ResultReceiver resultReceiver) {
         long ident = Binder.clearCallingIdentity();
@@ -1043,7 +1041,7 @@
                         return false;
                     }
                 }
-    
+
                 if (DEBUG) Log.v(TAG, "Client requesting input be hidden");
                 return hideCurrentInputLocked(flags, resultReceiver);
             }
@@ -1051,7 +1049,7 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
-    
+
     boolean hideCurrentInputLocked(int flags, ResultReceiver resultReceiver) {
         if ((flags&InputMethodManager.HIDE_IMPLICIT_ONLY) != 0
                 && (mShowExplicitlyRequested || mShowForced)) {
@@ -1078,7 +1076,7 @@
         mShowForced = false;
         return res;
     }
-    
+
     public void windowGainedFocus(IInputMethodClient client, IBinder windowToken,
             boolean viewHasFocus, boolean isTextEditor, int softInputMode,
             boolean first, int windowFlags) {
@@ -1091,7 +1089,7 @@
                         + " softInputMode=#" + Integer.toHexString(softInputMode)
                         + " first=" + first + " flags=#"
                         + Integer.toHexString(windowFlags));
-                
+
                 if (mCurClient == null || client == null
                         || mCurClient.client.asBinder() != client.asBinder()) {
                     try {
@@ -1105,13 +1103,13 @@
                     } catch (RemoteException e) {
                     }
                 }
-    
+
                 if (mCurFocusedWindow == windowToken) {
                     Log.w(TAG, "Window already focused, ignoring focus gain of: " + client);
                     return;
                 }
                 mCurFocusedWindow = windowToken;
-                
+
                 switch (softInputMode&WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE) {
                     case WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED:
                         if (!isTextEditor || (softInputMode &
@@ -1166,7 +1164,7 @@
             Binder.restoreCallingIdentity(ident);
         }
     }
-    
+
     public void showInputMethodPickerFromClient(IInputMethodClient client) {
         synchronized (mMethodMap) {
             if (mCurClient == null || client == null
@@ -1216,7 +1214,7 @@
             }
         }
     }
-    
+
     public void showMySoftInput(IBinder token, int flags) {
         synchronized (mMethodMap) {
             if (token == null || mCurToken != token) {
@@ -1251,16 +1249,16 @@
             }
         }
     }
-    
+
     public boolean handleMessage(Message msg) {
         HandlerCaller.SomeArgs args;
         switch (msg.what) {
             case MSG_SHOW_IM_PICKER:
                 showInputMethodMenu();
                 return true;
-            
+
             // ---------------------------------------------------------
-                
+
             case MSG_UNBIND_INPUT:
                 try {
                     ((IInputMethod)msg.obj).unbindInput();
@@ -1308,7 +1306,7 @@
                 }
                 return true;
             // ---------------------------------------------------------
-                
+
             case MSG_START_INPUT:
                 args = (HandlerCaller.SomeArgs)msg.obj;
                 try {
@@ -1329,9 +1327,9 @@
                 } catch (RemoteException e) {
                 }
                 return true;
-                
+
             // ---------------------------------------------------------
-                
+
             case MSG_UNBIND_METHOD:
                 try {
                     ((IInputMethodClient)msg.obj).onUnbindMethod(msg.arg1);
@@ -1373,13 +1371,13 @@
             HashMap<String, InputMethodInfo> map) {
         list.clear();
         map.clear();
-        
+
         PackageManager pm = mContext.getPackageManager();
 
         List<ResolveInfo> services = pm.queryIntentServices(
                 new Intent(InputMethod.SERVICE_INTERFACE),
                 PackageManager.GET_META_DATA);
-        
+
         for (int i = 0; i < services.size(); ++i) {
             ResolveInfo ri = services.get(i);
             ServiceInfo si = ri.serviceInfo;
@@ -1407,7 +1405,7 @@
                 if (DEBUG) {
                     Log.d(TAG, "Found a third-party input method " + p);
                 }
-                
+
             } catch (XmlPullParserException e) {
                 Log.w(TAG, "Unable to load input method " + compName, e);
             } catch (IOException e) {
@@ -1423,24 +1421,24 @@
             }
         }
     }
-    
+
     // ----------------------------------------------------------------------
-    
+
     void showInputMethodMenu() {
         if (DEBUG) Log.v(TAG, "Show switching menu");
 
         hideInputMethodMenu();
-        
+
         final Context context = mContext;
-        
+
         final PackageManager pm = context.getPackageManager();
-        
+
         String lastInputMethodId = Settings.Secure.getString(context
                 .getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
         if (DEBUG) Log.v(TAG, "Current IME: " + lastInputMethodId);
-        
+
         final List<InputMethodInfo> immis = getEnabledInputMethodList();
-        
+
         int N = (immis == null ? 0 : immis.size());
 
         mItems = new CharSequence[N];
@@ -1465,7 +1463,7 @@
                 hideInputMethodMenu();
             }
         };
-        
+
         TypedArray a = context.obtainStyledAttributes(null,
                 com.android.internal.R.styleable.DialogPreference,
                 com.android.internal.R.attr.alertDialogStyle, 0);
@@ -1479,7 +1477,7 @@
                 .setIcon(a.getDrawable(
                         com.android.internal.R.styleable.DialogPreference_dialogTitle));
         a.recycle();
-        
+
         mDialogBuilder.setSingleChoiceItems(mItems, checkedItem,
                 new AlertDialog.OnClickListener() {
                     public void onClick(DialogInterface dialog, int which) {
@@ -1498,13 +1496,13 @@
             mSwitchingDialog.show();
         }
     }
-    
+
     void hideInputMethodMenu() {
         synchronized (mMethodMap) {
             hideInputMethodMenuLocked();
         }
     }
-    
+
     void hideInputMethodMenuLocked() {
         if (DEBUG) Log.v(TAG, "Hide switching menu");
 
@@ -1512,14 +1510,14 @@
             mSwitchingDialog.dismiss();
             mSwitchingDialog = null;
         }
-        
+
         mDialogBuilder = null;
         mItems = null;
         mIms = null;
     }
-    
+
     // ----------------------------------------------------------------------
-    
+
     public boolean setInputMethodEnabled(String id, boolean enabled) {
         synchronized (mMethodMap) {
             if (mContext.checkCallingOrSelfPermission(
@@ -1529,7 +1527,7 @@
                         "Requires permission "
                         + android.Manifest.permission.WRITE_SECURE_SETTINGS);
             }
-            
+
             long ident = Binder.clearCallingIdentity();
             try {
                 // Make sure this is a valid input method.
@@ -1539,12 +1537,12 @@
                         throw new IllegalArgumentException("Unknown id: " + mCurMethodId);
                     }
                 }
-                
+
                 StringBuilder builder = new StringBuilder(256);
-                
+
                 boolean removed = false;
                 String firstId = null;
-                
+
                 // Look through the currently enabled input methods.
                 String enabledStr = Settings.Secure.getString(mContext.getContentResolver(),
                         Settings.Secure.ENABLED_INPUT_METHODS);
@@ -1573,7 +1571,7 @@
                         }
                     }
                 }
-                
+
                 if (!enabled) {
                     if (!removed) {
                         // We are disabling the input method but it is already
@@ -1596,17 +1594,17 @@
                     // Previous state was enabled.
                     return true;
                 }
-                
+
                 // Add in the newly enabled input method.
                 if (enabledStr == null || enabledStr.length() == 0) {
                     enabledStr = id;
                 } else {
                     enabledStr = enabledStr + ':' + id;
                 }
-                
+
                 Settings.Secure.putString(mContext.getContentResolver(),
                         Settings.Secure.ENABLED_INPUT_METHODS, enabledStr);
-                
+
                 // Previous state was disabled.
                 return false;
             } finally {
@@ -1616,12 +1614,12 @@
     }
 
     // ----------------------------------------------------------------------
-    
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
                 != PackageManager.PERMISSION_GRANTED) {
-            
+
             pw.println("Permission Denial: can't dump InputMethodManager from from pid="
                     + Binder.getCallingPid()
                     + ", uid=" + Binder.getCallingUid());
@@ -1630,9 +1628,9 @@
 
         IInputMethod method;
         ClientState client;
-        
+
         final Printer p = new PrintWriterPrinter(pw);
-        
+
         synchronized (mMethodMap) {
             p.println("Current Input Method Manager state:");
             int N = mMethodList.size();
@@ -1669,7 +1667,7 @@
                     + " mInputShown=" + mInputShown);
             p.println("  mSystemReady=" + mSystemReady + " mScreenOn=" + mScreenOn);
         }
-        
+
         if (client != null) {
             p.println(" ");
             pw.flush();
@@ -1679,7 +1677,7 @@
                 p.println("Input method client dead: " + e);
             }
         }
-        
+
         if (method != null) {
             p.println(" ");
             pw.flush();
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 147580b..436a60e 100755
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -75,8 +75,8 @@
 
     private static final int LONG_DELAY = 3500; // 3.5 seconds
     private static final int SHORT_DELAY = 2000; // 2 seconds
-    
-    private static final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250}; 
+
+    private static final long[] DEFAULT_VIBRATE_PATTERN = {0, 250, 250, 250};
 
     private static final int DEFAULT_STREAM_TYPE = AudioManager.STREAM_NOTIFICATION;
 
@@ -108,7 +108,7 @@
     private boolean mAdbEnabled = false;
     private boolean mAdbNotificationShown = false;
     private Notification mAdbNotification;
-    
+
     private final ArrayList<NotificationRecord> mNotificationList =
             new ArrayList<NotificationRecord>();
 
@@ -127,11 +127,6 @@
     private static final int BATTERY_BLINK_ON = 125;
     private static final int BATTERY_BLINK_OFF = 2875;
 
-    // Tag IDs for EventLog.
-    private static final int EVENT_LOG_ENQUEUE = 2750;
-    private static final int EVENT_LOG_CANCEL = 2751;
-    private static final int EVENT_LOG_CANCEL_ALL = 2752;
-
     private static String idDebugString(Context baseContext, String packageName, int id) {
         Context c = null;
 
@@ -191,7 +186,7 @@
                     + " ledOnMS=" + notification.ledOnMS
                     + " ledOffMS=" + notification.ledOffMS);
         }
-        
+
         @Override
         public final String toString()
         {
@@ -221,11 +216,11 @@
         void update(int duration) {
             this.duration = duration;
         }
-        
+
         void dump(PrintWriter pw, String prefix) {
             pw.println(prefix + this);
         }
-        
+
         @Override
         public final String toString()
         {
@@ -354,7 +349,7 @@
         SettingsObserver(Handler handler) {
             super(handler);
         }
-        
+
         void observe() {
             ContentResolver resolver = mContext.getContentResolver();
             resolver.registerContentObserver(Settings.Secure.getUriFor(
@@ -422,7 +417,7 @@
         filter.addAction(Intent.ACTION_SCREEN_ON);
         filter.addAction(Intent.ACTION_SCREEN_OFF);
         mContext.registerReceiver(mIntentReceiver, filter);
-        
+
         SettingsObserver observer = new SettingsObserver(mHandler);
         observer.observe();
     }
@@ -621,12 +616,12 @@
             Notification notification, int[] idOut)
     {
         checkIncomingCall(pkg);
-        
+
         // This conditional is a dirty hack to limit the logging done on
         //     behalf of the download manager without affecting other apps.
         if (!pkg.equals("com.android.providers.downloads")
                 || Log.isLoggable("DownloadManager", Log.VERBOSE)) {
-            EventLog.writeEvent(EVENT_LOG_ENQUEUE, pkg, id, notification.toString());
+            EventLog.writeEvent(EventLogTags.NOTIFICATION_ENQUEUE, pkg, id, notification.toString());
         }
 
         if (pkg == null || notification == null) {
@@ -660,20 +655,20 @@
                         old.notification.flags&Notification.FLAG_FOREGROUND_SERVICE;
                 }
             }
-            
+
             // Ensure if this is a foreground service that the proper additional
             // flags are set.
             if ((notification.flags&Notification.FLAG_FOREGROUND_SERVICE) != 0) {
                 notification.flags |= Notification.FLAG_ONGOING_EVENT
                         | Notification.FLAG_NO_CLEAR;
             }
-            
+
             if (notification.icon != 0) {
                 IconData icon = IconData.makeIcon(null, pkg, notification.icon,
                                                     notification.iconLevel,
                                                     notification.number);
                 CharSequence truncatedTicker = notification.tickerText;
-                
+
                 // TODO: make this restriction do something smarter like never fill
                 // more than two screens.  "Why would anyone need more than 80 characters." :-/
                 final int maxTickerLen = 80;
@@ -738,7 +733,7 @@
                 .getSystemService(Context.AUDIO_SERVICE);
                 // sound
                 final boolean useDefaultSound =
-                    (notification.defaults & Notification.DEFAULT_SOUND) != 0; 
+                    (notification.defaults & Notification.DEFAULT_SOUND) != 0;
                 if (useDefaultSound || notification.sound != null) {
                     Uri uri;
                     if (useDefaultSound) {
@@ -769,12 +764,12 @@
 
                 // vibrate
                 final boolean useDefaultVibrate =
-                    (notification.defaults & Notification.DEFAULT_VIBRATE) != 0; 
+                    (notification.defaults & Notification.DEFAULT_VIBRATE) != 0;
                 if ((useDefaultVibrate || notification.vibrate != null)
                         && audioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_NOTIFICATION)) {
                     mVibrateNotification = r;
 
-                    mVibrator.vibrate(useDefaultVibrate ? DEFAULT_VIBRATE_PATTERN 
+                    mVibrator.vibrate(useDefaultVibrate ? DEFAULT_VIBRATE_PATTERN
                                                         : notification.vibrate,
                               ((notification.flags & Notification.FLAG_INSISTENT) != 0) ? 0: -1);
                 }
@@ -869,24 +864,24 @@
 
     /**
      * Cancels a notification ONLY if it has all of the {@code mustHaveFlags}
-     * and none of the {@code mustNotHaveFlags}. 
+     * and none of the {@code mustNotHaveFlags}.
      */
     private void cancelNotification(String pkg, String tag, int id, int mustHaveFlags,
             int mustNotHaveFlags) {
-        EventLog.writeEvent(EVENT_LOG_CANCEL, pkg, id, mustHaveFlags);
+        EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL, pkg, id, mustHaveFlags);
 
         synchronized (mNotificationList) {
             int index = indexOfNotificationLocked(pkg, tag, id);
             if (index >= 0) {
                 NotificationRecord r = mNotificationList.get(index);
-                
+
                 if ((r.notification.flags & mustHaveFlags) != mustHaveFlags) {
                     return;
                 }
                 if ((r.notification.flags & mustNotHaveFlags) != 0) {
                     return;
                 }
-                
+
                 mNotificationList.remove(index);
 
                 cancelNotificationLocked(r);
@@ -901,7 +896,7 @@
      */
     void cancelAllNotificationsInt(String pkg, int mustHaveFlags,
             int mustNotHaveFlags) {
-        EventLog.writeEvent(EVENT_LOG_CANCEL_ALL, pkg, mustHaveFlags);
+        EventLog.writeEvent(EventLogTags.NOTIFICATION_CANCEL_ALL, pkg, mustHaveFlags);
 
         synchronized (mNotificationList) {
             final int N = mNotificationList.size();
@@ -927,7 +922,7 @@
         }
     }
 
-    
+
     public void cancelNotification(String pkg, int id) {
         cancelNotificationWithTag(pkg, null /* tag */, id);
     }
@@ -942,7 +937,7 @@
 
     public void cancelAllNotifications(String pkg) {
         checkIncomingCall(pkg);
-        
+
         // Calling from user space, don't allow the canceling of actively
         // running foreground services.
         cancelAllNotificationsInt(pkg, 0, Notification.FLAG_FOREGROUND_SERVICE);
@@ -964,7 +959,7 @@
             throw new SecurityException("Unknown package " + pkg);
         }
     }
-    
+
     void cancelAll() {
         synchronized (mNotificationList) {
             final int N = mNotificationList.size();
@@ -1103,14 +1098,14 @@
                             intent, 0);
 
                     mAdbNotification.setLatestEventInfo(mContext, title, message, pi);
-                    
+
                     mAdbNotificationShown = true;
                     notificationManager.notify(
                             com.android.internal.R.string.adb_active_notification_title,
                             mAdbNotification);
                 }
             }
-            
+
         } else if (mAdbNotificationShown) {
             NotificationManager notificationManager = (NotificationManager) mContext
                     .getSystemService(Context.NOTIFICATION_SERVICE);
@@ -1138,7 +1133,7 @@
                     + ", uid=" + Binder.getCallingUid());
             return;
         }
-        
+
         pw.println("Current Notification Manager state:");
 
         int N;
@@ -1152,7 +1147,7 @@
                 }
                 pw.println("  ");
             }
-            
+
         }
 
         synchronized (mNotificationList) {
@@ -1164,7 +1159,7 @@
                 }
                 pw.println("  ");
             }
-            
+
             N = mLights.size();
             if (N > 0) {
                 pw.println("  Lights List:");
@@ -1173,7 +1168,7 @@
                 }
                 pw.println("  ");
             }
-            
+
             pw.println("  mSoundNotification=" + mSoundNotification);
             pw.println("  mSound=" + mSound);
             pw.println("  mVibrateNotification=" + mVibrateNotification);
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index c95ad01..6ed488d 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -137,12 +137,6 @@
     static final int SCAN_UPDATE_SIGNATURE = 1<<3;
     static final int SCAN_FORWARD_LOCKED = 1<<4;
     static final int SCAN_NEW_INSTALL = 1<<5;
-    
-    static final int LOG_BOOT_PROGRESS_PMS_START = 3060;
-    static final int LOG_BOOT_PROGRESS_PMS_SYSTEM_SCAN_START = 3070;
-    static final int LOG_BOOT_PROGRESS_PMS_DATA_SCAN_START = 3080;
-    static final int LOG_BOOT_PROGRESS_PMS_SCAN_END = 3090;
-    static final int LOG_BOOT_PROGRESS_PMS_READY = 3100;
 
     final HandlerThread mHandlerThread = new HandlerThread("PackageManager",
             Process.THREAD_PRIORITY_BACKGROUND);
@@ -151,7 +145,7 @@
     final int mSdkVersion = Build.VERSION.SDK_INT;
     final String mSdkCodename = "REL".equals(Build.VERSION.CODENAME)
             ? null : Build.VERSION.CODENAME;
-    
+
     final Context mContext;
     final boolean mFactoryTest;
     final boolean mNoDexOpt;
@@ -181,7 +175,7 @@
     // Used for priviledge escalation.  MUST NOT BE CALLED WITH mPackages
     // LOCK HELD.  Can be called with mInstallLock held.
     final Installer mInstaller;
-    
+
     final File mFrameworkDir;
     final File mSystemAppDir;
     final File mAppInstallDir;
@@ -190,14 +184,14 @@
     // Directory containing the private parts (e.g. code and non-resource assets) of forward-locked
     // apps.
     final File mDrmAppPrivateInstallDir;
-    
+
     // ----------------------------------------------------------------
-    
+
     // Lock for state used when installing and doing other long running
     // operations.  Methods that must be called with this lock held have
     // the prefix "LI".
     final Object mInstallLock = new Object();
-    
+
     // These are the directories in the 3rd party applications installed dir
     // that we have currently loaded packages from.  Keys are the application's
     // installed zip file (absolute codePath), and values are Package.
@@ -211,7 +205,7 @@
     final int[] mOutPermissions = new int[3];
 
     // ----------------------------------------------------------------
-    
+
     // Keys are String (package name), values are Package.  This also serves
     // as the lock for the global state.  Methods that must be called with
     // this lock held have the prefix "LP".
@@ -229,19 +223,19 @@
     // etc/permissions.xml file.
     final SparseArray<HashSet<String>> mSystemPermissions =
             new SparseArray<HashSet<String>>();
-    
+
     // These are the built-in shared libraries that were read from the
     // etc/permissions.xml file.
     final HashMap<String, String> mSharedLibraries = new HashMap<String, String>();
-    
+
     // Temporary for building the final shared libraries for an .apk.
     String[] mTmpSharedLibraries = null;
-    
+
     // These are the features this devices supports that were read from the
     // etc/permissions.xml file.
     final HashMap<String, FeatureInfo> mAvailableFeatures =
             new HashMap<String, FeatureInfo>();
-    
+
     // All available activities, for your resolving pleasure.
     final ActivityIntentResolver mActivities =
             new ActivityIntentResolver();
@@ -272,7 +266,7 @@
 
     // Broadcast actions that are only available to the system.
     final HashSet<String> mProtectedBroadcasts = new HashSet<String>();
-    
+
     boolean mSystemReady;
     boolean mSafeMode;
     boolean mHasSystemUidErrors;
@@ -350,7 +344,7 @@
             count++;
             i++;
         }
-        
+
         String[] res = new String[count];
         i=0;
         count = 0;
@@ -364,15 +358,15 @@
         res[count] = str.substring(lastI, str.length());
         return res;
     }
-    
+
     public PackageManagerService(Context context, boolean factoryTest) {
-        EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_START,
+        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START,
                 SystemClock.uptimeMillis());
-        
+
         if (mSdkVersion <= 0) {
             Log.w(TAG, "**** ro.build.version.sdk not set!");
         }
-        
+
         mContext = context;
         mFactoryTest = factoryTest;
         mNoDexOpt = "eng".equals(SystemProperties.get("ro.build.type"));
@@ -405,7 +399,7 @@
             mDefParseFlags = 0;
             mSeparateProcesses = null;
         }
-        
+
         Installer installer = new Installer();
         // Little hacky thing to check if installd is here, to determine
         // whether we are running on the simulator and thus need to take
@@ -425,7 +419,7 @@
         synchronized (mPackages) {
             mHandlerThread.start();
             mHandler = new PackageHandler(mHandlerThread.getLooper());
-            
+
             File dataDir = Environment.getDataDirectory();
             mAppDataDir = new File(dataDir, "data");
             mSecureAppDataDir = new File(dataDir, "secure/data");
@@ -446,24 +440,24 @@
 
             mRestoredSettings = mSettings.readLP();
             long startTime = SystemClock.uptimeMillis();
-            
-            EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
+
+            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
                     startTime);
-            
+
             int scanMode = SCAN_MONITOR;
             if (mNoDexOpt) {
                 Log.w(TAG, "Running ENG build: no pre-dexopt!");
-                scanMode |= SCAN_NO_DEX; 
+                scanMode |= SCAN_NO_DEX;
             }
-            
+
             final HashSet<String> libFiles = new HashSet<String>();
-            
+
             mFrameworkDir = new File(Environment.getRootDirectory(), "framework");
             mDalvikCacheDir = new File(dataDir, "dalvik-cache");
-            
+
             if (mInstaller != null) {
                 boolean didDexOpt = false;
-                
+
                 /**
                  * Out of paranoia, ensure that everything in the boot class
                  * path has been dexed.
@@ -487,7 +481,7 @@
                 } else {
                     Log.w(TAG, "No BOOTCLASSPATH found!");
                 }
-                
+
                 /**
                  * Also ensure all external libraries have had dexopt run on them.
                  */
@@ -508,11 +502,11 @@
                         }
                     }
                 }
-                
+
                 // Gross hack for now: we know this file doesn't contain any
                 // code, so don't dexopt it to avoid the resulting log spew.
                 libFiles.add(mFrameworkDir.getPath() + "/framework-res.apk");
-                
+
                 /**
                  * And there are a number of commands implemented in Java, which
                  * we currently need to do the dexopt on so that they can be
@@ -543,7 +537,7 @@
                         }
                     }
                 }
-                
+
                 if (didDexOpt) {
                     // If we had to do a dexopt of one of the previous
                     // things, then something on the system has changed.
@@ -563,7 +557,7 @@
                     }
                 }
             }
-            
+
             mFrameworkInstallObserver = new AppDirObserver(
                 mFrameworkDir.getPath(), OBSERVER_EVENTS, true);
             mFrameworkInstallObserver.startWatching();
@@ -589,8 +583,8 @@
             }
             //delete tmp files
             deleteTempPackageFiles();
-            
-            EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_DATA_SCAN_START,
+
+            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_DATA_SCAN_START,
                     SystemClock.uptimeMillis());
             mAppInstallObserver = new AppDirObserver(
                 mAppInstallDir.getPath(), OBSERVER_EVENTS, false);
@@ -602,7 +596,7 @@
             mDrmAppInstallObserver.startWatching();
             scanDirLI(mDrmAppPrivateInstallDir, 0, scanMode | SCAN_FORWARD_LOCKED);
 
-            EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_SCAN_END,
+            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SCAN_END,
                     SystemClock.uptimeMillis());
             Log.i(TAG, "Time to scan packages: "
                     + ((SystemClock.uptimeMillis()-startTime)/1000f)
@@ -612,9 +606,9 @@
 
             mSettings.writeLP();
 
-            EventLog.writeEvent(LOG_BOOT_PROGRESS_PMS_READY,
+            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_READY,
                     SystemClock.uptimeMillis());
-            
+
             // Now after opening every single application zip, make sure they
             // are all flushed.  Not really needed, but keeps things nice and
             // tidy.
@@ -670,7 +664,7 @@
             if (f.getPath().endsWith("etc/permissions/platform.xml")) {
                 continue;
             }
-            
+
             if (!f.getPath().endsWith(".xml")) {
                 Log.i(TAG, "Non-xml file " + f + " in " + libraryDir + " directory, ignoring");
                 continue;
@@ -682,12 +676,12 @@
 
             readPermissionsFromXml(f);
         }
-        
+
         // Read permissions from .../etc/permissions/platform.xml last so it will take precedence
         final File permFile = new File(Environment.getRootDirectory(),
                 "etc/permissions/platform.xml");
         readPermissionsFromXml(permFile);
-        
+
         StringBuilder sb = new StringBuilder(128);
         sb.append("Libs:");
         Iterator<String> it = mSharedLibraries.keySet().iterator();
@@ -699,7 +693,7 @@
             sb.append(mSharedLibraries.get(name));
         }
         Log.i(TAG, sb.toString());
-        
+
         sb.setLength(0);
         sb.append("Features:");
         it = mAvailableFeatures.keySet().iterator();
@@ -709,8 +703,8 @@
         }
         Log.i(TAG, sb.toString());
     }
-    
-    private void readPermissionsFromXml(File permFile) {        
+
+    private void readPermissionsFromXml(File permFile) {
         FileReader permReader = null;
         try {
             permReader = new FileReader(permFile);
@@ -754,7 +748,7 @@
                     }
                     perm = perm.intern();
                     readPermission(parser, perm);
-                    
+
                 } else if ("assign-permission".equals(name)) {
                     String perm = parser.getAttributeValue(null, "name");
                     if (perm == null) {
@@ -786,7 +780,7 @@
                     }
                     perms.add(perm);
                     XmlUtils.skipCurrentTag(parser);
-                    
+
                 } else if ("library".equals(name)) {
                     String lname = parser.getAttributeValue(null, "name");
                     String lfile = parser.getAttributeValue(null, "file");
@@ -802,7 +796,7 @@
                     }
                     XmlUtils.skipCurrentTag(parser);
                     continue;
-                    
+
                 } else if ("feature".equals(name)) {
                     String fname = parser.getAttributeValue(null, "name");
                     if (fname == null) {
@@ -816,7 +810,7 @@
                     }
                     XmlUtils.skipCurrentTag(parser);
                     continue;
-                    
+
                 } else {
                     XmlUtils.skipCurrentTag(parser);
                     continue;
@@ -975,14 +969,14 @@
                     }
                 }
             }
-            
+
             if (out.size() > 0) {
                 return out;
             }
             return mPermissionGroups.containsKey(group) ? out : null;
         }
     }
-    
+
     public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) {
         synchronized (mPackages) {
             return PackageParser.generatePermissionGroupInfo(
@@ -1001,7 +995,7 @@
             return out;
         }
     }
-    
+
     private ApplicationInfo generateApplicationInfoFromSettingsLP(String packageName, int flags) {
         PackageSetting ps = mSettings.mPackages.get(packageName);
         if(ps != null) {
@@ -1016,7 +1010,7 @@
         }
         return null;
     }
-    
+
     private PackageInfo generatePackageInfoFromSettingsLP(String packageName, int flags) {
         PackageSetting ps = mSettings.mPackages.get(packageName);
         if(ps != null) {
@@ -1028,7 +1022,7 @@
         }
         return null;
     }
-    
+
     public ApplicationInfo getApplicationInfo(String packageName, int flags) {
         synchronized (mPackages) {
             PackageParser.Package p = mPackages.get(packageName);
@@ -1048,8 +1042,8 @@
         }
         return null;
     }
-    
-    
+
+
     public void freeStorageAndNotify(final long freeStorageSize, final IPackageDataObserver observer) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.CLEAR_APP_CACHE, null);
@@ -1102,7 +1096,7 @@
             }
         });
     }
-    
+
     public ActivityInfo getActivityInfo(ComponentName component, int flags) {
         synchronized (mPackages) {
             PackageParser.Activity a = mActivities.mActivities.get(component);
@@ -1141,7 +1135,7 @@
         }
         return null;
     }
-    
+
     public String[] getSystemSharedLibraryNames() {
         Set<String> libSet;
         synchronized (mPackages) {
@@ -1179,7 +1173,7 @@
             return mAvailableFeatures.containsKey(name);
         }
     }
-    
+
     public int checkPermission(String permName, String pkgName) {
         synchronized (mPackages) {
             PackageParser.Package p = mPackages.get(pkgName);
@@ -1298,7 +1292,7 @@
             return mProtectedBroadcasts.contains(actionName);
         }
     }
-    
+
     public int checkSignatures(String pkg1, String pkg2) {
         synchronized (mPackages) {
             PackageParser.Package p1 = mPackages.get(pkg1);
@@ -1403,7 +1397,7 @@
         }
         return null;
     }
-    
+
     public int getUidForSharedUser(String sharedUserName) {
         if(sharedUserName == null) {
             return -1;
@@ -1729,7 +1723,7 @@
             }
             return list;
         }
-        
+
         synchronized (mPackages) {
             String pkgName = intent.getPackage();
             if (pkgName == null) {
@@ -1787,7 +1781,7 @@
             return null;
         }
     }
-    
+
     public List<PackageInfo> getInstalledPackages(int flags) {
         ArrayList<PackageInfo> finalList = new ArrayList<PackageInfo>();
 
@@ -2009,7 +2003,7 @@
         }
         return true;
     }
-    
+
     /*
      *  Scan a package and return the newly parsed package.
      *  Returns null in case of errors and the error code is stored in mLastScanError
@@ -2088,7 +2082,7 @@
         return processName;
     }
 
-    private boolean verifySignaturesLP(PackageSetting pkgSetting, 
+    private boolean verifySignaturesLP(PackageSetting pkgSetting,
             PackageParser.Package pkg, int parseFlags, boolean updateSignature) {
         if (pkg.mSignatures != null) {
             if (!pkgSetting.signatures.updateSignatures(pkg.mSignatures,
@@ -2114,12 +2108,12 @@
         }
         return true;
     }
-    
+
     public boolean performDexOpt(String packageName) {
         if (!mNoDexOpt) {
             return false;
         }
-        
+
         PackageParser.Package p;
         synchronized (mPackages) {
             p = mPackages.get(packageName);
@@ -2131,11 +2125,11 @@
             return performDexOptLI(p, false) == DEX_OPT_PERFORMED;
         }
     }
-    
+
     static final int DEX_OPT_SKIPPED = 0;
     static final int DEX_OPT_PERFORMED = 1;
     static final int DEX_OPT_FAILED = -1;
-    
+
     private int performDexOptLI(PackageParser.Package pkg, boolean forceDex) {
         boolean performed = false;
         if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0 && mInstaller != null) {
@@ -2143,7 +2137,7 @@
             int ret = 0;
             try {
                 if (forceDex || dalvik.system.DexFile.isDexOptNeeded(path)) {
-                    ret = mInstaller.dexopt(path, pkg.applicationInfo.uid, 
+                    ret = mInstaller.dexopt(path, pkg.applicationInfo.uid,
                             !pkg.mForwardLocked);
                     pkg.mDidDexOpt = true;
                     performed = true;
@@ -2160,7 +2154,7 @@
                 return DEX_OPT_FAILED;
             }
         }
-        
+
         return performed ? DEX_OPT_PERFORMED : DEX_OPT_SKIPPED;
     }
 
@@ -2194,7 +2188,7 @@
                     mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
                     return null;
                 }
-    
+
                 // Set up information for our fall-back user intent resolution
                 // activity.
                 mPlatformPackage = pkg;
@@ -2231,9 +2225,9 @@
 
         SharedUserSetting suid = null;
         PackageSetting pkgSetting = null;
-        
+
         boolean removeExisting = false;
-        
+
         synchronized (mPackages) {
             // Check all shared libraries and map to their actual file path.
             if (pkg.usesLibraries != null || pkg.usesOptionalLibraries != null) {
@@ -2272,7 +2266,7 @@
                     System.arraycopy(mTmpSharedLibraries, 0,
                             pkg.usesLibraryFiles, 0, num);
                 }
-                
+
                 if (pkg.reqFeatures != null) {
                     N = pkg.reqFeatures.size();
                     for (int i=0; i<N; i++) {
@@ -2281,7 +2275,7 @@
                             // Don't care.
                             continue;
                         }
-                        
+
                         if (fi.name != null) {
                             if (mAvailableFeatures.get(fi.name) == null) {
                                 Log.e(TAG, "Package " + pkg.packageName
@@ -2294,7 +2288,7 @@
                     }
                 }
             }
-            
+
             if (pkg.mSharedUserId != null) {
                 suid = mSettings.getSharedUserLP(pkg.mSharedUserId,
                         pkg.applicationInfo.flags, true);
@@ -2322,11 +2316,11 @@
             if(mSettings.mDisabledSysPackages.get(pkg.packageName) != null) {
                 pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
             }
-        
+
             pkg.applicationInfo.uid = pkgSetting.userId;
             pkg.mExtras = pkgSetting;
-    
-            if (!verifySignaturesLP(pkgSetting, pkg, parseFlags, 
+
+            if (!verifySignaturesLP(pkgSetting, pkg, parseFlags,
                     (scanMode&SCAN_UPDATE_SIGNATURE) != 0)) {
                 if ((parseFlags&PackageParser.PARSE_IS_SYSTEM) == 0) {
                     mLastScanError = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE;
@@ -2349,7 +2343,7 @@
                 }
                 removeExisting = true;
             }
-            
+
             // Verify that this new package doesn't have any content providers
             // that conflict with existing packages.  Only do this if the
             // package isn't already installed, since we don't want to break
@@ -2392,7 +2386,7 @@
                     + " signature changed: existing data removed.");
             mLastScanError = PackageManager.INSTALL_SUCCEEDED;
         }
-        
+
         long scanFileTime = scanFile.lastModified();
         final boolean forceDex = (scanMode&SCAN_FORCE_DEX) != 0;
         final boolean scanFileNewer = forceDex || scanFileTime != pkgSetting.getTimeStamp();
@@ -2436,7 +2430,7 @@
                                         + pkg.applicationInfo.uid + "; old data erased";
                                 reportSettingsProblem(Log.WARN, msg);
                                 recovered = true;
-                                
+
                                 // And now re-install the app.
                                 ret = mInstaller.install(pkgName, useEncryptedFSDir, pkg.applicationInfo.uid,
                                         pkg.applicationInfo.uid);
@@ -2449,7 +2443,7 @@
                                     return null;
                                 }
                             }
-                        } 
+                        }
                         if (!recovered) {
                             mHasSystemUidErrors = true;
                         }
@@ -2518,7 +2512,7 @@
 
             pkg.mForwardLocked = (scanMode&SCAN_FORWARD_LOCKED) != 0;
             pkg.mScanPath = path;
-            
+
             if ((scanMode&SCAN_NO_DEX) == 0) {
                 if (performDexOptLI(pkg, forceDex) == DEX_OPT_FAILED) {
                     mLastScanError = PackageManager.INSTALL_FAILED_DEXOPT;
@@ -2526,7 +2520,7 @@
                 }
             }
         }
-        
+
         if (mFactoryTest && pkg.requestedPermissions.contains(
                 android.Manifest.permission.FACTORY_TEST)) {
             pkg.applicationInfo.flags |= ApplicationInfo.FLAG_FACTORY_TEST;
@@ -2610,7 +2604,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Providers: " + r);
             }
-    
+
             N = pkg.services.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2630,7 +2624,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Services: " + r);
             }
-    
+
             N = pkg.receivers.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2650,7 +2644,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Receivers: " + r);
             }
-    
+
             N = pkg.activities.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2670,7 +2664,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Activities: " + r);
             }
-    
+
             N = pkg.permissionGroups.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2704,7 +2698,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Permission Groups: " + r);
             }
-    
+
             N = pkg.permissions.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2765,7 +2759,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Permissions: " + r);
             }
-    
+
             N = pkg.instrumentation.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -2787,17 +2781,17 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Instrumentation: " + r);
             }
-    
+
             if (pkg.protectedBroadcasts != null) {
                 N = pkg.protectedBroadcasts.size();
                 for (i=0; i<N; i++) {
                     mProtectedBroadcasts.add(pkg.protectedBroadcasts.get(i));
                 }
             }
-            
+
             pkgSetting.setTimeStamp(scanFileTime);
         }
-        
+
         return pkg;
     }
 
@@ -2866,7 +2860,7 @@
             // file name must start with libPrefix, i.e. "lib"
             int lastSlash = entryName.lastIndexOf('/');
 
-            if (lastSlash < 0 || 
+            if (lastSlash < 0 ||
                 !entryName.regionMatches(lastSlash+1, libPrefix, 0, libPrefixLen) ) {
                 continue;
             }
@@ -2986,12 +2980,12 @@
 
         synchronized (mPackages) {
             clearPackagePreferredActivitiesLP(pkg.packageName);
-    
+
             mPackages.remove(pkg.applicationInfo.packageName);
             if (pkg.mPath != null) {
                 mAppDirs.remove(pkg.mPath);
             }
-    
+
             PackageSetting ps = (PackageSetting)pkg.mExtras;
             if (ps != null && ps.sharedUser != null) {
                 // XXX don't do this until the data is removed.
@@ -3002,7 +2996,7 @@
                     }
                 }
             }
-    
+
             int N = pkg.providers.size();
             StringBuilder r = null;
             int i;
@@ -3011,7 +3005,7 @@
                 mProvidersByComponent.remove(new ComponentName(p.info.packageName,
                         p.info.name));
                 if (p.info.authority == null) {
-                    
+
                     /* The is another ContentProvider with this authority when
                      * this app was installed so this authority is null,
                      * Ignore it as we don't have to unregister the provider.
@@ -3040,7 +3034,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Providers: " + r);
             }
-    
+
             N = pkg.services.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -3058,7 +3052,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Services: " + r);
             }
-    
+
             N = pkg.receivers.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -3076,7 +3070,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Receivers: " + r);
             }
-    
+
             N = pkg.activities.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -3094,7 +3088,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Activities: " + r);
             }
-    
+
             N = pkg.permissions.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -3128,7 +3122,7 @@
             if (r != null) {
                 if (Config.LOGD) Log.d(TAG, "  Permissions: " + r);
             }
-    
+
             N = pkg.instrumentation.size();
             r = null;
             for (i=0; i<N; i++) {
@@ -3199,7 +3193,7 @@
             grantPermissionsLP(pkg, false);
         }
     }
-    
+
     private void grantPermissionsLP(PackageParser.Package pkg, boolean replace) {
         final PackageSetting ps = (PackageSetting)pkg.mExtras;
         if (ps == null) {
@@ -3207,7 +3201,7 @@
         }
         final GrantedPermissions gp = ps.sharedUser != null ? ps.sharedUser : ps;
         boolean addedPermission = false;
-        
+
         if (replace) {
             ps.permissionsFixed = false;
             if (gp == ps) {
@@ -3215,11 +3209,11 @@
                 gp.gids = mGlobalGids;
             }
         }
-        
+
         if (gp.gids == null) {
             gp.gids = mGlobalGids;
         }
-       
+
         final int N = pkg.requestedPermissions.size();
         for (int i=0; i<N; i++) {
             String name = pkg.requestedPermissions.get(i);
@@ -3247,7 +3241,7 @@
                         if ((pkg.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) {
                             // For updated system applications, the signatureOrSystem permission
                             // is granted only if it had been defined by the original application.
-                            if ((pkg.applicationInfo.flags 
+                            if ((pkg.applicationInfo.flags
                                     & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)  != 0) {
                                 PackageSetting sysPs = mSettings.getDisabledSystemPkg(pkg.packageName);
                                 if(sysPs.grantedPermissions.contains(perm)) {
@@ -3315,7 +3309,7 @@
                         + " in package " + pkg.packageName);
             }
         }
-        
+
         if ((addedPermission || replace) && !ps.permissionsFixed &&
                 ((ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0) ||
                 ((ps.pkgFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0)){
@@ -3411,7 +3405,7 @@
             }
             return true;
         }
-        
+
         @Override
         protected ResolveInfo newResult(PackageParser.ActivityIntentInfo info,
                 int match) {
@@ -3561,7 +3555,7 @@
             }
             return true;
         }
-        
+
         @Override
         protected ResolveInfo newResult(PackageParser.ServiceIntentInfo filter,
                 int match) {
@@ -3762,14 +3756,14 @@
             final Uri packageURI, final IPackageInstallObserver observer, final int flags) {
         installPackage(packageURI, observer, flags, null);
     }
-    
+
     /* Called when a downloaded package installation has been confirmed by the user */
     public void installPackage(
             final Uri packageURI, final IPackageInstallObserver observer, final int flags,
             final String installerPackageName) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.INSTALL_PACKAGES, null);
-        
+
         // Queue up an async operation since the package installation may take a little while.
         mHandler.post(new Runnable() {
             public void run() {
@@ -3825,12 +3819,12 @@
         int returnCode;
         PackageRemovedInfo removedInfo;
     }
-    
+
     /*
      * Install a non-existing package.
      */
     private void installNewPackageLI(String pkgName,
-            File tmpPackageFile, 
+            File tmpPackageFile,
             String destFilePath, File destPackageFile, File destResourceFile,
             PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             String installerPackageName, PackageInstalledInfo res) {
@@ -3846,7 +3840,7 @@
         synchronized(mPackages) {
             if (mPackages.containsKey(pkgName) || mAppDirs.containsKey(destFilePath)) {
                 // Don't allow installation over an existing package with the same name.
-                Log.w(TAG, "Attempt to re-install " + pkgName 
+                Log.w(TAG, "Attempt to re-install " + pkgName
                         + " without first uninstalling.");
                 res.returnCode = PackageManager.INSTALL_FAILED_ALREADY_EXISTS;
                 return;
@@ -3861,7 +3855,7 @@
         PackageParser.Package newPackage = scanPackageLI(tmpPackageFile, destPackageFile,
                 destResourceFile, pkg, 0,
                 SCAN_MONITOR | SCAN_FORCE_DEX
-                | SCAN_UPDATE_SIGNATURE 
+                | SCAN_UPDATE_SIGNATURE
                 | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
                 | (newInstall ? SCAN_NEW_INSTALL : 0));
         if (newPackage == null) {
@@ -3870,9 +3864,9 @@
                 res.returnCode = PackageManager.INSTALL_FAILED_INVALID_APK;
             }
         } else {
-            updateSettingsLI(pkgName, tmpPackageFile, 
+            updateSettingsLI(pkgName, tmpPackageFile,
                     destFilePath, destPackageFile,
-                    destResourceFile, pkg, 
+                    destResourceFile, pkg,
                     newPackage,
                     true,
                     forwardLocked,
@@ -3892,9 +3886,9 @@
             }
         }
     }
-    
+
     private void replacePackageLI(String pkgName,
-            File tmpPackageFile, 
+            File tmpPackageFile,
             String destFilePath, File destPackageFile, File destResourceFile,
             PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             String installerPackageName, PackageInstalledInfo res) {
@@ -3912,7 +3906,7 @@
         boolean sysPkg = ((oldPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
         if(sysPkg) {
             replaceSystemPackageLI(oldPackage,
-                    tmpPackageFile, destFilePath, 
+                    tmpPackageFile, destFilePath,
                     destPackageFile, destResourceFile, pkg, forwardLocked,
                     newInstall, installerPackageName, res);
         } else {
@@ -3921,9 +3915,9 @@
                     newInstall, installerPackageName, res);
         }
     }
-    
+
     private void replaceNonSystemPackageLI(PackageParser.Package deletedPackage,
-            File tmpPackageFile, 
+            File tmpPackageFile,
             String destFilePath, File destPackageFile, File destResourceFile,
             PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             String installerPackageName, PackageInstalledInfo res) {
@@ -3931,12 +3925,12 @@
         String pkgName = deletedPackage.packageName;
         boolean deletedPkg = true;
         boolean updatedSettings = false;
-        
+
         String oldInstallerPackageName = null;
         synchronized (mPackages) {
             oldInstallerPackageName = mSettings.getInstallerPackageName(pkgName);
         }
-        
+
         int parseFlags = PackageManager.INSTALL_REPLACE_EXISTING;
         // First delete the existing package while retaining the data directory
         if (!deletePackageLI(pkgName, false, PackageManager.DONT_DELETE_DATA,
@@ -3950,7 +3944,7 @@
             newPackage = scanPackageLI(tmpPackageFile, destPackageFile,
                     destResourceFile, pkg, parseFlags,
                     SCAN_MONITOR | SCAN_FORCE_DEX
-                    | SCAN_UPDATE_SIGNATURE 
+                    | SCAN_UPDATE_SIGNATURE
                     | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
                     | (newInstall ? SCAN_NEW_INSTALL : 0));
             if (newPackage == null) {
@@ -3959,12 +3953,12 @@
                     res.returnCode = PackageManager.INSTALL_FAILED_INVALID_APK;
                 }
             } else {
-                updateSettingsLI(pkgName, tmpPackageFile, 
+                updateSettingsLI(pkgName, tmpPackageFile,
                         destFilePath, destPackageFile,
-                        destResourceFile, pkg, 
+                        destResourceFile, pkg,
                         newPackage,
                         true,
-                        forwardLocked,  
+                        forwardLocked,
                         installerPackageName,
                         res);
                 updatedSettings = true;
@@ -4032,9 +4026,9 @@
             }
         }
     }
-    
+
     private void replaceSystemPackageLI(PackageParser.Package deletedPackage,
-            File tmpPackageFile, 
+            File tmpPackageFile,
             String destFilePath, File destPackageFile, File destResourceFile,
             PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
             String installerPackageName, PackageInstalledInfo res) {
@@ -4052,7 +4046,7 @@
         PackageSetting oldPkgSetting;
         synchronized (mPackages) {
             oldPkg = mPackages.get(packageName);
-            oldPkgSetting = mSettings.mPackages.get(packageName);  
+            oldPkgSetting = mSettings.mPackages.get(packageName);
             if((oldPkg == null) || (oldPkg.applicationInfo == null) ||
                     (oldPkgSetting == null)) {
                 Log.w(TAG, "Could'nt find package:"+packageName+" information");
@@ -4073,7 +4067,7 @@
         newPackage = scanPackageLI(tmpPackageFile, destPackageFile,
                 destResourceFile, pkg, parseFlags,
                 SCAN_MONITOR | SCAN_FORCE_DEX
-                | SCAN_UPDATE_SIGNATURE 
+                | SCAN_UPDATE_SIGNATURE
                 | (forwardLocked ? SCAN_FORWARD_LOCKED : 0)
                 | (newInstall ? SCAN_NEW_INSTALL : 0));
         if (newPackage == null) {
@@ -4082,9 +4076,9 @@
                 res.returnCode = PackageManager.INSTALL_FAILED_INVALID_APK;
             }
         } else {
-            updateSettingsLI(packageName, tmpPackageFile, 
+            updateSettingsLI(packageName, tmpPackageFile,
                     destFilePath, destPackageFile,
-                    destResourceFile, pkg, 
+                    destResourceFile, pkg,
                     newPackage,
                     true,
                     forwardLocked,
@@ -4108,7 +4102,7 @@
                 removePackageLI(newPackage, true);
             }
             // Add back the old system package
-            scanPackageLI(oldPkgSetting.codePath, oldPkgSetting.codePath, 
+            scanPackageLI(oldPkgSetting.codePath, oldPkgSetting.codePath,
                     oldPkgSetting.resourcePath,
                     oldPkg, parseFlags,
                     SCAN_MONITOR
@@ -4124,14 +4118,14 @@
             }
         }
     }
-   
-    private void updateSettingsLI(String pkgName, File tmpPackageFile, 
+
+    private void updateSettingsLI(String pkgName, File tmpPackageFile,
             String destFilePath, File destPackageFile,
-            File destResourceFile, 
-            PackageParser.Package pkg, 
+            File destResourceFile,
+            PackageParser.Package pkg,
             PackageParser.Package newPackage,
             boolean replacingExistingPackage,
-            boolean forwardLocked,  
+            boolean forwardLocked,
             String installerPackageName, PackageInstalledInfo res) {
         synchronized (mPackages) {
             //write settings. the installStatus will be incomplete at this stage.
@@ -4158,8 +4152,8 @@
             Log.e(TAG, "Couldn't move package file to: " + destPackageFile);
             res.returnCode =  PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;
         } else {
-            res.returnCode = setPermissionsLI(pkgName, newPackage, destFilePath, 
-                    destResourceFile, 
+            res.returnCode = setPermissionsLI(pkgName, newPackage, destFilePath,
+                    destResourceFile,
                     forwardLocked);
             if(res.returnCode != PackageManager.INSTALL_SUCCEEDED) {
                 return;
@@ -4185,7 +4179,7 @@
             mSettings.writeLP();
         }
     }
-    
+
     private File getFwdLockedResource(String pkgName) {
         final String publicZipFileName = pkgName + ".zip";
         return new File(mAppInstallDir, publicZipFileName);
@@ -4302,7 +4296,7 @@
                 res.returnCode = pp.getParseError();
                 break main_flow;
             }
-            
+
             synchronized (mPackages) {
                 //check if installing already existing package
                 if ((pFlags&PackageManager.INSTALL_REPLACE_EXISTING) != 0
@@ -4310,16 +4304,16 @@
                     replacingExistingPackage = true;
                 }
             }
-            
+
             if(replacingExistingPackage) {
                 replacePackageLI(pkgName,
-                        tmpPackageFile, 
+                        tmpPackageFile,
                         destFilePath, destPackageFile, destResourceFile,
                         pkg, forwardLocked, newInstall, installerPackageName,
                         res);
             } else {
                 installNewPackageLI(pkgName,
-                        tmpPackageFile, 
+                        tmpPackageFile,
                         destFilePath, destPackageFile, destResourceFile,
                         pkg, forwardLocked, newInstall, installerPackageName,
                         res);
@@ -4330,7 +4324,7 @@
             }
         }
     }
-    
+
     private int setPermissionsLI(String pkgName,
             PackageParser.Package newPackage,
             String destFilePath,
@@ -4431,7 +4425,7 @@
         }
         outZipStream.flush();
     }
-    
+
     private void deleteTempPackageFiles() {
         FilenameFilter filter = new FilenameFilter() {
             public boolean accept(File dir, String name) {
@@ -4487,13 +4481,13 @@
             } //end run
         });
     }
-    
+
     /**
      *  This method is an internal method that could be get invoked either
      *  to delete an installed package or to clean up a failed installation.
      *  After deleting an installed package, a broadcast is sent to notify any
      *  listeners that the package has been installed. For cleaning up a failed
-     *  installation, the broadcast is not necessary since the package's 
+     *  installation, the broadcast is not necessary since the package's
      *  installation wouldn't have sent the initial broadcast either
      *  The key steps in deleting a package are
      *  deleting the package information in internal structures like mPackages,
@@ -4511,7 +4505,7 @@
         synchronized (mInstallLock) {
             res = deletePackageLI(packageName, deleteCodeAndResources, flags, info);
         }
-        
+
         if(res && sendBroadCast) {
             boolean systemUpdate = info.isRemovedPackageSystemUpdate;
             info.sendBroadcast(deleteCodeAndResources, systemUpdate);
@@ -4551,14 +4545,14 @@
             }
         }
     }
-    
+
     /*
      * This method deletes the package from internal data structures. If the DONT_DELETE_DATA
      * flag is not set, the data directory is removed as well.
-     * make sure this flag is set for partially installed apps. If not its meaningless to 
+     * make sure this flag is set for partially installed apps. If not its meaningless to
      * delete a partially installed application.
      */
-    private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo, 
+    private void removePackageDataLI(PackageParser.Package p, PackageRemovedInfo outInfo,
             int flags) {
         String packageName = p.packageName;
         if (outInfo != null) {
@@ -4600,7 +4594,7 @@
             mSettings.writeLP ();
         }
     }
-    
+
     /*
      * Tries to delete system package.
      */
@@ -4652,7 +4646,7 @@
         PackageParser.Package newPkg = scanPackageLI(ps.codePath, ps.codePath, ps.resourcePath,
                 PackageParser.PARSE_MUST_BE_APK | PackageParser.PARSE_IS_SYSTEM,
                 SCAN_MONITOR);
-        
+
         if (newPkg == null) {
             Log.w(TAG, "Failed to restore system package:"+p.packageName+" with error:" + mLastScanError);
             return false;
@@ -4693,7 +4687,7 @@
             }
         }
     }
-    
+
     private boolean deleteInstalledPackageLI(PackageParser.Package p,
             boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
         ApplicationInfo applicationInfo = p.applicationInfo;
@@ -4715,7 +4709,7 @@
         }
         return true;
     }
-    
+
     /*
      * This method handles package deletion in general
      */
@@ -4744,7 +4738,7 @@
             Log.w(TAG, "Package named '" + packageName +"' doesn't exist.");
             return false;
         }
-        
+
         if (dataOnly) {
             // Delete application data first
             removePackageDataLI(p, outInfo, flags);
@@ -4764,7 +4758,7 @@
         Log.i(TAG, "Removing non-system package:"+p.packageName);
         return deleteInstalledPackageLI (p, deleteCodeAndResources, flags, outInfo);
     }
-    
+
     public void clearApplicationUserData(final String packageName,
             final IPackageDataObserver observer) {
         mContext.enforceCallingOrSelfPermission(
@@ -4795,7 +4789,7 @@
             } //end run
         });
     }
-    
+
     private boolean clearApplicationUserDataLI(String packageName) {
         if (packageName == null) {
             Log.w(TAG, "Attempt to delete null packageName.");
@@ -4959,7 +4953,7 @@
         return true;
     }
 
-        
+
     public void addPackageToPreferred(String packageName) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
@@ -5187,7 +5181,7 @@
         extras.putStringArray(Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST, nameList);
         extras.putBoolean(Intent.EXTRA_DONT_KILL_APP, killFlag);
         extras.putInt(Intent.EXTRA_UID, packageUid);
-        sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED,  packageName, extras);   
+        sendPackageBroadcast(Intent.ACTION_PACKAGE_CHANGED,  packageName, extras);
     }
 
     public String getInstallerPackageName(String packageName) {
@@ -5199,7 +5193,7 @@
             return pkg.installerPackageName;
         }
     }
-    
+
     public int getApplicationEnabledSetting(String appPackageName) {
         synchronized (mPackages) {
             PackageSetting pkg = mSettings.mPackages.get(appPackageName);
@@ -5261,7 +5255,7 @@
         buf.append(']');
         return buf.toString();
     }
-    
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
@@ -5317,31 +5311,31 @@
                         pw.print("    targetSdk="); pw.println(ps.pkg.applicationInfo.targetSdkVersion);
                         pw.print("    supportsScreens=[");
                         boolean first = true;
-                        if ((ps.pkg.applicationInfo.flags & 
+                        if ((ps.pkg.applicationInfo.flags &
                                 ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS) != 0) {
                             if (!first) pw.print(", ");
                             first = false;
                             pw.print("medium");
                         }
-                        if ((ps.pkg.applicationInfo.flags & 
+                        if ((ps.pkg.applicationInfo.flags &
                                 ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS) != 0) {
                             if (!first) pw.print(", ");
                             first = false;
                             pw.print("large");
                         }
-                        if ((ps.pkg.applicationInfo.flags & 
+                        if ((ps.pkg.applicationInfo.flags &
                                 ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS) != 0) {
                             if (!first) pw.print(", ");
                             first = false;
                             pw.print("small");
                         }
-                        if ((ps.pkg.applicationInfo.flags & 
+                        if ((ps.pkg.applicationInfo.flags &
                                 ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS) != 0) {
                             if (!first) pw.print(", ");
                             first = false;
                             pw.print("resizeable");
                         }
-                        if ((ps.pkg.applicationInfo.flags & 
+                        if ((ps.pkg.applicationInfo.flags &
                                 ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES) != 0) {
                             if (!first) pw.print(", ");
                             first = false;
@@ -5674,7 +5668,7 @@
                 mSignatures[i] = sigs[i];
             }
         }
-        
+
         @Override
         public String toString() {
             StringBuffer buf = new StringBuffer(128);
@@ -5860,17 +5854,17 @@
 
     static class GrantedPermissions {
         int pkgFlags;
-        
+
         HashSet<String> grantedPermissions = new HashSet<String>();
         int[] gids;
-        
+
         HashSet<String> loadedPermissions = new HashSet<String>();
-        
+
         GrantedPermissions(int pkgFlags) {
             this.pkgFlags = pkgFlags & ApplicationInfo.FLAG_SYSTEM;
         }
     }
-    
+
     /**
      * Settings base class for pending and resolved classes.
      */
@@ -5887,14 +5881,14 @@
         PackageSignatures signatures = new PackageSignatures();
 
         boolean permissionsFixed;
-        
+
         /* Explicitly disabled components */
         HashSet<String> disabledComponents = new HashSet<String>(0);
         /* Explicitly enabled components */
         HashSet<String> enabledComponents = new HashSet<String>(0);
         int enabled = COMPONENT_ENABLED_STATE_DEFAULT;
         int installStatus = PKG_INSTALL_COMPLETE;
-        
+
         /* package name of the app that installed this package */
         String installerPackageName;
 
@@ -5912,19 +5906,19 @@
         public void setInstallerPackageName(String packageName) {
             installerPackageName = packageName;
         }
-        
+
         String getInstallerPackageName() {
             return installerPackageName;
         }
-        
+
         public void setInstallStatus(int newStatus) {
             installStatus = newStatus;
         }
-        
+
         public int getInstallStatus() {
             return installStatus;
         }
-        
+
         public void setTimeStamp(long newStamp) {
             if (newStamp != timeStamp) {
                 timeStamp = newStamp;
@@ -5936,11 +5930,11 @@
             timeStamp = newStamp;
             timeStampString = newStampStr;
         }
-        
+
         public long getTimeStamp() {
             return timeStamp;
         }
-        
+
         public String getTimeStampStr() {
             return timeStampString;
         }
@@ -5949,7 +5943,7 @@
             grantedPermissions = base.grantedPermissions;
             gids = base.gids;
             loadedPermissions = base.loadedPermissions;
-            
+
             timeStamp = base.timeStamp;
             timeStampString = base.timeStampString;
             signatures = base.signatures;
@@ -5998,7 +5992,7 @@
                 int pVersionCode, int pkgFlags) {
             super(name, codePath, resourcePath, pVersionCode, pkgFlags);
         }
-        
+
         @Override
         public String toString() {
             return "PackageSetting{"
@@ -6020,7 +6014,7 @@
             super(_pkgFlags);
             name = _name;
         }
-        
+
         @Override
         public String toString() {
             return "SharedUserSetting{"
@@ -6040,7 +6034,7 @@
         // List of replaced system applications
         final HashMap<String, PackageSetting> mDisabledSysPackages =
             new HashMap<String, PackageSetting>();
-        
+
         // The user's preferred activities associated with particular intent
         // filters.
         private final IntentResolver<PreferredActivity, PreferredActivity> mPreferredActivities =
@@ -6122,7 +6116,7 @@
                     resourcePath, pkg.mVersionCode, pkgFlags, create, add);
             return p;
         }
-        
+
         PackageSetting peekPackageLP(String name) {
             return mPackages.get(name);
             /*
@@ -6133,7 +6127,7 @@
             return null;
             */
         }
-        
+
         void setInstallStatus(String pkgName, int status) {
             PackageSetting p = mPackages.get(pkgName);
             if(p != null) {
@@ -6142,7 +6136,7 @@
                 }
             }
         }
-        
+
         void setInstallerPackageName(String pkgName,
                 String installerPkgName) {
             PackageSetting p = mPackages.get(pkgName);
@@ -6150,17 +6144,17 @@
                 p.setInstallerPackageName(installerPkgName);
             }
         }
-        
+
         String getInstallerPackageName(String pkgName) {
             PackageSetting p = mPackages.get(pkgName);
-            return (p == null) ? null : p.getInstallerPackageName(); 
+            return (p == null) ? null : p.getInstallerPackageName();
         }
 
         int getInstallStatus(String pkgName) {
             PackageSetting p = mPackages.get(pkgName);
             if(p != null) {
                 return p.getInstallStatus();
-            } 
+            }
             return -1;
         }
 
@@ -6204,7 +6198,7 @@
             }
             return removePackageLP(name);
         }
-        
+
         PackageSetting enableSystemPackageLP(String name) {
             PackageSetting p = mDisabledSysPackages.get(name);
             if(p == null) {
@@ -6220,7 +6214,7 @@
             mDisabledSysPackages.remove(name);
             return ret;
         }
-        
+
         PackageSetting addPackageLP(String name, File codePath,
                 File resourcePath, int uid, int vc, int pkgFlags) {
             PackageSetting p = mPackages.get(name);
@@ -6341,7 +6335,7 @@
                     return null;
                 }
                 if (add) {
-                    // Finish adding new package by adding it and updating shared 
+                    // Finish adding new package by adding it and updating shared
                     // user preferences
                     addPackageSettingLP(p, name, sharedUser);
                 }
@@ -6517,7 +6511,7 @@
                 mOtherUserIds.remove(uid);
             }
         }
-        
+
         void writeLP() {
             //Debug.startMethodTracing("/data/system/packageprof", 8 * 1024 * 1024);
 
@@ -6566,7 +6560,7 @@
                 for (PackageSetting pkg : mPackages.values()) {
                     writePackage(serializer, pkg);
                 }
-                
+
                 for (PackageSetting pkg : mDisabledSysPackages.values()) {
                     writeDisabledSysPackage(serializer, pkg);
                 }
@@ -6625,8 +6619,8 @@
             }
             //Debug.stopMethodTracing();
         }
-       
-        void writeDisabledSysPackage(XmlSerializer serializer, final PackageSetting pkg) 
+
+        void writeDisabledSysPackage(XmlSerializer serializer, final PackageSetting pkg)
         throws java.io.IOException {
             serializer.startTag(null, "updated-package");
             serializer.attribute(null, "name", pkg.name);
@@ -6663,8 +6657,8 @@
             serializer.endTag(null, "perms");
             serializer.endTag(null, "updated-package");
         }
-        
-        void writePackage(XmlSerializer serializer, final PackageSetting pkg) 
+
+        void writePackage(XmlSerializer serializer, final PackageSetting pkg)
         throws java.io.IOException {
             serializer.startTag(null, "package");
             serializer.attribute(null, "name", pkg.name);
@@ -6729,10 +6723,10 @@
                 }
                 serializer.endTag(null, "enabled-components");
             }
-            
+
             serializer.endTag(null, "package");
         }
-        
+
         void writePermission(XmlSerializer serializer, BasePermission bp)
                 throws XmlPullParserException, java.io.IOException {
             if (bp.type != BasePermission.TYPE_BUILTIN
@@ -6783,7 +6777,7 @@
             }
             return ret;
         }
-        
+
         boolean readLP() {
             FileInputStream str = null;
             if (mBackupSettingsFilename.exists()) {
@@ -6976,7 +6970,7 @@
                 XmlUtils.skipCurrentTag(parser);
             }
         }
-        
+
         private void readDisabledSysPackageLP(XmlPullParser parser)
         throws XmlPullParserException, IOException {
             String name = parser.getAttributeValue(null, "name");
@@ -6993,11 +6987,11 @@
                 } catch (NumberFormatException e) {
                 }
             }
-            
+
             int pkgFlags = 0;
             pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
-            PackageSetting ps = new PackageSetting(name, 
-                    new File(codePathStr), 
+            PackageSetting ps = new PackageSetting(name,
+                    new File(codePathStr),
                     new File(resourcePathStr), versionCode, pkgFlags);
             String timeStampStr = parser.getAttributeValue(null, "ts");
             if (timeStampStr != null) {
@@ -7036,7 +7030,7 @@
             }
             mDisabledSysPackages.put(name, ps);
         }
-        
+
         private void readPackageLP(XmlPullParser parser)
                 throws XmlPullParserException, IOException {
             String name = null;
@@ -7098,7 +7092,7 @@
                             "Error in package manager settings: <package> has no codePath at "
                             + parser.getPositionDescription());
                 } else if (userId > 0) {
-                    packageSetting = addPackageLP(name.intern(), new File(codePathStr), 
+                    packageSetting = addPackageLP(name.intern(), new File(codePathStr),
                             new File(resourcePathStr), userId, versionCode, pkgFlags);
                     if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name
                             + ": userId=" + userId + " pkg=" + packageSetting);
@@ -7166,7 +7160,7 @@
                         packageSetting.installStatus = PKG_INSTALL_COMPLETE;
                     }
                 }
-                
+
                 int outerDepth = parser.getDepth();
                 int type;
                 while ((type=parser.next()) != XmlPullParser.END_DOCUMENT
@@ -7411,7 +7405,7 @@
             mUserIds.add(obj);
             return FIRST_APPLICATION_UID + N;
         }
-        
+
         public PackageSetting getDisabledSystemPkg(String name) {
             synchronized(mPackages) {
                 PackageSetting ps = mDisabledSysPackages.get(name);
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 6e769c7..e11c312 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -133,7 +133,7 @@
     static final boolean ANIMATE_SCREEN_LIGHTS = true;
     static final boolean ANIMATE_BUTTON_LIGHTS = false;
     static final boolean ANIMATE_KEYBOARD_LIGHTS = false;
-    
+
     static final int ANIM_STEPS = 60/4;
     // Slower animation for autobrightness changes
     static final int AUTOBRIGHTNESS_ANIM_STEPS = 60;
@@ -144,14 +144,7 @@
     static final int INITIAL_SCREEN_BRIGHTNESS = 255;
     static final int INITIAL_BUTTON_BRIGHTNESS = Power.BRIGHTNESS_OFF;
     static final int INITIAL_KEYBOARD_BRIGHTNESS = Power.BRIGHTNESS_OFF;
-    
-    static final int LOG_POWER_SLEEP_REQUESTED = 2724;
-    static final int LOG_POWER_SCREEN_BROADCAST_SEND = 2725;
-    static final int LOG_POWER_SCREEN_BROADCAST_DONE = 2726;
-    static final int LOG_POWER_SCREEN_BROADCAST_STOP = 2727;
-    static final int LOG_POWER_SCREEN_STATE = 2728;
-    static final int LOG_POWER_PARTIAL_WAKE_STATE = 2729;
-    
+
     private final int MY_UID;
 
     private boolean mDoneBooting = false;
@@ -419,7 +412,7 @@
 
         // assume nothing is on yet
         mUserState = mPowerState = 0;
-        
+
         // Add ourself to the Watchdog monitors.
         Watchdog.getInstance().addMonitor(this);
     }
@@ -447,7 +440,7 @@
             }
         };
         mHandlerThread.start();
-        
+
         synchronized (mHandlerThread) {
             while (!mInitComplete) {
                 try {
@@ -458,7 +451,7 @@
             }
         }
     }
-    
+
     void initInThread() {
         mHandler = new Handler();
 
@@ -686,7 +679,7 @@
             if (newlock) {
                 mPartialCount++;
                 if (mPartialCount == 1) {
-                    if (LOG_PARTIAL_WL) EventLog.writeEvent(LOG_POWER_PARTIAL_WAKE_STATE, 1, tag);
+                    if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 1, tag);
                 }
             }
             Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME);
@@ -731,7 +724,7 @@
         if (wl == null) {
             return;
         }
-        
+
         if (mSpew) {
             Log.d(TAG, "releaseWakeLock flags=0x"
                     + Integer.toHexString(wl.flags) + " tag=" + wl.tag);
@@ -748,7 +741,7 @@
         else if ((wl.flags & LOCK_MASK) == PowerManager.PARTIAL_WAKE_LOCK) {
             mPartialCount--;
             if (mPartialCount == 0) {
-                if (LOG_PARTIAL_WL) EventLog.writeEvent(LOG_POWER_PARTIAL_WAKE_STATE, 0, wl.tag);
+                if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag);
                 Power.releaseWakeLock(PARTIAL_NAME);
             }
         } else if ((wl.flags & LOCK_MASK) == PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK) {
@@ -855,7 +848,7 @@
 
             int oldCumulativeTimeout = oldPokey & POKE_LOCK_TIMEOUT_MASK;
             int newCumulativeTimeout = pokey & POKE_LOCK_TIMEOUT_MASK;
-            
+
             if (oldCumulativeTimeout != newCumulativeTimeout) {
                 setScreenOffTimeoutsLocked();
                 // reset the countdown timer, but use the existing nextState so it doesn't
@@ -958,7 +951,7 @@
         mScreenBrightness.dump(pw, "  mScreenBrightness: ");
         mKeyboardBrightness.dump(pw, "  mKeyboardBrightness: ");
         mButtonBrightness.dump(pw, "  mButtonBrightness: ");
-        
+
         int N = mLocks.size();
         pw.println();
         pw.println("mLocks.size=" + N + ":");
@@ -976,7 +969,7 @@
             pw.println("  " + type + " '" + wl.tag + "'" + acquireCausesWakeup
                     + activated + " (minState=" + wl.minState + ")");
         }
-        
+
         pw.println();
         pw.println("mPokeLocks.size=" + mPokeLocks.size() + ":");
         for (PokeLock p: mPokeLocks.values()) {
@@ -1106,7 +1099,7 @@
             index = -1;
             // The wake lock was being held, but we're not actually going to do any
             // broadcasts, so release the wake lock.
-            EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_STOP, 1, mBroadcastWakeLock.mCount);
+            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 1, mBroadcastWakeLock.mCount);
             mBroadcastWakeLock.release();
         }
 
@@ -1117,7 +1110,7 @@
             // We always increment the ref count for each notification in the queue
             // and always decrement when that notification is handled.
             mBroadcastWakeLock.acquire();
-            EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_SEND, mBroadcastWakeLock.mCount);
+            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_SEND, mBroadcastWakeLock.mCount);
             mHandler.post(mNotificationTask);
         }
     }
@@ -1141,7 +1134,7 @@
                 }
                 if (value == 1) {
                     mScreenOnStart = SystemClock.uptimeMillis();
-                    
+
                     policy.screenTurnedOn();
                     try {
                         ActivityManagerNative.getDefault().wakingUp();
@@ -1157,7 +1150,7 @@
                                 mScreenOnBroadcastDone, mHandler, 0, null, null);
                     } else {
                         synchronized (mLocks) {
-                            EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_STOP, 2,
+                            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2,
                                     mBroadcastWakeLock.mCount);
                             mBroadcastWakeLock.release();
                         }
@@ -1165,7 +1158,7 @@
                 }
                 else if (value == 0) {
                     mScreenOffStart = SystemClock.uptimeMillis();
-                    
+
                     policy.screenTurnedOff(why);
                     try {
                         ActivityManagerNative.getDefault().goingToSleep();
@@ -1178,7 +1171,7 @@
                                 mScreenOffBroadcastDone, mHandler, 0, null, null);
                     } else {
                         synchronized (mLocks) {
-                            EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_STOP, 3,
+                            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3,
                                     mBroadcastWakeLock.mCount);
                             mBroadcastWakeLock.release();
                         }
@@ -1197,7 +1190,7 @@
     private BroadcastReceiver mScreenOnBroadcastDone = new BroadcastReceiver() {
         public void onReceive(Context context, Intent intent) {
             synchronized (mLocks) {
-                EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_DONE, 1,
+                EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 1,
                         SystemClock.uptimeMillis() - mScreenOnStart, mBroadcastWakeLock.mCount);
                 mBroadcastWakeLock.release();
             }
@@ -1208,7 +1201,7 @@
     private BroadcastReceiver mScreenOffBroadcastDone = new BroadcastReceiver() {
         public void onReceive(Context context, Intent intent) {
             synchronized (mLocks) {
-                EventLog.writeEvent(LOG_POWER_SCREEN_BROADCAST_DONE, 0,
+                EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_DONE, 0,
                         SystemClock.uptimeMillis() - mScreenOffStart, mBroadcastWakeLock.mCount);
                 mBroadcastWakeLock.release();
             }
@@ -1492,7 +1485,7 @@
                     mLastTouchDown = 0;
                     mTotalTouchDownTime = 0;
                     mTouchCycles = 0;
-                    EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 1, reason,
+                    EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 1, reason,
                             mTotalTouchDownTime, mTouchCycles);
                     if (err == 0) {
                         mPowerState |= SCREEN_ON_BIT;
@@ -1522,12 +1515,12 @@
             }
         }
     }
-    
+
     private int screenOffFinishedAnimatingLocked(int reason) {
         // I don't think we need to check the current state here because all of these
-        // Power.setScreenState and sendNotificationLocked can both handle being 
+        // Power.setScreenState and sendNotificationLocked can both handle being
         // called multiple times in the same state. -joeo
-        EventLog.writeEvent(LOG_POWER_SCREEN_STATE, 0, reason, mTotalTouchDownTime, mTouchCycles);
+        EventLog.writeEvent(EventLogTags.POWER_SCREEN_STATE, 0, reason, mTotalTouchDownTime, mTouchCycles);
         mLastTouchDown = 0;
         int err = setScreenStateLocked(false);
         if (err == 0) {
@@ -1551,14 +1544,14 @@
         if (difference == 0) {
             return;
         }
-        
+
         int offMask = 0;
         int dimMask = 0;
         int onMask = 0;
 
         int preferredBrightness = getPreferredBrightness();
         boolean startAnimation = false;
-        
+
         if ((difference & KEYBOARD_BRIGHT_BIT) != 0) {
             if (ANIMATE_KEYBOARD_LIGHTS) {
                 if ((newState & KEYBOARD_BRIGHT_BIT) == 0) {
@@ -1697,7 +1690,7 @@
             mHandler.removeCallbacks(mLightAnimator);
             mHandler.post(mLightAnimator);
         }
-        
+
         if (offMask != 0) {
             //Log.i(TAG, "Setting brightess off: " + offMask);
             setLightBrightness(offMask, Power.BRIGHTNESS_OFF);
@@ -1739,24 +1732,24 @@
 
     class BrightnessState {
         final int mask;
-        
+
         boolean initialized;
         int targetValue;
         float curValue;
         float delta;
         boolean animating;
-        
+
         BrightnessState(int m) {
             mask = m;
         }
-        
+
         public void dump(PrintWriter pw, String prefix) {
             pw.println(prefix + "animating=" + animating
                     + " targetValue=" + targetValue
                     + " curValue=" + curValue
                     + " delta=" + delta);
         }
-        
+
         boolean setTargetLocked(int target, int stepsToTarget, int initialValue,
                 int nominalCurrentValue) {
             if (!initialized) {
@@ -1779,7 +1772,7 @@
             animating = true;
             return true;
         }
-        
+
         boolean stepLocked() {
             if (!animating) return false;
             if (false && mSpew) {
@@ -1814,7 +1807,7 @@
             return more;
         }
     }
-    
+
     private class LightAnimator implements Runnable {
         public void run() {
             synchronized (mLocks) {
@@ -1832,7 +1825,7 @@
             }
         }
     }
-    
+
     private int getPreferredBrightness() {
         try {
             if (mScreenBrightnessOverride >= 0) {
@@ -1992,7 +1985,7 @@
                     } finally {
                         Binder.restoreCallingIdentity(ident);
                     }
-                    
+
                     mWakeLockState = mLocks.reactivateScreenLocksLocked();
                     setPowerState(mUserState | mWakeLockState, noChangeLights,
                             WindowManagerPolicy.OFF_BECAUSE_OF_USER);
@@ -2129,7 +2122,7 @@
             goToSleepLocked(time, WindowManagerPolicy.OFF_BECAUSE_OF_USER);
         }
     }
-    
+
     /**
      * Reboot the device immediately, passing 'reason' (may be null)
      * to the underlying __reboot system call.  Should not return.
@@ -2159,7 +2152,7 @@
                     numCleared++;
                 }
             }
-            EventLog.writeEvent(LOG_POWER_SLEEP_REQUESTED, numCleared);
+            EventLog.writeEvent(EventLogTags.POWER_SLEEP_REQUESTED, numCleared);
             mStillNeedSleepNotification = true;
             mUserState = SCREEN_OFF;
             setPowerState(SCREEN_OFF, false, reason);
@@ -2175,7 +2168,7 @@
             return SystemClock.elapsedRealtime() - mScreenOffTime;
         }
     }
-    
+
     public void setKeyboardVisibility(boolean visible) {
         synchronized (mLocks) {
             if (mSpew) {
@@ -2345,7 +2338,7 @@
             }
             return result;
         }
-        
+
         int reactivateScreenLocksLocked()
         {
             int result = 0;
@@ -2378,7 +2371,7 @@
         }
         return mPolicy;
     }
-    
+
     void systemReady() {
         mSensorManager = new SensorManager(mHandlerThread.getLooper());
         mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index a0a9a93..73f930d 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -70,7 +70,7 @@
 
     @Override
     public void run() {
-        EventLog.writeEvent(LOG_BOOT_PROGRESS_SYSTEM_RUN,
+        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN,
             SystemClock.uptimeMillis());
 
         ActivityManagerService.prepareTraceFile(false);     // create dir
@@ -387,7 +387,7 @@
             } catch (RemoteException e) {
             }
         }
-        
+
         // It is now time to start up the app processes...
 
         if (notification != null) {
@@ -411,7 +411,7 @@
         final AppWidgetService appWidgetF = appWidget;
         final WallpaperManagerService wallpaperF = wallpaper;
         final InputMethodManagerService immF = imm;
-        
+
         // We now tell the activity manager it is okay to run third party
         // code.  It will call back into us once it has gotten to the state
         // where third party code can really run (but before it has actually
@@ -421,7 +421,7 @@
                 .systemReady(new Runnable() {
             public void run() {
                 Log.i(TAG, "Making services ready");
-                
+
                 if (batteryF != null) batteryF.systemReady();
                 if (connectivityF != null) connectivityF.systemReady();
                 if (dockF != null) dockF.systemReady();
@@ -429,13 +429,13 @@
 
                 // It is now okay to let the various system services start their
                 // third party code...
-                
+
                 if (appWidgetF != null) appWidgetF.systemReady(safeMode);
                 if (wallpaperF != null) wallpaperF.systemReady();
                 if (immF != null) immF.systemReady();
             }
         });
-        
+
         Looper.loop();
         Log.d(TAG, "System ServerThread is exiting!");
     }
diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java
index 68bf4fb..2ff9100 100644
--- a/services/java/com/android/server/Watchdog.java
+++ b/services/java/com/android/server/Watchdog.java
@@ -52,16 +52,6 @@
     static final int GLOBAL_PSS = 2719;
 
     static final int TIME_TO_WAIT = DB ? 15*1000 : 60*1000;
-    static final int EVENT_LOG_TAG = 2802;
-    static final int EVENT_LOG_PROC_PSS_TAG = 2803;
-    static final int EVENT_LOG_SOFT_RESET_TAG = 2804;
-    static final int EVENT_LOG_HARD_RESET_TAG = 2805;
-    static final int EVENT_LOG_PSS_STATS_TAG = 2806;
-    static final int EVENT_LOG_PROC_STATS_TAG = 2807;
-    static final int EVENT_LOG_SCHEDULED_REBOOT_TAG = 2808;
-    static final int EVENT_LOG_MEMINFO_TAG = 2809;
-    static final int EVENT_LOG_VMSTAT_TAG = 2810;
-    static final int EVENT_LOG_REQUESTED_REBOOT_TAG = 2811;
 
     static final int MEMCHECK_DEFAULT_INTERVAL = DB ? 30 : 30*60; // 30 minutes
     static final int MEMCHECK_DEFAULT_LOG_REALTIME_INTERVAL = DB ? 60 : 2*60*60;      // 2 hours
@@ -188,7 +178,7 @@
             } else {
                 mState = STATE_HARD;
             }
-            EventLog.writeEvent(EVENT_LOG_PROC_PSS_TAG, mProcessName, pid, mLastPss);
+            EventLog.writeEvent(EventLogTags.WATCHDOG_PROC_PSS, mProcessName, pid, mLastPss);
 
             if (mState == STATE_OK) {
                 // Memory is good, don't recover.
@@ -197,7 +187,7 @@
 
             if (mState == STATE_HARD) {
                 // Memory is really bad, kill right now.
-                EventLog.writeEvent(EVENT_LOG_HARD_RESET_TAG, mProcessName, pid,
+                EventLog.writeEvent(EventLogTags.WATCHDOG_HARD_RESET, mProcessName, pid,
                         mHardThreshold, mLastPss);
                 return mEnabled;
             }
@@ -212,7 +202,7 @@
             } else {
                 skipReason = shouldWeBeBrutalLocked(curTime);
             }
-            EventLog.writeEvent(EVENT_LOG_SOFT_RESET_TAG, mProcessName, pid,
+            EventLog.writeEvent(EventLogTags.WATCHDOG_SOFT_RESET, mProcessName, pid,
                     mSoftThreshold, mLastPss, skipReason != null ? skipReason : "");
             if (skipReason != null) {
                 mNeedScheduledCheck = true;
@@ -348,7 +338,7 @@
             mReqMinScreenOff = intent.getIntExtra("minScreenOff", -1);
             mReqMinNextAlarm = intent.getIntExtra("minNextAlarm", -1);
             mReqRecheckInterval = intent.getIntExtra("recheckInterval", -1);
-            EventLog.writeEvent(EVENT_LOG_REQUESTED_REBOOT_TAG,
+            EventLog.writeEvent(EventLogTags.WATCHDOG_REQUESTED_REBOOT,
                     mReqRebootNoWait ? 1 : 0, mReqRebootInterval,
                             mReqRecheckInterval, mReqRebootStartTime,
                     mReqRebootWindow, mReqMinScreenOff, mReqMinNextAlarm);
@@ -561,21 +551,21 @@
     void logGlobalMemory() {
         PssStats stats = mPssStats;
         mActivity.collectPss(stats);
-        EventLog.writeEvent(EVENT_LOG_PSS_STATS_TAG,
+        EventLog.writeEvent(EventLogTags.WATCHDOG_PSS_STATS,
                 stats.mEmptyPss, stats.mEmptyCount,
                 stats.mBackgroundPss, stats.mBackgroundCount,
                 stats.mServicePss, stats.mServiceCount,
                 stats.mVisiblePss, stats.mVisibleCount,
                 stats.mForegroundPss, stats.mForegroundCount,
                 stats.mNoPssCount);
-        EventLog.writeEvent(EVENT_LOG_PROC_STATS_TAG,
+        EventLog.writeEvent(EventLogTags.WATCHDOG_PROC_STATS,
                 stats.mProcDeaths[0], stats.mProcDeaths[1], stats.mProcDeaths[2],
                 stats.mProcDeaths[3], stats.mProcDeaths[4]);
         Process.readProcLines("/proc/meminfo", mMemInfoFields, mMemInfoSizes);
         for (int i=0; i<mMemInfoSizes.length; i++) {
             mMemInfoSizes[i] *= 1024;
         }
-        EventLog.writeEvent(EVENT_LOG_MEMINFO_TAG,
+        EventLog.writeEvent(EventLogTags.WATCHDOG_MEMINFO,
                 (int)mMemInfoSizes[0], (int)mMemInfoSizes[1], (int)mMemInfoSizes[2],
                 (int)mMemInfoSizes[3], (int)mMemInfoSizes[4],
                 (int)mMemInfoSizes[5], (int)mMemInfoSizes[6], (int)mMemInfoSizes[7],
@@ -589,7 +579,7 @@
             mVMStatSizes[i] -= mPrevVMStatSizes[i];
             mPrevVMStatSizes[i] = v;
         }
-        EventLog.writeEvent(EVENT_LOG_VMSTAT_TAG, dur,
+        EventLog.writeEvent(EventLogTags.WATCHDOG_VMSTAT, dur,
                 (int)mVMStatSizes[0], (int)mVMStatSizes[1], (int)mVMStatSizes[2],
                 (int)mVMStatSizes[3], (int)mVMStatSizes[4]);
     }
@@ -635,7 +625,7 @@
                     (now-mBootTime) >= (rebootIntervalMillis-rebootWindowMillis)) {
                 if (fromAlarm && rebootWindowMillis <= 0) {
                     // No reboot window -- just immediately reboot.
-                    EventLog.writeEvent(EVENT_LOG_SCHEDULED_REBOOT_TAG, now,
+                    EventLog.writeEvent(EventLogTags.WATCHDOG_SCHEDULED_REBOOT, now,
                             (int)rebootIntervalMillis, (int)rebootStartTime*1000,
                             (int)rebootWindowMillis, "");
                     rebootSystem("Checkin scheduled forced");
@@ -649,7 +639,7 @@
                             now, rebootStartTime);
                 } else if (now < (realStartTime+rebootWindowMillis)) {
                     String doit = shouldWeBeBrutalLocked(now);
-                    EventLog.writeEvent(EVENT_LOG_SCHEDULED_REBOOT_TAG, now,
+                    EventLog.writeEvent(EventLogTags.WATCHDOG_SCHEDULED_REBOOT, now,
                             (int)rebootInterval, (int)rebootStartTime*1000,
                             (int)rebootWindowMillis, doit != null ? doit : "");
                     if (doit == null) {
@@ -838,7 +828,7 @@
             // First send a SIGQUIT so that we can see where it was hung. Then
             // kill this process so that the system will restart.
             String name = (mCurrentMonitor != null) ? mCurrentMonitor.getClass().getName() : "null";
-            EventLog.writeEvent(EVENT_LOG_TAG, name);
+            EventLog.writeEvent(EventLogTags.WATCHDOG, name);
             Process.sendSignal(Process.myPid(), Process.SIGNAL_QUIT);
 
             // Wait a bit longer before killing so we can make sure that the stacks are captured.
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 0ea832b..987a24e 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -25,6 +25,7 @@
 import android.app.AlarmManager;
 import android.app.PendingIntent;
 import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothDevice;
 import android.content.BroadcastReceiver;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -62,6 +63,7 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
@@ -109,7 +111,7 @@
     private int mMulticastDisabled;
 
     private final IBatteryStats mBatteryStats;
-    
+
     /**
      * See {@link Settings.Gservices#WIFI_IDLE_MS}. This is the default value if a
      * Settings.Gservices value is not present. This timeout value is chosen as
@@ -162,7 +164,7 @@
      * Last UID that asked to enable WIFI.
      */
     private int mLastEnableUid = Process.myUid();
-    
+
     /**
      * Number of allowed radio frequency channels in various regulatory domains.
      * This list is sufficient for 802.11b/g networks (2.4GHz range).
@@ -177,7 +179,7 @@
         mWifiStateTracker = tracker;
         mWifiStateTracker.enableRssiPolling(true);
         mBatteryStats = BatteryStatsService.getService();
-        
+
         mScanResultCache = new LinkedHashMap<String, ScanResult>(
             SCAN_RESULT_CACHE_SIZE, 0.75f, true) {
                 /*
@@ -396,7 +398,7 @@
         } finally {
             Binder.restoreCallingIdentity(ident);
         }
-        
+
         // Update state
         mWifiState = wifiState;
 
@@ -1380,11 +1382,16 @@
                 }
                 mPluggedType = pluggedType;
             } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
-                boolean isBluetoothPlaying =
-                        intent.getIntExtra(
-                                BluetoothA2dp.EXTRA_SINK_STATE,
-                                BluetoothA2dp.STATE_DISCONNECTED) == BluetoothA2dp.STATE_PLAYING;
+                BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
+                Set<BluetoothDevice> sinks = a2dp.getConnectedSinks();
+                boolean isBluetoothPlaying = false;
+                for (BluetoothDevice sink : sinks) {
+                    if (a2dp.getSinkState(sink) == BluetoothA2dp.STATE_PLAYING) {
+                        isBluetoothPlaying = true;
+                    }
+                }
                 mWifiStateTracker.setBluetoothScanMode(isBluetoothPlaying);
+
             } else {
                 return;
             }
@@ -1396,7 +1403,7 @@
          * Determines whether the Wi-Fi chipset should stay awake or be put to
          * sleep. Looks at the setting for the sleep policy and the current
          * conditions.
-         * 
+         *
          * @see #shouldDeviceStayAwake(int, int)
          */
         private boolean shouldWifiStayAwake(int stayAwakeConditions, int pluggedType) {
@@ -1415,7 +1422,7 @@
                 return shouldDeviceStayAwake(stayAwakeConditions, pluggedType);
             }
         }
-        
+
         /**
          * Determine whether the bit value corresponding to {@code pluggedType} is set in
          * the bit string {@code stayAwakeConditions}. Because a {@code pluggedType} value
@@ -1509,7 +1516,7 @@
         intentFilter.addAction(BluetoothA2dp.ACTION_SINK_STATE_CHANGED);
         mContext.registerReceiver(mReceiver, intentFilter);
     }
-    
+
     private boolean isAirplaneSensitive() {
         String airplaneModeRadios = Settings.System.getString(mContext.getContentResolver(),
                 Settings.System.AIRPLANE_MODE_RADIOS);
diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java
index 05d340e..df011a2 100644
--- a/services/java/com/android/server/WindowManagerService.java
+++ b/services/java/com/android/server/WindowManagerService.java
@@ -152,8 +152,6 @@
     static final boolean BLUR = true;
     static final boolean localLOGV = DEBUG;
 
-    static final int LOG_WM_NO_SURFACE_MEMORY = 31000;
-
     /** How long to wait for subsequent key repeats, in milliseconds */
     static final int KEY_REPEAT_DELAY = 50;
 
@@ -193,7 +191,7 @@
     static final int INJECT_FAILED = 0;
     static final int INJECT_SUCCEEDED = 1;
     static final int INJECT_NO_PERMISSION = -1;
-    
+
     static final int UPDATE_FOCUS_NORMAL = 0;
     static final int UPDATE_FOCUS_WILL_ASSIGN_LAYERS = 1;
     static final int UPDATE_FOCUS_PLACING_SURFACES = 2;
@@ -309,13 +307,13 @@
      * animation.  It will be used for the next exit animation.
      */
     AppWindowToken mLastEnterAnimToken;
-    
+
     /**
      * These were the layout params used to retrieve the last enter animation.
      * They will be used for the next exit animation.
      */
     LayoutParams mLastEnterAnimParams;
-    
+
     /**
      * Z-ordered (bottom-most first) list of all Window objects.
      */
@@ -422,7 +420,7 @@
     final ArrayList<WindowState> mInputMethodDialogs = new ArrayList<WindowState>();
 
     final ArrayList<WindowToken> mWallpaperTokens = new ArrayList<WindowToken>();
-    
+
     // If non-null, this is the currently visible window that is associated
     // with the wallpaper.
     WindowState mWallpaperTarget = null;
@@ -447,7 +445,7 @@
     static final long WALLPAPER_TIMEOUT = 150;
     // Time we wait after a timeout before trying to wait again.
     static final long WALLPAPER_TIMEOUT_RECOVERY = 10000;
-    
+
     AppWindowToken mFocusedApp = null;
 
     PowerManagerService mPowerManager;
@@ -463,7 +461,7 @@
     Session mHoldingScreenOn;
 
     boolean mTurnOnScreen;
-    
+
     /**
      * Whether the UI is currently running in touch mode (not showing
      * navigational focus because the user is directly pressing the screen).
@@ -570,7 +568,7 @@
         if (MEASURE_LATENCY) {
             lt = new LatencyTimer(100, 1000);
         }
-        
+
         mContext = context;
         mHaveInputMethods = haveInputMethods;
         mLimitedAlphaCompositing = context.getResources().getBoolean(
@@ -728,7 +726,7 @@
                             i--;
                             break;
                         }
-                        
+
                         // We haven't reached the token yet; if this token
                         // is not going to the bottom and has windows, we can
                         // use it as an anchor for when we do reach the token.
@@ -1247,16 +1245,16 @@
                 || mUpperWallpaperTarget != null
                 || mLowerWallpaperTarget != null;
     }
-    
+
     static final int ADJUST_WALLPAPER_LAYERS_CHANGED = 1<<1;
     static final int ADJUST_WALLPAPER_VISIBILITY_CHANGED = 1<<2;
-    
+
     int adjustWallpaperWindowsLocked() {
         int changed = 0;
-        
+
         final int dw = mDisplay.getWidth();
         final int dh = mDisplay.getHeight();
-        
+
         // First find top-most window that has asked to be on top of the
         // wallpaper; all wallpapers go behind it.
         final ArrayList localmWindows = mWindows;
@@ -1332,19 +1330,19 @@
                 return 0;
             }
         }
-        
+
         if (mWallpaperTarget != foundW) {
             if (DEBUG_WALLPAPER) {
                 Log.v(TAG, "New wallpaper target: " + foundW
                         + " oldTarget: " + mWallpaperTarget);
             }
-            
+
             mLowerWallpaperTarget = null;
             mUpperWallpaperTarget = null;
-            
+
             WindowState oldW = mWallpaperTarget;
             mWallpaperTarget = foundW;
-            
+
             // Now what is happening...  if the current and new targets are
             // animating, then we are in our super special mode!
             if (foundW != null && oldW != null) {
@@ -1367,7 +1365,7 @@
                                     + "=" + oldW + "; new#" + foundI
                                     + "=" + foundW);
                         }
-                        
+
                         // Set the new target correctly.
                         if (foundW.mAppToken != null && foundW.mAppToken.hiddenRequested) {
                             if (DEBUG_WALLPAPER) {
@@ -1375,7 +1373,7 @@
                             }
                             mWallpaperTarget = oldW;
                         }
-                        
+
                         // Now set the upper and lower wallpaper targets
                         // correctly, and make sure that we are positioning
                         // the wallpaper below the lower.
@@ -1399,7 +1397,7 @@
                     }
                 }
             }
-            
+
         } else if (mLowerWallpaperTarget != null) {
             // Is it time to stop animating?
             boolean lowerAnimating = mLowerWallpaperTarget.mAnimation != null
@@ -1416,25 +1414,25 @@
                 mUpperWallpaperTarget = null;
             }
         }
-        
+
         boolean visible = foundW != null;
         if (visible) {
             // The window is visible to the compositor...  but is it visible
             // to the user?  That is what the wallpaper cares about.
             visible = isWallpaperVisible(foundW);
             if (DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper visibility: " + visible);
-            
+
             // If the wallpaper target is animating, we may need to copy
             // its layer adjustment.  Only do this if we are not transfering
             // between two wallpaper targets.
             mWallpaperAnimLayerAdjustment =
                     (mLowerWallpaperTarget == null && foundW.mAppToken != null)
                     ? foundW.mAppToken.animLayerAdjustment : 0;
-            
+
             final int maxLayer = mPolicy.getMaxWallpaperLayer()
                     * TYPE_LAYER_MULTIPLIER
                     + TYPE_LAYER_OFFSET;
-            
+
             // Now w is the window we are supposed to be behind...  but we
             // need to be sure to also be behind any of its attached windows,
             // AND any starting window associated with it, AND below the
@@ -1455,7 +1453,7 @@
         } else {
             if (DEBUG_WALLPAPER) Log.v(TAG, "No wallpaper target");
         }
-        
+
         if (foundW == null && topCurW != null) {
             // There is no wallpaper target, so it goes at the bottom.
             // We will assume it is the same place as last time, if known.
@@ -1466,7 +1464,7 @@
             // what is below it for later.
             foundW = foundI > 0 ? (WindowState)localmWindows.get(foundI-1) : null;
         }
-        
+
         if (visible) {
             if (mWallpaperTarget.mWallpaperX >= 0) {
                 mLastWallpaperX = mWallpaperTarget.mWallpaperX;
@@ -1477,7 +1475,7 @@
                 mLastWallpaperYStep = mWallpaperTarget.mWallpaperYStep;
             }
         }
-        
+
         // Start stepping backwards from here, ensuring that our wallpaper windows
         // are correctly placed.
         int curTokenIndex = mWallpaperTokens.size();
@@ -1491,16 +1489,16 @@
                 // correct size.
                 mLayoutNeeded = true;
             }
-            
+
             int curWallpaperIndex = token.windows.size();
             while (curWallpaperIndex > 0) {
                 curWallpaperIndex--;
                 WindowState wallpaper = token.windows.get(curWallpaperIndex);
-                
+
                 if (visible) {
                     updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
                 }
-                
+
                 // First, make sure the client has the current visibility
                 // state.
                 if (wallpaper.mWallpaperVisible != visible) {
@@ -1513,11 +1511,11 @@
                     } catch (RemoteException e) {
                     }
                 }
-                
+
                 wallpaper.mAnimLayer = wallpaper.mLayer + mWallpaperAnimLayerAdjustment;
                 if (DEBUG_LAYERS || DEBUG_WALLPAPER) Log.v(TAG, "Wallpaper win "
                         + wallpaper + " anim layer: " + wallpaper.mAnimLayer);
-                
+
                 // First, if this window is at the current index, then all
                 // is well.
                 if (wallpaper == foundW) {
@@ -1526,7 +1524,7 @@
                             ? (WindowState)localmWindows.get(foundI-1) : null;
                     continue;
                 }
-                
+
                 // The window didn't match...  the current wallpaper window,
                 // wherever it is, is in the wrong place, so make sure it is
                 // not in the list.
@@ -1539,17 +1537,17 @@
                         foundI--;
                     }
                 }
-                
+
                 // Now stick it in.
                 if (DEBUG_WALLPAPER || DEBUG_WINDOW_MOVEMENT) Log.v(TAG,
                         "Moving wallpaper " + wallpaper
                         + " from " + oldIndex + " to " + foundI);
-                
+
                 localmWindows.add(foundI, wallpaper);
                 changed |= ADJUST_WALLPAPER_LAYERS_CHANGED;
             }
         }
-        
+
         return changed;
     }
 
@@ -1591,7 +1589,7 @@
             wallpaperWin.mWallpaperXStep = wpxs;
             rawChanged = true;
         }
-        
+
         float wpy = mLastWallpaperY >= 0 ? mLastWallpaperY : 0.5f;
         float wpys = mLastWallpaperYStep >= 0 ? mLastWallpaperYStep : -1.0f;
         int availh = wallpaperWin.mFrame.bottom-wallpaperWin.mFrame.top-dh;
@@ -1607,7 +1605,7 @@
             wallpaperWin.mWallpaperYStep = wpys;
             rawChanged = true;
         }
-        
+
         if (rawChanged) {
             try {
                 if (DEBUG_WALLPAPER) Log.v(TAG, "Report new wp offset "
@@ -1644,10 +1642,10 @@
             } catch (RemoteException e) {
             }
         }
-        
+
         return changed;
     }
-    
+
     void wallpaperOffsetsComplete(IBinder window) {
         synchronized (mWindowMap) {
             if (mWaitingOnWallpaper != null &&
@@ -1657,13 +1655,13 @@
             }
         }
     }
-    
+
     boolean updateWallpaperOffsetLocked(WindowState changingTarget, boolean sync) {
         final int dw = mDisplay.getWidth();
         final int dh = mDisplay.getHeight();
-        
+
         boolean changed = false;
-        
+
         WindowState target = mWallpaperTarget;
         if (target != null) {
             if (target.mWallpaperX >= 0) {
@@ -1677,7 +1675,7 @@
                 mLastWallpaperY = changingTarget.mWallpaperY;
             }
         }
-        
+
         int curTokenIndex = mWallpaperTokens.size();
         while (curTokenIndex > 0) {
             curTokenIndex--;
@@ -1694,15 +1692,15 @@
                 }
             }
         }
-        
+
         return changed;
     }
-    
+
     void updateWallpaperVisibilityLocked() {
         final boolean visible = isWallpaperVisible(mWallpaperTarget);
         final int dw = mDisplay.getWidth();
         final int dh = mDisplay.getHeight();
-        
+
         int curTokenIndex = mWallpaperTokens.size();
         while (curTokenIndex > 0) {
             curTokenIndex--;
@@ -1713,7 +1711,7 @@
                 // correct size.
                 mLayoutNeeded = true;
             }
-            
+
             int curWallpaperIndex = token.windows.size();
             while (curWallpaperIndex > 0) {
                 curWallpaperIndex--;
@@ -1721,7 +1719,7 @@
                 if (visible) {
                     updateWallpaperOffsetLocked(wallpaper, dw, dh, false);
                 }
-                
+
                 if (wallpaper.mWallpaperVisible != visible) {
                     wallpaper.mWallpaperVisible = visible;
                     try {
@@ -1735,7 +1733,7 @@
             }
         }
     }
-    
+
     void sendPointerToWallpaperLocked(WindowState srcWin,
             MotionEvent pointer, long eventTime) {
         int curTokenIndex = mWallpaperTokens.size();
@@ -1773,7 +1771,7 @@
             }
         }
     }
-    
+
     public int addWindow(Session session, IWindow client,
             WindowManager.LayoutParams attrs, int viewVisibility,
             Rect outContentInsets) {
@@ -2080,7 +2078,7 @@
             e.fillInStackTrace();
             Log.w(TAG, "Removing window " + win, e);
         }
-        
+
         mPolicy.removeWindowLw(win);
         win.removeLocked();
 
@@ -2137,7 +2135,7 @@
         } else if ((win.mAttrs.flags&FLAG_SHOW_WALLPAPER) != 0) {
             adjustWallpaperWindowsLocked();
         }
-        
+
         if (!mInLayout) {
             assignLayersLocked();
             mLayoutNeeded = true;
@@ -2217,7 +2215,7 @@
             }
         }
     }
-    
+
     void wallpaperCommandComplete(IBinder window, Bundle result) {
         synchronized (mWindowMap) {
             if (mWaitingOnWallpaper != null &&
@@ -2227,7 +2225,7 @@
             }
         }
     }
-    
+
     public Bundle sendWindowWallpaperCommandLocked(WindowState window,
             String action, int x, int y, int z, Bundle extras, boolean sync) {
         if (window == mWallpaperTarget || window == mLowerWallpaperTarget
@@ -2250,15 +2248,15 @@
                     }
                 }
             }
-            
+
             if (doWait) {
                 // XXX Need to wait for result.
             }
         }
-        
+
         return null;
     }
-    
+
     public int relayoutWindow(Session session, IWindow client,
             WindowManager.LayoutParams attrs, int requestedWidth,
             int requestedHeight, int viewVisibility, boolean insetsPending,
@@ -2319,7 +2317,7 @@
 
             boolean wallpaperMayMove = win.mViewVisibility != viewVisibility
                     && (win.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
-            
+
             win.mRelayoutCalled = true;
             final int oldVisibility = win.mViewVisibility;
             win.mViewVisibility = viewVisibility;
@@ -2417,7 +2415,7 @@
                         }
                     }
                 }
-                
+
                 if (win.mSurface == null || (win.getAttrs().flags
                         & WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING) == 0
                         || win.mSurfacePendingDestroy) {
@@ -3014,7 +3012,7 @@
                 "updateOrientationFromAppTokens()")) {
             throw new SecurityException("Requires MANAGE_APP_TOKENS permission");
         }
-        
+
         Configuration config;
         long ident = Binder.clearCallingIdentity();
         config = updateOrientationFromAppTokensUnchecked(currentConfig,
@@ -3207,7 +3205,7 @@
             mNextAppTransitionExit = exitAnim;
         }
     }
-    
+
     public void executeAppTransition() {
         if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS,
                 "executeAppTransition()")) {
@@ -3375,7 +3373,7 @@
                     return;
                 }
             }
-            
+
             mStartingIconInTransition = true;
             wtoken.startingData = new StartingData(
                     pkg, theme, nonLocalizedLabel,
@@ -3543,14 +3541,14 @@
                     mOpeningApps.add(wtoken);
                     wtoken.startingDisplayed = false;
                     wtoken.startingMoved = false;
-                    
+
                     // If the token is currently hidden (should be the
                     // common case), then we need to set up to wait for
                     // its windows to be ready.
                     if (wtoken.hidden) {
                         wtoken.allDrawn = false;
                         wtoken.waitingToShow = true;
-    
+
                         if (wtoken.clientHidden) {
                             // In the case where we are making an app visible
                             // but holding off for a transition, we still need
@@ -3564,7 +3562,7 @@
                     }
                 } else {
                     mClosingApps.add(wtoken);
-                    
+
                     // If the token is currently visible (should be the
                     // common case), then set up to wait for it to be hidden.
                     if (!wtoken.hidden) {
@@ -4008,7 +4006,7 @@
                     }
                 }
             }
-            
+
             if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
                 moveAppWindowsLocked(tokens, mAppTokens.size());
             }
@@ -4041,7 +4039,7 @@
                     pos++;
                 }
             }
-            
+
             if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET) {
                 moveAppWindowsLocked(tokens, 0);
             }
@@ -4126,7 +4124,7 @@
             }
         }
     }
-    
+
     static float fixScale(float scale) {
         if (scale < 0) scale = 0;
         else if (scale > 20) scale = 20;
@@ -4745,7 +4743,7 @@
             orientation = Configuration.ORIENTATION_LANDSCAPE;
         }
         config.orientation = orientation;
-        
+
         DisplayMetrics dm = new DisplayMetrics();
         mDisplay.getMetrics(dm);
         CompatibilityInfo.updateCompatibleScreenFrame(dm, orientation, mCompatibleScreenFrame);
@@ -4780,7 +4778,7 @@
                     mScreenLayout = Configuration.SCREENLAYOUT_SIZE_LARGE;
                 } else {
                     mScreenLayout = Configuration.SCREENLAYOUT_SIZE_NORMAL;
-                    
+
                     // If this screen is wider than normal HVGA, or taller
                     // than FWVGA, then for old apps we want to run in size
                     // compatibility mode.
@@ -4788,7 +4786,7 @@
                         mScreenLayout |= Configuration.SCREENLAYOUT_COMPAT_NEEDED;
                     }
                 }
-                
+
                 // Is this a long screen?
                 if (((longSize*3)/5) >= (shortSize-1)) {
                     // Anything wider than WVGA (5:3) is considering to be long.
@@ -4799,7 +4797,7 @@
             }
         }
         config.screenLayout = mScreenLayout;
-        
+
         config.keyboardHidden = Configuration.KEYBOARDHIDDEN_NO;
         config.hardKeyboardHidden = Configuration.HARDKEYBOARDHIDDEN_NO;
         mPolicy.adjustConfigurationLw(config);
@@ -4879,7 +4877,7 @@
 
         Object targetObj = mKeyWaiter.waitForNextEventTarget(null, qev,
                 ev, true, false, pid, uid);
-        
+
         if (MEASURE_LATENCY) {
             lt.sample("3 Last dispatch finished ", System.nanoTime() - qev.whenNano);
         }
@@ -4933,7 +4931,7 @@
 
         final long eventTime = ev.getEventTime();
         final long eventTimeNano = ev.getEventTimeNano();
-        
+
         //Log.i(TAG, "Sending " + ev + " to " + target);
 
         if (uid != 0 && uid != target.mSession.mUid) {
@@ -4950,7 +4948,7 @@
                 return INJECT_NO_PERMISSION;
             }
         }
-        
+
         if (MEASURE_LATENCY) {
             lt.sample("4 in dispatchPointer     ", System.nanoTime() - eventTimeNano);
         }
@@ -5054,7 +5052,7 @@
                 ev.recycle();
                 return INJECT_SUCCEEDED;
             }
-            
+
             if (qev != null && action == MotionEvent.ACTION_MOVE) {
                 mKeyWaiter.bindTargetWindowLocked(target,
                         KeyWaiter.RETURN_PENDING_POINTER, qev);
@@ -5079,13 +5077,13 @@
                         mKeyWaiter.mOutsideTouchTargets = null;
                     }
                 }
-                
+
                 // If we are on top of the wallpaper, then the wallpaper also
                 // gets to see this movement.
                 if (mWallpaperTarget == target || mSendingPointersToWallpaper) {
                     sendPointerToWallpaperLocked(null, ev, eventTime);
                 }
-                
+
                 final Rect frame = target.mFrame;
                 ev.offsetLocation(-(float)frame.left, -(float)frame.top);
                 mKeyWaiter.bindTargetWindowLocked(target);
@@ -5098,7 +5096,7 @@
             if (DEBUG_INPUT || DEBUG_FOCUS || WindowManagerPolicy.WATCH_POINTER) {
                 Log.v(TAG, "Delivering pointer " + qev + " to " + target);
             }
-            
+
             if (MEASURE_LATENCY) {
                 lt.sample("6 before svr->client ipc ", System.nanoTime() - eventTimeNano);
             }
@@ -5219,7 +5217,7 @@
         if (event.getRepeatCount() > 0 && mQueue.hasKeyUpEvent(event)) {
             return INJECT_SUCCEEDED;
         }
-        
+
         WindowState focus = (WindowState)focusObj;
 
         if (DEBUG_INPUT) Log.v(
@@ -5704,7 +5702,7 @@
                 final int repeatCount = nextKey.getRepeatCount();
                 final boolean down = nextKey.getAction() != KeyEvent.ACTION_UP;
                 boolean dispatch = mKeyWaiter.checkShouldDispatchKey(keycode);
-                
+
                 if (!dispatch) {
                     if (callingUid == 0 ||
                             mContext.checkPermission(
@@ -5736,7 +5734,7 @@
                                 callingPid, callingUid)
                                 == PackageManager.PERMISSION_GRANTED) {
                     if (mPolicy.interceptKeyTi(focus,
-                            keycode, nextKey.getMetaState(), down, repeatCount, 
+                            keycode, nextKey.getMetaState(), down, repeatCount,
                             nextKey.getFlags())) {
                         return CONSUMED_EVENT_TOKEN;
                     }
@@ -5967,7 +5965,7 @@
             MotionEvent res = null;
             QueuedEvent qev = null;
             WindowState win = null;
-            
+
             synchronized (this) {
                 if (DEBUG_INPUT) Log.v(
                     TAG, "finishedKey: client=" + client.asBinder()
@@ -6011,7 +6009,7 @@
                         res.offsetLocation(-win.mFrame.left, -win.mFrame.top);
                     }
                 }
-                
+
                 if (res != null && returnWhat == RETURN_PENDING_POINTER) {
                     synchronized (mWindowMap) {
                         if (mWallpaperTarget == win || mSendingPointersToWallpaper) {
@@ -6020,7 +6018,7 @@
                     }
                 }
             }
-            
+
             return res;
         }
 
@@ -6703,11 +6701,11 @@
                 }
             }
         }
-        
+
         public void wallpaperOffsetsComplete(IBinder window) {
             WindowManagerService.this.wallpaperOffsetsComplete(window);
         }
-        
+
         public Bundle sendWallpaperCommand(IBinder window, String action, int x, int y,
                 int z, Bundle extras, boolean sync) {
             synchronized(mWindowMap) {
@@ -6721,11 +6719,11 @@
                 }
             }
         }
-        
+
         public void wallpaperCommandComplete(IBinder window, Bundle result) {
             WindowManagerService.this.wallpaperCommandComplete(window, result);
         }
-        
+
         void windowAddedLocked() {
             if (mSurfaceSession == null) {
                 if (localLOGV) Log.v(
@@ -6920,7 +6918,7 @@
         // Wallpaper windows: pixels offset based on above variables.
         int mXOffset;
         int mYOffset;
-        
+
         // This is set after IWindowSession.relayout() has been called at
         // least once for the window.  It allows us to detect the situation
         // where we don't yet have a surface, but should have one soon, so
@@ -7103,7 +7101,7 @@
 
             // Now make sure the window fits in the overall display.
             Gravity.applyDisplay(mAttrs.gravity, df, frame);
-            
+
             // Make sure the content and visible frames are inside of the
             // final window frame.
             if (content.left < frame.left) content.left = frame.left;
@@ -7131,7 +7129,7 @@
                 updateWallpaperOffsetLocked(this, mDisplay.getWidth(),
                         mDisplay.getHeight(), false);
             }
-            
+
             if (localLOGV) {
                 //if ("com.google.android.youtube".equals(mAttrs.packageName)
                 //        && mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_PANEL) {
@@ -7334,7 +7332,7 @@
                     WindowState c = (WindowState)mChildWindows.get(i);
                     c.mAttachedHidden = true;
                 }
-                
+
                 if (mReportDestroySurface) {
                     mReportDestroySurface = false;
                     mSurfacePendingDestroy = true;
@@ -7345,7 +7343,7 @@
                     } catch (RemoteException e) {
                     }
                 }
-                
+
                 try {
                     if (DEBUG_VISIBILITY) {
                         RuntimeException e = new RuntimeException();
@@ -7365,7 +7363,7 @@
                         + " surface " + mSurface + " session " + mSession
                         + ": " + e.toString());
                 }
-                
+
                 mSurface = null;
             }
         }
@@ -7443,7 +7441,7 @@
                 if (mAttrs.type != TYPE_APPLICATION_STARTING
                         && mAppToken != null) {
                     mAppToken.firstWindowDrawn = true;
-                    
+
                     if (mAppToken.startingData != null) {
                         if (DEBUG_STARTING_WINDOW || DEBUG_ANIM) Log.v(TAG,
                                 "Finish starting " + mToken
@@ -7633,7 +7631,7 @@
             Transformation appTransformation =
                     (mAppToken != null && mAppToken.hasTransformation)
                     ? mAppToken.transformation : null;
-            
+
             // Wallpapers are animated based on the "real" window they
             // are currently targeting.
             if (mAttrs.type == TYPE_WALLPAPER && mLowerWallpaperTarget == null
@@ -7656,7 +7654,7 @@
                     }
                 }
             }
-            
+
             if (selfTransformation || attachedTransformation != null
                     || appTransformation != null) {
                 // cache often used attributes locally
@@ -8191,19 +8189,19 @@
         // Set to true when this token is in a pending transaction where it
         // will be shown.
         boolean waitingToShow;
-        
+
         // Set to true when this token is in a pending transaction where it
         // will be hidden.
         boolean waitingToHide;
-        
+
         // Set to true when this token is in a pending transaction where its
         // windows will be put to the bottom of the list.
         boolean sendingToBottom;
-        
+
         // Set to true when this token is in a pending transaction where its
         // windows will be put to the top of the list.
         boolean sendingToTop;
-        
+
         WindowToken(IBinder _token, int type, boolean _explicit) {
             token = _token;
             windowType = type;
@@ -8534,7 +8532,7 @@
             }
             return null;
         }
-        
+
         void dump(PrintWriter pw, String prefix) {
             super.dump(pw, prefix);
             if (appToken != null) {
@@ -9050,7 +9048,7 @@
         int i;
         int lastWallpaper = -1;
         int numRemoved = 0;
-        
+
         // First remove all existing app windows.
         i=0;
         while (i < NW) {
@@ -9068,12 +9066,12 @@
             }
             i++;
         }
-        
+
         // The wallpaper window(s) typically live at the bottom of the stack,
         // so skip them before adding app tokens.
         lastWallpaper++;
         i = lastWallpaper;
-        
+
         // First add all of the exiting app tokens...  these are no longer
         // in the main app list, but still have windows shown.  We put them
         // in the back because now that the animation is over we no longer
@@ -9082,20 +9080,20 @@
         for (int j=0; j<NT; j++) {
             i = reAddAppWindowsLocked(i, mExitingAppTokens.get(j));
         }
-        
+
         // And add in the still active app tokens in Z order.
         NT = mAppTokens.size();
         for (int j=0; j<NT; j++) {
             i = reAddAppWindowsLocked(i, mAppTokens.get(j));
         }
-        
+
         i -= lastWallpaper;
         if (i != numRemoved) {
             Log.w(TAG, "Rebuild removed " + numRemoved
                     + " windows but added " + i);
         }
     }
-    
+
     private final void assignLayersLocked() {
         int N = mWindows.size();
         int curBaseLayer = 0;
@@ -9357,7 +9355,7 @@
                 mPolicy.beginAnimationLw(dw, dh);
 
                 final int N = mWindows.size();
-                
+
                 for (i=N-1; i>=0; i--) {
                     WindowState w = (WindowState)mWindows.get(i);
 
@@ -9373,7 +9371,7 @@
                                 wallpaperMayChange = true;
                             }
                         }
-                        
+
                         boolean wasAnimating = w.mAnimating;
                         if (w.stepAnimationLocked(currentTime, dw, dh)) {
                             animating = true;
@@ -9382,7 +9380,7 @@
                         if (wasAnimating && !w.mAnimating && mWallpaperTarget == w) {
                             wallpaperMayChange = true;
                         }
-                        
+
                         if (mPolicy.doesForceHide(w, attrs)) {
                             if (!wasAnimating && animating) {
                                 wallpaperForceHidingChanged = true;
@@ -9413,7 +9411,7 @@
                                 wallpaperMayChange = true;
                             }
                         }
-                        
+
                         mPolicy.animatingWindowLw(w, attrs);
                     }
 
@@ -9562,18 +9560,18 @@
                             }
                             mToTopApps.clear();
                         }
-                        
+
                         WindowState oldWallpaper = mWallpaperTarget;
-                        
+
                         adjustWallpaperWindowsLocked();
                         wallpaperMayChange = false;
-                        
+
                         // The top-most window will supply the layout params,
                         // and we will determine it below.
                         LayoutParams animLp = null;
                         AppWindowToken animToken = null;
                         int bestAnimLayer = -1;
-                        
+
                         if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
                                 "New wallpaper target=" + mWallpaperTarget
                                 + ", lower target=" + mLowerWallpaperTarget
@@ -9624,7 +9622,7 @@
                                 }
                             }
                         }
-                        
+
                         if (foundWallpapers == 3) {
                             if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
                                     "Wallpaper animation!");
@@ -9655,7 +9653,7 @@
                             if (DEBUG_APP_TRANSITIONS) Log.v(TAG,
                                     "New transit into wallpaper: " + transit);
                         }
-                        
+
                         if ((transit&WindowManagerPolicy.TRANSIT_ENTER_MASK) != 0) {
                             mLastEnterAnimToken = animToken;
                             mLastEnterAnimParams = animLp;
@@ -9664,7 +9662,7 @@
                             mLastEnterAnimToken = null;
                             mLastEnterAnimParams = null;
                         }
-                        
+
                         NN = mOpeningApps.size();
                         for (i=0; i<NN; i++) {
                             AppWindowToken wtoken = mOpeningApps.get(i);
@@ -9695,7 +9693,7 @@
                         }
 
                         mNextAppTransitionPackage = null;
-                        
+
                         mOpeningApps.clear();
                         mClosingApps.clear();
 
@@ -9712,7 +9710,7 @@
                         restart = true;
                     }
                 }
-                
+
                 if (!animating && mAppTransitionRunning) {
                     // We have finished the animation of an app transition.  To do
                     // this, we have delayed a lot of operations like showing and
@@ -9723,7 +9721,7 @@
                     mAppTransitionRunning = false;
                     // Clear information about apps that were moving.
                     mToBottomApps.clear();
-                    
+
                     rebuildAppWindowListLocked();
                     restart = true;
                     moveInputMethodWindowsIfNeededLocked(false);
@@ -9734,9 +9732,9 @@
                     // might have changed again.
                     focusMayChange = true;
                 }
-                
+
                 int adjResult = 0;
-                
+
                 if (wallpaperForceHidingChanged) {
                     // At this point, there was a window with a wallpaper that
                     // was force hiding other windows behind it, but now it
@@ -9771,13 +9769,13 @@
                         }
                     }
                 }
-                
+
                 if (wallpaperMayChange) {
                     if (DEBUG_WALLPAPER) Log.v(TAG,
                             "Wallpaper may change!  Adjusting");
                     adjResult = adjustWallpaperWindowsLocked();
                 }
-                
+
                 if ((adjResult&ADJUST_WALLPAPER_LAYERS_CHANGED) != 0) {
                     if (DEBUG_WALLPAPER) Log.v(TAG,
                             "Wallpaper layer changed: assigning layers + relayout");
@@ -9790,7 +9788,7 @@
                     restart = true;
                     mLayoutNeeded = true;
                 }
-                
+
                 if (focusMayChange) {
                     if (updateFocusedWindowLocked(UPDATE_FOCUS_PLACING_SURFACES)) {
                         restart = true;
@@ -9802,7 +9800,7 @@
                     restart = true;
                     performLayoutLockedInner();
                 }
-                
+
             } while (restart);
 
             // THIRD LOOP: Update the surfaces of all windows.
@@ -9817,7 +9815,7 @@
             boolean backgroundFillerShown = false;
 
             final int N = mWindows.size();
-            
+
             for (i=N-1; i>=0; i--) {
                 WindowState w = (WindowState)mWindows.get(i);
 
@@ -10067,7 +10065,7 @@
                 }
 
                 final boolean obscuredChanged = w.mObscured != obscured;
-                
+
                 // Update effect.
                 if (!(w.mObscured=obscured)) {
                     if (w.mSurface != null) {
@@ -10172,7 +10170,7 @@
                         }
                     }
                 }
-                
+
                 if (obscuredChanged && mWallpaperTarget == w) {
                     // This is the wallpaper target and its obscured state
                     // changed... make sure the current wallaper's visibility
@@ -10180,7 +10178,7 @@
                     updateWallpaperVisibilityLocked();
                 }
             }
-            
+
             if (backgroundFillerShown == false && mBackgroundFillerShown) {
                 mBackgroundFillerShown = false;
                 if (SHOW_TRANSACTIONS) Log.d(TAG, "hiding background filler");
@@ -10295,7 +10293,7 @@
         }
 
         boolean needRelayout = false;
-        
+
         if (!animating && mAppTransitionRunning) {
             // We have finished the animation of an app transition.  To do
             // this, we have delayed a lot of operations like showing and
@@ -10309,7 +10307,7 @@
             // Clear information about apps that were moving.
             mToBottomApps.clear();
         }
-        
+
         if (focusDisplayed) {
             mH.sendEmptyMessage(H.REPORT_LOSING_FOCUS);
         }
@@ -10339,7 +10337,7 @@
             Message m = mH.obtainMessage(H.HOLD_SCREEN_CHANGED, holdScreen);
             mH.sendMessage(m);
         }
-        
+
         if (mTurnOnScreen) {
             mPowerManager.userActivity(SystemClock.uptimeMillis(), false,
                     LocalPowerManager.BUTTON_EVENT, true);
@@ -10384,7 +10382,7 @@
     void reclaimSomeSurfaceMemoryLocked(WindowState win, String operation) {
         final Surface surface = win.mSurface;
 
-        EventLog.writeEvent(LOG_WM_NO_SURFACE_MEMORY, win.toString(),
+        EventLog.writeEvent(EventLogTags.WM_NO_SURFACE_MEMORY, win.toString(),
                 win.mSession.mPid, operation);
 
         if (mForceRemoves == null) {
@@ -10888,10 +10886,10 @@
     public void virtualKeyFeedback(KeyEvent event) {
         mPolicy.keyFeedbackFromInput(event);
     }
-    
+
     /**
      * DimAnimator class that controls the dim animation. This holds the surface and
-     * all state used for dim animation. 
+     * all state used for dim animation.
      */
     private static class DimAnimator {
         Surface mDimSurface;
@@ -10962,7 +10960,7 @@
                 mDimDeltaPerMs = (mDimTargetAlpha-mDimCurrentAlpha) / duration;
             }
         }
-            
+
         /**
          * Updating the surface's alpha. Returns true if the animation continues, or returns
          * false when the animation is finished and the dim surface is hidden.
@@ -10975,7 +10973,7 @@
                     mDimDeltaPerMs = (-mDimCurrentAlpha) / DEFAULT_DIM_DURATION;
                 }
             }
-            
+
             boolean animating = false;
             if (mLastDimAnimTime != 0) {
                 mDimCurrentAlpha += mDimDeltaPerMs
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index b8799f8..a67f714 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -152,44 +152,6 @@
     static final long MONITOR_CPU_MAX_TIME = 0x0fffffff;    // wait possibly forever for next cpu sample.
     static final boolean MONITOR_THREAD_CPU_USAGE = false;
 
-    // Event log tags
-    static final int LOG_CONFIGURATION_CHANGED = 2719;
-    static final int LOG_CPU = 2721;
-    static final int LOG_AM_FINISH_ACTIVITY = 30001;
-    static final int LOG_TASK_TO_FRONT = 30002;
-    static final int LOG_AM_NEW_INTENT = 30003;
-    static final int LOG_AM_CREATE_TASK = 30004;
-    static final int LOG_AM_CREATE_ACTIVITY = 30005;
-    static final int LOG_AM_RESTART_ACTIVITY = 30006;
-    static final int LOG_AM_RESUME_ACTIVITY = 30007;
-    static final int LOG_ANR = 30008;
-    static final int LOG_ACTIVITY_LAUNCH_TIME = 30009;
-    static final int LOG_AM_PROCESS_BOUND = 30010;
-    static final int LOG_AM_PROCESS_DIED = 30011;
-    static final int LOG_AM_FAILED_TO_PAUSE_ACTIVITY = 30012;
-    static final int LOG_AM_PAUSE_ACTIVITY = 30013;
-    static final int LOG_AM_PROCESS_START = 30014;
-    static final int LOG_AM_PROCESS_BAD = 30015;
-    static final int LOG_AM_PROCESS_GOOD = 30016;
-    static final int LOG_AM_LOW_MEMORY = 30017;
-    static final int LOG_AM_DESTROY_ACTIVITY = 30018;
-    static final int LOG_AM_RELAUNCH_RESUME_ACTIVITY = 30019;
-    static final int LOG_AM_RELAUNCH_ACTIVITY = 30020;
-    static final int LOG_AM_KILL_FOR_MEMORY = 30023;
-    static final int LOG_AM_BROADCAST_DISCARD_FILTER = 30024;
-    static final int LOG_AM_BROADCAST_DISCARD_APP = 30025;
-    static final int LOG_AM_CREATE_SERVICE = 30030;
-    static final int LOG_AM_DESTROY_SERVICE = 30031;
-    static final int LOG_AM_PROCESS_CRASHED_TOO_MUCH = 30032;
-    static final int LOG_AM_DROP_PROCESS = 30033;
-    static final int LOG_AM_SERVICE_CRASHED_TOO_MUCH = 30034;
-    static final int LOG_AM_SCHEDULE_SERVICE_RESTART = 30035;
-    static final int LOG_AM_PROVIDER_LOST_PROCESS = 30036;
-    static final int LOG_AM_PROCESS_START_TIMEOUT = 30037;
-    
-    static final int LOG_BOOT_PROGRESS_AMS_READY = 3040;
-    static final int LOG_BOOT_PROGRESS_ENABLE_SCREEN = 3050;
-
     // The flags that are set for all calls we make to the package manager.
     static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES;
     
@@ -1582,7 +1544,7 @@
                     int total = user + system + iowait + irq + softIrq + idle;
                     if (total == 0) total = 1;
 
-                    EventLog.writeEvent(LOG_CPU,
+                    EventLog.writeEvent(EventLogTags.CPU,
                             ((user+system+iowait+irq+softIrq) * 100) / total,
                             (user * 100) / total,
                             (system * 100) / total,
@@ -1793,7 +1755,7 @@
                     + " with results=" + results + " newIntents=" + newIntents
                     + " andResume=" + andResume);
             if (andResume) {
-                EventLog.writeEvent(LOG_AM_RESTART_ACTIVITY,
+                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
                         System.identityHashCode(r),
                         r.task.taskId, r.shortComponentName);
             }
@@ -1926,7 +1888,7 @@
             // if it had been bad.
             mProcessCrashTimes.remove(info.processName, info.uid);
             if (mBadProcesses.get(info.processName, info.uid) != null) {
-                EventLog.writeEvent(LOG_AM_PROCESS_GOOD, info.uid,
+                EventLog.writeEvent(EventLogTags.AM_PROC_GOOD, info.uid,
                         info.processName);
                 mBadProcesses.remove(info.processName, info.uid);
                 if (app != null) {
@@ -2019,7 +1981,7 @@
                 }
             }
             
-            EventLog.writeEvent(LOG_AM_PROCESS_START, pid, uid,
+            EventLog.writeEvent(EventLogTags.AM_PROC_START, pid, uid,
                     app.processName, hostingType,
                     hostingNameStr != null ? hostingNameStr : "");
             
@@ -2104,7 +2066,7 @@
         if (prev.app != null && prev.app.thread != null) {
             if (DEBUG_PAUSE) Log.v(TAG, "Enqueueing pending pause: " + prev);
             try {
-                EventLog.writeEvent(LOG_AM_PAUSE_ACTIVITY,
+                EventLog.writeEvent(EventLogTags.AM_PAUSE_ACTIVITY,
                         System.identityHashCode(prev),
                         prev.shortComponentName);
                 prev.app.thread.schedulePauseActivity(prev, prev.finishing, userLeaving,
@@ -2775,7 +2737,7 @@
                     next.app.thread.scheduleNewIntent(next.newIntents, next);
                 }
 
-                EventLog.writeEvent(LOG_AM_RESUME_ACTIVITY,
+                EventLog.writeEvent(EventLogTags.AM_RESUME_ACTIVITY,
                         System.identityHashCode(next),
                         next.task.taskId, next.shortComponentName);
                 
@@ -3436,7 +3398,7 @@
                                 // intent.
                                 top.task.setIntent(r.intent, r.info);
                             }
-                            logStartActivity(LOG_AM_NEW_INTENT, r, top.task);
+                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
                             deliverNewIntentLocked(top, r.intent);
                         } else {
                             // A special case: we need to
@@ -3458,7 +3420,7 @@
                         // desires.
                         if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                                 && taskTop.realActivity.equals(r.realActivity)) {
-                            logStartActivity(LOG_AM_NEW_INTENT, r, taskTop.task);
+                            logStartActivity(EventLogTags.AM_NEW_INTENT, r, taskTop.task);
                             if (taskTop.frontOfTask) {
                                 taskTop.task.setIntent(r.intent, r.info);
                             }
@@ -3518,7 +3480,7 @@
                         if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                             || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
                             || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
-                            logStartActivity(LOG_AM_NEW_INTENT, top, top.task);
+                            logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
                             // For paranoia, make sure we have correctly
                             // resumed the top activity.
                             if (doResume) {
@@ -3572,7 +3534,7 @@
                 HistoryRecord top = performClearTaskLocked(
                         sourceRecord.task.taskId, r, launchFlags, true);
                 if (top != null) {
-                    logStartActivity(LOG_AM_NEW_INTENT, r, top.task);
+                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
                     deliverNewIntentLocked(top, r.intent);
                     // For paranoia, make sure we have correctly
                     // resumed the top activity.
@@ -3589,7 +3551,7 @@
                 int where = findActivityInHistoryLocked(r, sourceRecord.task.taskId);
                 if (where >= 0) {
                     HistoryRecord top = moveActivityToFrontLocked(where);
-                    logStartActivity(LOG_AM_NEW_INTENT, r, top.task);
+                    logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
                     deliverNewIntentLocked(top, r.intent);
                     if (doResume) {
                         resumeTopActivityLocked(null);
@@ -3619,9 +3581,9 @@
                     + " in new guessed " + r.task);
         }
         if (newTask) {
-            EventLog.writeEvent(LOG_AM_CREATE_TASK, r.task.taskId);
+            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.task.taskId);
         }
-        logStartActivity(LOG_AM_CREATE_ACTIVITY, r, r.task);
+        logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
         startActivityLocked(r, newTask, doResume);
         return START_SUCCESS;
     }
@@ -3994,7 +3956,7 @@
         }
 
         r.finishing = true;
-        EventLog.writeEvent(LOG_AM_FINISH_ACTIVITY,
+        EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
                 System.identityHashCode(r),
                 r.task.taskId, r.shortComponentName, reason);
         r.task.numActivities--;
@@ -4339,7 +4301,7 @@
         if (DEBUG_SWITCH) Log.v(
             TAG, "Removing activity: token=" + r
               + ", app=" + (r.app != null ? r.app.processName : "(null)"));
-        EventLog.writeEvent(LOG_AM_DESTROY_ACTIVITY,
+        EventLog.writeEvent(EventLogTags.AM_DESTROY_ACTIVITY,
                 System.identityHashCode(r),
                 r.task.taskId, r.shortComponentName);
 
@@ -4556,7 +4518,7 @@
         if (app.thread != null && app.thread.asBinder() == thread.asBinder()) {
             Log.i(TAG, "Process " + app.processName + " (pid " + pid
                     + ") has died.");
-            EventLog.writeEvent(LOG_AM_PROCESS_DIED, app.pid, app.processName);
+            EventLog.writeEvent(EventLogTags.AM_PROC_DIED, app.pid, app.processName);
             if (localLOGV) Log.v(
                 TAG, "Dying app: " + app + ", pid: " + pid
                 + ", thread: " + thread.asBinder());
@@ -4580,7 +4542,7 @@
                 
                 if (!haveBg) {
                     Log.i(TAG, "Low Memory: No more background processes.");
-                    EventLog.writeEvent(LOG_AM_LOW_MEMORY, mLRUProcesses.size());
+                    EventLog.writeEvent(EventLogTags.AM_LOW_MEMORY, mLRUProcesses.size());
                     long now = SystemClock.uptimeMillis();
                     for (i=0; i<count; i++) {
                         ProcessRecord rec = mLRUProcesses.get(i);
@@ -4628,7 +4590,7 @@
         }
         
         // Log the ANR to the event log.
-        EventLog.writeEvent(LOG_ANR, app.pid, app.processName, annotation);
+        EventLog.writeEvent(EventLogTags.ANR, app.pid, app.processName, annotation);
         
         // If we are on a secure build and the application is not interesting to the user (it is
         // not visible or in the background), just kill it instead of displaying a dialog.
@@ -5200,7 +5162,7 @@
         
         if (gone) {
             Log.w(TAG, "Process " + app + " failed to attach");
-            EventLog.writeEvent(LOG_AM_PROCESS_START_TIMEOUT, pid, app.info.uid,
+            EventLog.writeEvent(EventLogTags.AM_PROCESS_START_TIMEOUT, pid, app.info.uid,
                     app.processName);
             mProcessNames.remove(app.processName, app.info.uid);
             // Take care of any launching providers waiting for this process.
@@ -5258,7 +5220,7 @@
         if (app == null) {
             Log.w(TAG, "No pending application record for pid " + pid
                     + " (IApplicationThread " + thread + "); dropping process");
-            EventLog.writeEvent(LOG_AM_DROP_PROCESS, pid);
+            EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);
             if (pid > 0 && pid != MY_PID) {
                 Process.killProcess(pid);
             } else {
@@ -5292,7 +5254,7 @@
             return false;
         }
 
-        EventLog.writeEvent(LOG_AM_PROCESS_BOUND, app.pid, app.processName);
+        EventLog.writeEvent(EventLogTags.AM_PROC_BOUND, app.pid, app.processName);
         
         app.thread = thread;
         app.curAdj = app.setAdj = -100;
@@ -5512,7 +5474,7 @@
     }
 
     void enableScreenAfterBoot() {
-        EventLog.writeEvent(LOG_BOOT_PROGRESS_ENABLE_SCREEN,
+        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
                 SystemClock.uptimeMillis());
         mWindowManager.enableScreenAfterBoot();
     }
@@ -5719,7 +5681,7 @@
                     r.state = ActivityState.PAUSED;
                     completePauseLocked();
                 } else {
-                	EventLog.writeEvent(LOG_AM_FAILED_TO_PAUSE_ACTIVITY,
+                	EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE,
                 	        System.identityHashCode(r), r.shortComponentName, 
                 			mPausingActivity != null
                 			    ? mPausingActivity.shortComponentName : "(none)");
@@ -7121,7 +7083,7 @@
         }
 
         finishTaskMove(task);
-        EventLog.writeEvent(LOG_TASK_TO_FRONT, task);
+        EventLog.writeEvent(EventLogTags.AM_TASK_TO_FRONT, task);
     }
 
     private final void finishTaskMove(int task) {
@@ -7718,7 +7680,7 @@
                             + cpi.applicationInfo.packageName + "/"
                             + cpi.applicationInfo.uid + " for provider "
                             + name + ": launching app became null");
-                    EventLog.writeEvent(LOG_AM_PROVIDER_LOST_PROCESS,
+                    EventLog.writeEvent(EventLogTags.AM_PROVIDER_LOST_PROCESS,
                             cpi.applicationInfo.packageName,
                             cpi.applicationInfo.uid, name);
                     return null;
@@ -8231,7 +8193,7 @@
                 if (adj >= worstType) {
                     Log.w(TAG, "Killing for memory: " + proc + " (adj "
                             + adj + ")");
-                    EventLog.writeEvent(LOG_AM_KILL_FOR_MEMORY, proc.pid,
+                    EventLog.writeEvent(EventLogTags.AM_KILL_FOR_MEMORY, proc.pid,
                             proc.processName, adj);
                     killed = true;
                     Process.killProcess(pids[i]);
@@ -8501,7 +8463,7 @@
         }
         
         Log.i(TAG, "System now ready");
-        EventLog.writeEvent(LOG_BOOT_PROGRESS_AMS_READY,
+        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_AMS_READY,
             SystemClock.uptimeMillis());
 
         synchronized(this) {
@@ -8733,7 +8695,7 @@
             // This process loses!
             Log.w(TAG, "Process " + app.info.processName
                     + " has crashed too many times: killing!");
-            EventLog.writeEvent(LOG_AM_PROCESS_CRASHED_TOO_MUCH,
+            EventLog.writeEvent(EventLogTags.AM_PROCESS_CRASHED_TOO_MUCH,
                     app.info.processName, app.info.uid);
             killServicesLocked(app, false);
             for (int i=mHistory.size()-1; i>=0; i--) {
@@ -8750,7 +8712,7 @@
                 // explicitly does so...  but for persistent process, we really
                 // need to keep it running.  If a persistent process is actually
                 // repeatedly crashing, then badness for everyone.
-                EventLog.writeEvent(LOG_AM_PROCESS_BAD, app.info.uid,
+                EventLog.writeEvent(EventLogTags.AM_PROC_BAD, app.info.uid,
                         app.info.processName);
                 mBadProcesses.put(app.info.processName, app.info.uid, now);
                 app.bad = true;
@@ -9824,7 +9786,7 @@
                 if (sr.crashCount >= 2) {
                     Log.w(TAG, "Service crashed " + sr.crashCount
                             + " times, stopping: " + sr);
-                    EventLog.writeEvent(LOG_AM_SERVICE_CRASHED_TOO_MUCH,
+                    EventLog.writeEvent(EventLogTags.AM_SERVICE_CRASHED_TOO_MUCH,
                             sr.crashCount, sr.shortName, app.pid);
                     bringDownServiceLocked(sr, true);
                 } else if (!allowRestart) {
@@ -10434,7 +10396,7 @@
                     + r.name + " " + r.intent);
             mStringBuilder.setLength(0);
             r.intent.getIntent().toShortString(mStringBuilder, false, true);
-            EventLog.writeEvent(LOG_AM_CREATE_SERVICE,
+            EventLog.writeEvent(EventLogTags.AM_CREATE_SERVICE,
                     System.identityHashCode(r), r.shortName,
                     mStringBuilder.toString(), r.app.pid);
             synchronized (r.stats.getBatteryStats()) {
@@ -10552,7 +10514,7 @@
         r.nextRestartTime = SystemClock.uptimeMillis() + r.restartDelay;
         Log.w(TAG, "Scheduling restart of crashed service "
                 + r.shortName + " in " + r.restartDelay + "ms");
-        EventLog.writeEvent(LOG_AM_SCHEDULE_SERVICE_RESTART,
+        EventLog.writeEvent(EventLogTags.AM_SCHEDULE_SERVICE_RESTART,
                 r.shortName, r.restartDelay);
 
         Message msg = Message.obtain();
@@ -10697,7 +10659,7 @@
 
         if (DEBUG_SERVICE) Log.v(TAG, "Bringing down service " + r.name
                  + " " + r.intent);
-        EventLog.writeEvent(LOG_AM_DESTROY_SERVICE,
+        EventLog.writeEvent(EventLogTags.AM_DESTROY_SERVICE,
                 System.identityHashCode(r), r.shortName,
                 (r.app != null) ? r.app.pid : -1);
 
@@ -12148,13 +12110,13 @@
             Object curReceiver = r.receivers.get(r.nextReceiver-1);
             if (curReceiver instanceof BroadcastFilter) {
                 BroadcastFilter bf = (BroadcastFilter) curReceiver;
-                EventLog.writeEvent(LOG_AM_BROADCAST_DISCARD_FILTER,
+                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_FILTER,
                         System.identityHashCode(r),
                         r.intent.getAction(),
                         r.nextReceiver - 1,
                         System.identityHashCode(bf));
             } else {
-                EventLog.writeEvent(LOG_AM_BROADCAST_DISCARD_APP,
+                EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
                         System.identityHashCode(r),
                         r.intent.getAction(),
                         r.nextReceiver - 1,
@@ -12163,7 +12125,7 @@
         } else {
             Log.w(TAG, "Discarding broadcast before first receiver is invoked: "
                     + r);
-            EventLog.writeEvent(LOG_AM_BROADCAST_DISCARD_APP,
+            EventLog.writeEvent(EventLogTags.AM_BROADCAST_DISCARD_APP,
                     System.identityHashCode(r),
                     r.intent.getAction(),
                     r.nextReceiver,
@@ -12833,7 +12795,7 @@
                     Log.i(TAG, "Updating configuration to: " + values);
                 }
                 
-                EventLog.writeEvent(LOG_CONFIGURATION_CHANGED, changes);
+                EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes);
 
                 if (values.locale != null) {
                     saveLocaleLocked(values.locale, 
@@ -12911,8 +12873,8 @@
         if (DEBUG_SWITCH) Log.v(TAG, "Relaunching: " + r
                 + " with results=" + results + " newIntents=" + newIntents
                 + " andResume=" + andResume);
-        EventLog.writeEvent(andResume ? LOG_AM_RELAUNCH_RESUME_ACTIVITY
-                : LOG_AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
+        EventLog.writeEvent(andResume ? EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY
+                : EventLogTags.AM_RELAUNCH_ACTIVITY, System.identityHashCode(r),
                 r.task.taskId, r.shortComponentName);
         
         r.startFreezingScreenLocked(r.app, 0);
diff --git a/services/java/com/android/server/am/EventLogTags.logtags b/services/java/com/android/server/am/EventLogTags.logtags
new file mode 100644
index 0000000..7e4ea35
--- /dev/null
+++ b/services/java/com/android/server/am/EventLogTags.logtags
@@ -0,0 +1,82 @@
+# See system/core/logcat/event.logtags for a description of the format of this file.
+
+option java_package com.android.server.am
+
+2719 configuration_changed (config mask|1|5)
+2721 cpu (total|1|6),(user|1|6),(system|1|6),(iowait|1|6),(irq|1|6),(softirq|1|6)
+
+# ActivityManagerService.systemReady() starts:
+3040 boot_progress_ams_ready (time|2|3)
+# ActivityManagerService calls enableScreenAfterBoot():
+3050 boot_progress_enable_screen (time|2|3)
+
+# Do not change these names without updating the checkin_events setting in
+# google3/googledata/wireless/android/provisioning/gservices.config !!
+#
+# An activity is being finished:
+30001 am_finish_activity (Token|1|5),(Task ID|1|5),(Component Name|3),(Reason|3)
+# A task is being brought to the front of the screen:
+30002 am_task_to_front (Task|1|5)
+# An existing activity is being given a new intent:
+30003 am_new_intent (Token|1|5),(Task ID|1|5),(Component Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5)
+# A new task is being created:
+30004 am_create_task (Task ID|1|5)
+# A new activity is being created in an existing task:
+30005 am_create_activity (Token|1|5),(Task ID|1|5),(Component Name|3),(Action|3),(MIME Type|3),(URI|3),(Flags|1|5)
+# An activity has been resumed into the foreground but was not already running:
+30006 am_restart_activity (Token|1|5),(Task ID|1|5),(Component Name|3)
+# An activity has been resumed and is now in the foreground:
+30007 am_resume_activity (Token|1|5),(Task ID|1|5),(Component Name|3)
+# Application Not Responding
+30008 anr (pid|1|5),(Package Name|3),(reason|3)
+# Activity launch time
+30009 activity_launch_time (Token|1|5),(Component Name|3),(time|2|3)
+# Application process bound to work
+30010 am_proc_bound (PID|1|5),(Process Name|3)
+# Application process died
+30011 am_proc_died (PID|1|5),(Process Name|3)
+# The Activity Manager failed to pause the given activity.
+30012 am_failed_to_pause (Token|1|5),(Wanting to pause|3),(Currently pausing|3)
+# Attempting to pause the current activity
+30013 am_pause_activity (Token|1|5),(Component Name|3)
+# Application process has been started
+30014 am_proc_start (PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)
+# An application process has been marked as bad
+30015 am_proc_bad (UID|1|5),(Process Name|3)
+# An application process that was bad is now marked as good
+30016 am_proc_good (UID|1|5),(Process Name|3)
+# Reporting to applications that memory is low
+30017 am_low_memory (Num Processes|1|1)
+# An activity is being destroyed:
+30018 am_destroy_activity (Token|1|5),(Task ID|1|5),(Component Name|3)
+# An activity has been relaunched, resumed, and is now in the foreground:
+30019 am_relaunch_resume_activity (Token|1|5),(Task ID|1|5),(Component Name|3)
+# An activity has been relaunched:
+30020 am_relaunch_activity (Token|1|5),(Task ID|1|5),(Component Name|3)
+# The activity's onPause has been called.
+30021 am_on_paused_called (Component Name|3)
+# The activity's onResume has been called.
+30022 am_on_resume_called (Component Name|3)
+# Kill a process to reclaim memory.
+30023 am_kill_for_memory (PID|1|5),(Process Name|3),(OomAdj|1|5)
+# Discard an undelivered serialized broadcast (timeout/ANR/crash)
+30024 am_broadcast_discard_filter (Broadcast|1|5),(Action|3),(Receiver Number|1|1),(BroadcastFilter|1|5)
+30025 am_broadcast_discard_app (Broadcast|1|5),(Action|3),(Receiver Number|1|1),(App|3)
+# A service is being created
+30030 am_create_service (Service Record|1|5),(Name|3),(Intent|3),(PID|1|5)
+# A service is being destroyed
+30031 am_destroy_service (Service Record|1|5),(Name|3),(PID|1|5)
+# A process has crashed too many times, it is being cleared
+30032 am_process_crashed_too_much (Name|3),(PID|1|5)
+# An unknown process is trying to attach to the activity manager
+30033 am_drop_process (PID|1|5)
+# A service has crashed too many times, it is being stopped
+30034 am_service_crashed_too_much (Crash Count|1|1),(Component Name|3),(PID|1|5)
+# A service is going to be restarted after its process went away
+30035 am_schedule_service_restart (Component Name|3),(Time|2|3)
+# A client was waiting for a content provider, but its process was lost
+30036 am_provider_lost_process (Package Name|3),(UID|1|5),(Name|3)
+# The activity manager gave up on a new process taking too long to start
+30037 am_process_start_timeout (PID|1|5),(UID|1|5),(Process Name|3)
+
+
diff --git a/services/java/com/android/server/am/HistoryRecord.java b/services/java/com/android/server/am/HistoryRecord.java
index 84ded22..0b34f7c 100644
--- a/services/java/com/android/server/am/HistoryRecord.java
+++ b/services/java/com/android/server/am/HistoryRecord.java
@@ -373,7 +373,7 @@
                 final long totalTime = service.mInitialStartTime != 0
                         ? (curTime - service.mInitialStartTime) : thisTime;
                 if (ActivityManagerService.SHOW_ACTIVITY_START_TIME) {
-                    EventLog.writeEvent(ActivityManagerService.LOG_ACTIVITY_LAUNCH_TIME,
+                    EventLog.writeEvent(EventLogTags.ACTIVITY_LAUNCH_TIME,
                             System.identityHashCode(this), shortComponentName,
                             thisTime, totalTime);
                     StringBuilder sb = service.mStringBuilder;
diff --git a/services/java/com/android/server/am/UsageStatsService.java b/services/java/com/android/server/am/UsageStatsService.java
index 373b44e..f99ca96 100644
--- a/services/java/com/android/server/am/UsageStatsService.java
+++ b/services/java/com/android/server/am/UsageStatsService.java
@@ -380,11 +380,15 @@
             // Get the most recent file
             mFileLeaf = getCurrentDateStr(FILE_PREFIX);
             // Copy current file to back up
-            File backupFile =  new File(mFile.getPath() + ".bak");
-            if (!mFile.renameTo(backupFile)) {
-                Log.w(TAG, "Failed to persist new stats");
-                return;
+            File backupFile = null;
+            if (mFile != null && mFile.exists()) {
+                backupFile = new File(mFile.getPath() + ".bak");
+                if (!mFile.renameTo(backupFile)) {
+                    Log.w(TAG, "Failed to persist new stats");
+                    return;
+                }
             }
+
             try {
                 // Write mStats to file
                 writeStatsFLOCK();
@@ -468,16 +472,10 @@
             
             final boolean samePackage = pkgName.equals(mLastResumedPkg);
             if (mIsResumed) {
-                if (samePackage) {
-                    Log.w(TAG, "Something wrong here, didn't expect "
-                            + pkgName + " to be resumed");
-                    return;
-                }
-                
                 if (mLastResumedPkg != null) {
                     // We last resumed some other package...  just pause it now
                     // to recover.
-                    Log.w(TAG, "Unexpected resume of " + pkgName
+                    Log.i(TAG, "Unexpected resume of " + pkgName
                             + " while already resumed in " + mLastResumedPkg);
                     PkgUsageStatsExtended pus = mStats.get(mLastResumedPkg);
                     if (pus != null) {
@@ -516,7 +514,7 @@
                 return;
             }
             if (!mIsResumed) {
-                Log.w(TAG, "Something wrong here, didn't expect "
+                Log.i(TAG, "Something wrong here, didn't expect "
                         + pkgName + " to be paused");
                 return;
             }
@@ -527,7 +525,7 @@
             PkgUsageStatsExtended pus = mStats.get(pkgName);
             if (pus == null) {
                 // Weird some error here
-                Log.w(TAG, "No package stats for pkg:"+pkgName);
+                Log.i(TAG, "No package stats for pkg:"+pkgName);
                 return;
             }
             pus.updatePause();
diff --git a/services/java/com/android/server/status/StatusBarPolicy.java b/services/java/com/android/server/status/StatusBarPolicy.java
index 2b9d18f..bee0930 100644
--- a/services/java/com/android/server/status/StatusBarPolicy.java
+++ b/services/java/com/android/server/status/StatusBarPolicy.java
@@ -283,7 +283,7 @@
     private IBinder mBluetoothIcon;
     private IconData mBluetoothData;
     private int mBluetoothHeadsetState;
-    private int mBluetoothA2dpState;
+    private boolean mBluetoothA2dpConnected;
     private int mBluetoothPbapState;
     private boolean mBluetoothEnabled;
 
@@ -455,7 +455,7 @@
         } else {
             mBluetoothEnabled = false;
         }
-        mBluetoothA2dpState = BluetoothA2dp.STATE_DISCONNECTED;
+        mBluetoothA2dpConnected = false;
         mBluetoothHeadsetState = BluetoothHeadset.STATE_DISCONNECTED;
         mBluetoothPbapState = BluetoothPbap.STATE_DISCONNECTED;
         mService.setIconVisibility(mBluetoothIcon, mBluetoothEnabled);
@@ -636,12 +636,12 @@
         int flags =  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                 | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                 | WindowManager.LayoutParams.FLAG_DIM_BEHIND;
-        
+
         if (!mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_sf_slowBlur)) {
             flags |= WindowManager.LayoutParams.FLAG_BLUR_BEHIND;
         }
-        
+
         WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
                 ViewGroup.LayoutParams.WRAP_CONTENT,
                 ViewGroup.LayoutParams.WRAP_CONTENT,
@@ -1083,7 +1083,6 @@
 
     private final void updateBluetooth(Intent intent) {
         int iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth;
-
         String action = intent.getAction();
         if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
             int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
@@ -1092,8 +1091,12 @@
             mBluetoothHeadsetState = intent.getIntExtra(BluetoothHeadset.EXTRA_STATE,
                     BluetoothHeadset.STATE_ERROR);
         } else if (action.equals(BluetoothA2dp.ACTION_SINK_STATE_CHANGED)) {
-            mBluetoothA2dpState = intent.getIntExtra(BluetoothA2dp.EXTRA_SINK_STATE,
-                    BluetoothA2dp.STATE_DISCONNECTED);
+            BluetoothA2dp a2dp = new BluetoothA2dp(mContext);
+            if (a2dp.getConnectedSinks().size() != 0) {
+                mBluetoothA2dpConnected = true;
+            } else {
+                mBluetoothA2dpConnected = false;
+            }
         } else if (action.equals(BluetoothPbap.PBAP_STATE_CHANGED_ACTION)) {
             mBluetoothPbapState = intent.getIntExtra(BluetoothPbap.PBAP_STATE,
                     BluetoothPbap.STATE_DISCONNECTED);
@@ -1101,9 +1104,7 @@
             return;
         }
 
-        if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED ||
-                mBluetoothA2dpState == BluetoothA2dp.STATE_CONNECTED ||
-                mBluetoothA2dpState == BluetoothA2dp.STATE_PLAYING ||
+        if (mBluetoothHeadsetState == BluetoothHeadset.STATE_CONNECTED || mBluetoothA2dpConnected ||
                 mBluetoothPbapState == BluetoothPbap.STATE_CONNECTED) {
             iconId = com.android.internal.R.drawable.stat_sys_data_bluetooth_connected;
         }
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
index e48a57b..6f6f55d 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchManagerTest.java
@@ -21,10 +21,10 @@
 import android.app.Activity;
 import android.app.ISearchManager;
 import android.app.SearchManager;
+import android.app.SearchableInfo;
 import android.content.ComponentName;
 import android.content.Context;
 import android.os.ServiceManager;
-import android.server.search.SearchableInfo;
 import android.test.ActivityInstrumentationTestCase2;
 import android.test.suitebuilder.annotation.LargeTest;
 import android.test.suitebuilder.annotation.MediumTest;
diff --git a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
index 4e5f7a9..972559d 100644
--- a/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
+++ b/tests/AndroidTests/src/com/android/unit_tests/SearchablesTest.java
@@ -17,6 +17,8 @@
 package com.android.unit_tests;
 
 import android.app.SearchManager;
+import android.app.SearchableInfo;
+import android.app.SearchableInfo.ActionKeyInfo;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -28,9 +30,7 @@
 import android.content.res.Resources;
 import android.content.res.XmlResourceParser;
 import android.os.RemoteException;
-import android.server.search.SearchableInfo;
 import android.server.search.Searchables;
-import android.server.search.SearchableInfo.ActionKeyInfo;
 import android.test.AndroidTestCase;
 import android.test.MoreAsserts;
 import android.test.mock.MockContext;
